Muxing相机使用MediaMuxer预览h264编码的基本流

时间:2013-10-14 13:48:27

标签: android camera preview mediacodec

我正在使用Android 4.3的新MediaCodec和MediaMuxer API开发关于previewTexture录制的Android Test Cases之一的实现。

我通过将录制提示设置为相机参数来设法以约30fps的帧速率录制预览流。

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

通过跟踪延迟,我能够发现延迟来自" drainEncoder"中的以下代码行。方法:

mMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);

如果编码器具有可用于多路复用的数据,则在循环中调用该行。目前我没有录制音频,所以MediaMuxer只将h264流转换为mp4格式。

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

由于网上关于这些新API的信息不多,所以非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

我怀疑你被MediaMuxer磁盘写入感染了。最好的方法是在录制过程中运行systrace,看看暂停期间实际发生了什么。 (systrace docsexplanationbigflake example - 截至目前,只有后者更新为Android 4.3)

如果是这种情况,您可以通过在单独的线程上运行MediaMuxer实例,通过同步队列向其提供H.264数据来缓解此问题。

这些停顿是否每5秒钟定期发生一次? CameraToMpegTest示例将编码器配置为每5秒输出一个I帧(预期帧速率为30fps),这将导致输出一个完整大小的帧,而不是微小的增量。

答案 1 :(得分:0)

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

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