Mediacodec在线编码视频

时间:2016-01-18 21:09:01

标签: android mediacodec mediamuxer

我能够实现一个代码,该代码在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。

我的问题是BitRate?我应该设置哪些值才能接收编码器记录的每一帧? 感谢。

1 个答案:

答案 0 :(得分:2)

我已经看到MediaMuxer在向磁盘写入数据时暂停1秒以上,但通常不会以较低的比特率 - Grafika使用的1Mbps比特率应该没问题 - 而且它们通常是几个几秒钟。因此,我不确定这是否是您面临的问题。

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

使用systrace标记包装MediaMuxer调用将有助于缩小范围。我们的想法是将所有有趣的"包括在内。通过android.os.Trace beginSection() / endSection()次调用在您的编码设置中调用,并使用--app标记(example here)收集systrace输出。查看systrace输出将显示每个函数需要多长时间,显示每个函数运行的线程,并帮助您识别调用已阻塞的区域以及正在使其他线程处于饥饿状态。

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