6

我正在使用Android 4.3 的新 MediaCodec 和 MediaMuxer API 实现有关 previewTexture 录制的Android 测试用例之一。

通过将recordingHint设置为相机参数,我设法以大约30fps的帧速率记录预览流。

但是,我遇到了延迟/滞后问题,并不知道如何解决。当使用相当标准的质量设置(1280x720,比特率约为 8.000.000)录制相机预览时,预览和编码材料偶尔会出现延迟。更具体地说:这种延迟大约每 2-3 秒发生一次,大约需要 300-600 毫秒。

通过跟踪延迟,我发现延迟来自“drainEncoder”方法中的以下代码行:

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);

如果编码器有可用于复用的数据,则循环调用此行。目前我不录制音频,所以只有 h264 流由 MediaMuxer 转换为 mp4 格式。

我不知道这是否与该延迟有关,但它总是在循环需要两次迭代以使编码器的所有可用数据出列时发生(更具体地说,它总是发生在这两次迭代中的第一次) . 在大多数情况下,一次迭代足以使编码器出队。

由于在线上没有太多关于这些新 API 的信息,因此非常感谢您的帮助!

4

2 回答 2

3

I suspect you're getting bitten by the MediaMuxer disk write. The best way to be sure is to run systrace during recording and see what's actually happening during the pause. (systrace docs, explanation, bigflake example -- as of right now only the latter is updated for Android 4.3)

If that's the case, you may be able to mitigate the problem by running the MediaMuxer instance on a separate thread, feeding the H.264 data to it through a synchronized queue.

Do these pauses happen regularly, every 5 seconds? The CameraToMpegTest example configures the encoder to output an I-frame every 5 seconds (with an expected frame rate of 30fps), which results in a full-sized frame being output rather than tiny deltas.

于 2013-10-14T17:05:59.573 回答
0

正如@fadden 指出的那样,这是一个磁盘写入问题,主要发生在写入闪存速度较低的设备上,或者如果您尝试写入 SD 卡。

我在这里的一个类似问题中写了一个关于如何缓冲 MediaMuxer 写入的解决方案。

于 2015-11-30T14:07:29.783 回答