VideoRecorder
VideoRecorder copied to clipboard
请问怎么设置帧率啊?
我用 https://github.com/sourab-sharma/TouchToRecord 这个项目,无论怎么设置都 frameRate 是8-10帧,然后用你这个是14帧。。。 请问怎么设置帧率啊?
不是设置的问题,帧率设置在RecorderParameters类中videoFrameRate字段。因为会丢帧,所以实际比设置的要低,我也没有找到原因。
默认是30,但是我发现在NewFFmpegFrameRecorder.java里设置setFramerate(300);后,在使用framerate时getFrameRate()还是等于30;是不是在c语言里把帧率给写死了?你有c语言部分的代码吗?
不是在C语言里,修改这个RecorderParameters类中videoFrameRate字段。
FFmpegRecorderActivity.java里面会重新设置,NewFFmpegFrameRecorder.java这里设置是没有用的。
我修改过RecorderParameters类中videoFrameRate字段。30/120都无效。。。
你通过什么来看视频帧率的呢
因为我手机的getSupportedPreviewFpsRange是 1000----120 × 1000,所以尝试设置120. 通过目测和查看视频属性。(我linux系统可以查看帧率)
刚在调试的时候偶尔发现一个21帧的视频,其他都是12左右。如果用android提供的那个录像的话,帧率是30左右。我觉得可能是javacv的原因吧,请问你有C语言部分的代码吗?
opencv源代码网上有
好的,谢谢!
不客气,如果有进展可以联系我哦。
恩,一定!
2014-04-14 16:18 GMT+08:00 钱冬 [email protected]:
不客气,如果有进展可以联系我哦。
— Reply to this email directly or view it on GitHubhttps://github.com/qdrzwd/VideoRecorder/issues/2#issuecomment-40342670 .
看到了。。谢谢提醒!
2014-04-14 16:20 GMT+08:00 钱冬 [email protected]:
我觉得主要原因还是在丢帧问题上,NewFFmpegFrameRecorder在750多行的时候,会丢帧 if ((ret = avcodec_encode_video2(video_c, video_pkt, image == null ? null : picture, got_video_packet)) < 0) { throw new Exception("avcodec_encode_video2() error " + ret + ": Could not encode video packet."); }
— Reply to this email directly or view it on GitHubhttps://github.com/qdrzwd/VideoRecorder/issues/2#issuecomment-40342826 .
这个和JavaCV无关,Camera和GC的问题。
一直只有4帧 提不上来!是硬件问题吗?
这是我的想法:
丢帧的问题好像是:onPreviewFrame(byte[] data, Camera camera)和recorder.record(yuvIplimage);两个函数造成的。 比如帧数设为30 那么1秒中调用onPreviewFrame大约30次,但是recorder.record消耗的时间要大于1/30s 所以造成的丢帧。 解决方法:不要再onPreviewFrame函数内执行recorder.record,而是每次把得到的数据存入到一个队列中。然后新建一个线程在这个线程中从队列取出数据并调用recorder.record。执行recorder.record之前别忘了设置时间戳recorder.setTimestamp(t);。
^这个可行,但是数据太多了,没有那么多内存的。
内存没问题的,一边camera生成数据,一边recorder写入到文件。 短视频没问题,长视频没测试。
是的,2年前我写Vine的时候就是用的这个方法,现在不推荐了,用HW要快10倍的样子,就不会有这个问题了。Camera直接到MediaCodec。
HW是什么? 你是vine的开发者?cool!!
用硬件编码(chip上专门有编码h264的dsp零件)。 软件(SW)就是在CPU上运行的算法。
谢谢你的建议,看了MediaCodec果然方便很多。 可否透露一下vine用FFmpeg是用什么方法提高速度的?
我们用ffmpeg的时候也不够快,最慢的设备30fps * 6秒 480p刚好100mb的样子,所以没问题。有的可以做的:http://edisonwang.com/blog/camera-memory-part-1 http://edisonwang.com/blog/allocating-memory-faster-on-android-part-2 这样就可以30fps了。这些都是2013年写的了,很多更多的优化没有在里面,不过我们也要换成用mediacodec了。
谢谢你的建议,有个问题还需要请教一下: 你的博客里讲的怎么优化内存,我测试的时候遇到一个问题,ffmpeg的record(yuvIplimage)函数(这个函数我的理解是对原始帧进行编码,然后写入到文件)耗时非常大(我的手机是调用一次200ms左右)。如果录制一个10s的30帧视频,大约需要200ms_30_10=60s=6min,需要6分钟出现了巨大的延迟,这个问题该怎么解决?还是我理解的record(yuvIplimage)出现错误?
^try mp4 instead of h264.
@amazingyyc @edisonw 请问如何压缩.so文件的大小呢?我使用GitHub上JavaCV中提供的库,光libavcodec.so就有8M了,太大了。
我也不知道, 换硬件编码吧😋😋
so不能压缩~只能精简~改编译配置或者删代码~(雾
@dphdjy @amazingyyc 谢谢回复,硬件编码要4.2+,我的app要从4.0+开始支持,看来没别的办法了,呵呵。二位有没有其他比较好的方案来做视频录制的呢?
@dphdjy 可有精简配置参考?我看到有些人用的libavcodec只有2M多
我现在的方法是,得到数据后先不编码,先将原始的图片数据和音频数据,存储到文件中。最后再统一编码。
别的方法:利用mediarecorder录制mp4视频,然后再拼接。