VideoRecorder icon indicating copy to clipboard operation
VideoRecorder copied to clipboard

请问怎么设置帧率啊?

Open oldfeel opened this issue 10 years ago • 37 comments

我用 https://github.com/sourab-sharma/TouchToRecord 这个项目,无论怎么设置都 frameRate 是8-10帧,然后用你这个是14帧。。。 请问怎么设置帧率啊?

oldfeel avatar Apr 14 '14 04:04 oldfeel

不是设置的问题,帧率设置在RecorderParameters类中videoFrameRate字段。因为会丢帧,所以实际比设置的要低,我也没有找到原因。

qdrzwd avatar Apr 14 '14 06:04 qdrzwd

默认是30,但是我发现在NewFFmpegFrameRecorder.java里设置setFramerate(300);后,在使用framerate时getFrameRate()还是等于30;是不是在c语言里把帧率给写死了?你有c语言部分的代码吗?

oldfeel avatar Apr 14 '14 06:04 oldfeel

不是在C语言里,修改这个RecorderParameters类中videoFrameRate字段。

qdrzwd avatar Apr 14 '14 07:04 qdrzwd

FFmpegRecorderActivity.java里面会重新设置,NewFFmpegFrameRecorder.java这里设置是没有用的。

qdrzwd avatar Apr 14 '14 07:04 qdrzwd

我修改过RecorderParameters类中videoFrameRate字段。30/120都无效。。。

oldfeel avatar Apr 14 '14 07:04 oldfeel

你通过什么来看视频帧率的呢

qdrzwd avatar Apr 14 '14 07:04 qdrzwd

因为我手机的getSupportedPreviewFpsRange是 1000----120 × 1000,所以尝试设置120. 通过目测和查看视频属性。(我linux系统可以查看帧率)

oldfeel avatar Apr 14 '14 07:04 oldfeel

刚在调试的时候偶尔发现一个21帧的视频,其他都是12左右。如果用android提供的那个录像的话,帧率是30左右。我觉得可能是javacv的原因吧,请问你有C语言部分的代码吗?

oldfeel avatar Apr 14 '14 08:04 oldfeel

opencv源代码网上有

qdrzwd avatar Apr 14 '14 08:04 qdrzwd

好的,谢谢!

oldfeel avatar Apr 14 '14 08:04 oldfeel

不客气,如果有进展可以联系我哦。

qdrzwd avatar Apr 14 '14 08:04 qdrzwd

恩,一定!

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 .

oldfeel avatar Apr 14 '14 08:04 oldfeel

看到了。。谢谢提醒!

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 .

oldfeel avatar Apr 14 '14 08:04 oldfeel

这个和JavaCV无关,Camera和GC的问题。

edisonw avatar Aug 06 '14 21:08 edisonw

一直只有4帧 提不上来!是硬件问题吗?

GitaiQAQ avatar Oct 19 '14 06:10 GitaiQAQ

这是我的想法:

丢帧的问题好像是: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);。

amazingyyc avatar Jun 16 '15 03:06 amazingyyc

^这个可行,但是数据太多了,没有那么多内存的。

edisonw avatar Jun 16 '15 14:06 edisonw

内存没问题的,一边camera生成数据,一边recorder写入到文件。 短视频没问题,长视频没测试。

amazingyyc avatar Jun 17 '15 00:06 amazingyyc

是的,2年前我写Vine的时候就是用的这个方法,现在不推荐了,用HW要快10倍的样子,就不会有这个问题了。Camera直接到MediaCodec。

edisonw avatar Jun 17 '15 21:06 edisonw

HW是什么? 你是vine的开发者?cool!!

amazingyyc avatar Jun 18 '15 00:06 amazingyyc

用硬件编码(chip上专门有编码h264的dsp零件)。 软件(SW)就是在CPU上运行的算法。

edisonw avatar Jun 18 '15 15:06 edisonw

谢谢你的建议,看了MediaCodec果然方便很多。 可否透露一下vine用FFmpeg是用什么方法提高速度的?

amazingyyc avatar Jun 19 '15 01:06 amazingyyc

我们用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了。

edisonw avatar Jun 19 '15 22:06 edisonw

谢谢你的建议,有个问题还需要请教一下: 你的博客里讲的怎么优化内存,我测试的时候遇到一个问题,ffmpeg的record(yuvIplimage)函数(这个函数我的理解是对原始帧进行编码,然后写入到文件)耗时非常大(我的手机是调用一次200ms左右)。如果录制一个10s的30帧视频,大约需要200ms_30_10=60s=6min,需要6分钟出现了巨大的延迟,这个问题该怎么解决?还是我理解的record(yuvIplimage)出现错误?

amazingyyc avatar Jun 20 '15 00:06 amazingyyc

^try mp4 instead of h264.

edisonw avatar Jun 21 '15 18:06 edisonw

@amazingyyc @edisonw 请问如何压缩.so文件的大小呢?我使用GitHub上JavaCV中提供的库,光libavcodec.so就有8M了,太大了。

szitguy avatar Sep 17 '15 13:09 szitguy

我也不知道, 换硬件编码吧😋😋

amazingyyc avatar Sep 17 '15 13:09 amazingyyc

so不能压缩~只能精简~改编译配置或者删代码~(雾

GitaiQAQ avatar Sep 17 '15 14:09 GitaiQAQ

@dphdjy @amazingyyc 谢谢回复,硬件编码要4.2+,我的app要从4.0+开始支持,看来没别的办法了,呵呵。二位有没有其他比较好的方案来做视频录制的呢?

@dphdjy 可有精简配置参考?我看到有些人用的libavcodec只有2M多

szitguy avatar Sep 17 '15 15:09 szitguy

我现在的方法是,得到数据后先不编码,先将原始的图片数据和音频数据,存储到文件中。最后再统一编码。

别的方法:利用mediarecorder录制mp4视频,然后再拼接。

amazingyyc avatar Sep 17 '15 15:09 amazingyyc