Mediacodec 在线编码视频

Mediacodec to encode video online

我能够实现基于 grafika 的 CameraCaptureActivity 录制视频的代码。现在我可以记录自己从 1 数到 10,但是当我去看录制的视频时,我说的是 1、3、8、9,也就是说我错过了一些要录制的帧。表面已配置:

private static int VIDEO_WIDTH = 720;  // dimensions for 720p video
private static int VIDEO_HEIGHT = 1280;
private static int DESIRED_PREVIEW_FPS = 30; 

和编码器

format.SetInteger(MediaFormat.KeyColorFormat, (int)MediaCodecCapabilities.Formatsurface);
format.SetInteger(MediaFormat.KeyBitRate, 100000);
format.SetInteger(MediaFormat.KeyFrameRate, 30);
format.SetInteger(MediaFormat.KeyIFrameInterval, 5);

宽度:310 和高度:310。

我的问题是比特率吗?我应该设置哪些值才能接收我显示的每一帧由编码器记录? 谢谢。

我看到 MediaMuxer 在将数据写入磁盘时暂停 1 秒以上,但通常不会以较低的比特率——Grafika 使用的 1Mbps 比特率应该没问题——而且它们通常相隔几秒.所以我不确定这是否是您面临的问题。

这里有一篇关于 MediaMuxer 问题的精彩博客 post:http://blog.horizon.camera/post/134263616000/optimizing-mediamuxers-writing-speed。简而言之,MediaMuxer 写入停止,因此没有帧从 MediaCodec 编码器中拉出。最终 MediaCodec 用完了缓冲区,无法再接受任何输入,因此相机开始丢弃帧。

systrace tags will help narrow things down. The idea is to bracket all the "interesting" calls in your encoding setup with android.os.Trace beginSection() / endSection() calls, and collect systrace output with the --app tag (example here 封装 MediaMuxer 调用。查看 systrace 输出将向您显示每个函数需要多长时间,向您显示每个函数在哪些线程上运行,并帮助您识别调用被阻塞和其他线程饥饿的区域。

完全有可能发生其他事情,但这是一个很好的起点。