qdrzwd / VideoRecorder

android视频录制,模仿微视,支持按下录制、抬起暂停。进度条断点显示。
Apache License 2.0
1.8k stars 563 forks source link

请问怎么设置帧率啊? #2

Open oldfeel opened 10 years ago

oldfeel commented 10 years ago

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

qdrzwd commented 10 years ago

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

oldfeel commented 10 years ago

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

qdrzwd commented 10 years ago

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

qdrzwd commented 10 years ago

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

oldfeel commented 10 years ago

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

qdrzwd commented 10 years ago

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

oldfeel commented 10 years ago

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

oldfeel commented 10 years ago

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

qdrzwd commented 10 years ago

opencv源代码网上有

oldfeel commented 10 years ago

好的,谢谢!

qdrzwd commented 10 years ago

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

oldfeel commented 10 years ago

恩,一定!

2014-04-14 16:18 GMT+08:00 钱冬 notifications@github.com:

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

— Reply to this email directly or view it on GitHubhttps://github.com/qdrzwd/VideoRecorder/issues/2#issuecomment-40342670 .

oldfeel commented 10 years ago

看到了。。谢谢提醒!

2014-04-14 16:20 GMT+08:00 钱冬 notifications@github.com:

我觉得主要原因还是在丢帧问题上,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 .

edisonw commented 10 years ago

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

GitaiQAQ commented 10 years ago

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

amazingyyc commented 9 years ago

这是我的想法:

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

edisonw commented 9 years ago

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

amazingyyc commented 9 years ago

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

edisonw commented 9 years ago

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

amazingyyc commented 9 years ago

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

edisonw commented 9 years ago

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

amazingyyc commented 9 years ago

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

edisonw commented 9 years ago

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

amazingyyc commented 9 years ago

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

edisonw commented 9 years ago

^try mp4 instead of h264.

szitguy commented 9 years ago

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

amazingyyc commented 9 years ago

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

GitaiQAQ commented 9 years ago

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

szitguy commented 9 years ago

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

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

amazingyyc commented 9 years ago

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

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

szitguy commented 9 years ago

@amazingyyc 恩,你这种方法也挺好的,整个过程到最终得到mp4文件的时间长不长?我现在的需求是录完马上发出去,像微信小视频那种的,感觉很快速。

一开始我也是用自带的MediaRecorder,但是最终生成的mp4要做分辨率压缩处理(如录制出来的是640X480,要从顶部开始裁切成320X240的分辨率),然后没有找到处理办法,所以就转到了直接取原生数据,处理成目标数据后,再合成mp4。另外一个不用MediaRecorder的原因是它start和stop的时候会发出“叮”的声音。貌似Instagram就是用的MediaRecorder,我看了它录制视频时会发出“叮”声的。

amazingyyc commented 9 years ago

这样试试:得到的数据放在一个jni的队列中,然后再jni新建一个线程,循环的对原始数据进行裁剪,裁剪完然后 ffmpeg进行编码。 估计时间还是没办法保证,大约10s视频,需要15s进行编码,同时进行拍摄加编码完还是需要5s才可以发送。 不用硬件编码,mediarecorder好像最快吧。 微信的小视频是判断,如果支持硬编码就使用硬编码,不行就软编码(腾讯的技术人员说的)

szitguy commented 9 years ago

@amazingyyc 嗯,我也想着按着这么个思路去搞。

确实是mediarecorder最快了,但是后期处理方法少,另外还有那个“叮”声比较烦。

非常感谢提供这么多好的思路。

1Dev11 commented 8 years ago

删除视频像Instagram的最后记录帧的视频做

GinRyan commented 8 years ago

通过另外维护一个线程来执行死循环执行record(yuvIplimage)实现了19fps的录制视频。

103king commented 7 years ago

那么分辨率高了之后声音失真的问题是不是也是这个原因导致的?

103king commented 7 years ago

@GinRyan 请问你说的一个线程执行死循环是怎么实现的,能贴一下代码吗