0

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

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

4

1 回答 1

2

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

这里有一篇关于 MediaMuxer 问题的不错的博客文章:http://blog.horizo ​​n.camera/post/134263616000/optimizing-mediamuxers-writing-speed。简而言之,MediaMuxer 写入停止,因此没有帧被拉出 MediaCodec 编码器。最终 MediaCodec 耗尽缓冲区并且不能再接受任何输入,因此相机开始丢弃帧。

使用systrace标签包装 MediaMuxer 调用将有助于缩小范围。这个想法是用android.os.Trace beginSection() /调用将编码设置中的所有“有趣”调用括起来,并使用标记endSection()收集 systrace 输出(示例here)。查看 systrace 输出将显示每个函数需要多长时间,显示每个线程在哪些线程上运行,并帮助您识别调用已阻塞和正在饿死其他线程的区域。--app

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

于 2016-01-19T00:51:15.747 回答