从Mediacodec同步解码后的音视频数据

7
我想使用 MediaExtractorMediaCodec API 来编写一个简单的音视频播放器。
我已经能够解码和渲染 音频视频。 但是,我遇到了 音频 - 视频 同步的问题。
我无法找到任何控制 音频视频 同步的 API。 请问有什么方法可以同步解码后的 音频视频 数据吗?
1个回答

9
在Android源代码中,有一个基于MediaCodec API实现的示例播放引擎player。您可以检查位于frameworks/av/cmds/stagefright/SimplePlayer.cppSimplePlayer
在这个播放引擎实现中,MediaCodec的输出被dequeued并推入队列中,如此处所示。请检查439-450行以获得完整的图片。
一旦缓冲区可用,就会实现一个简单的AV同步机制(此处)。请参考508-521行。在本例中,只考虑一个轨道,因此当前时间nowUs从systemTime即ALooper::nowUs派生而来。
在您的代码中,您可以始终将音频呈现在先到先得的基础上,并且对于您的视频轨道,您可以从音频轨道派生nowUs。
一个简单的实现可以是nowUs = getAudioLastPresentationTime(),其中getAudioLastPresentationTime将返回从音频MediaCodec发送到音频渲染器的最后一个presentationTimeUs。

@ManojK.. 这个链接 http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#508 是一个可以在 Android 平台上尝试的工作样本。请问您是否在寻找其他内容? - Ganesh
非常感谢,我希望有Java的示例代码。无论如何,我会尝试上面提到的示例并保持更新。 - Manoj K
嗨,Ganesh,你提到,“在这个例子中,只考虑了一个轨道”,你能解释一下吗?我怀疑这至少考虑了音频和视频两个轨道。 - nmxprime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接