我能够实现一个代码,该代码在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?我应该设置哪些值才能接收编码器记录的每一帧? 感谢。
答案 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输出将显示每个函数需要多长时间,显示每个函数运行的线程,并帮助您识别调用已阻塞的区域以及正在使其他线程处于饥饿状态。
完全有可能还有其他事情发生,但这是一个很好的起点。