为什么搜索后MediaCodec会给时间戳记提供不正确的输出缓冲区?

时间:2019-01-11 16:35:44

标签: android mediacodec mediaextractor

我正在使用MediaCodec解码来自MediaExtractor的视频轨道。它以异步模式运行,并以Surface作为输出。我需要能够在视频中随机搜索特定的帧。

调用onOutputBufferAvailable()时,我希望bi.presentationTimeUs包含帧的时间戳:它在视频文件轨道中的时间戳。

这确实是一开始发生的,但是在尝试使用MediaExtractor.seekTo(...)向后搜索到另一个时间之后,返回的时间帧似乎“卡住了”:它们与调用seekTo()之前的最后一帧相同。 >

如果我在搜索后正确理解了所有内容,那么我将无法期望所有先前提交的输入缓冲区的输出缓冲区,因为其中一些可能包含B帧,这些帧无法在没有后续数据的情况下进行解码。因此,我不能仅根据输入缓冲区的时间戳来跟踪时间戳。

如果我flush()缓冲区没有发生此问题,则时间戳是正确的,但是异步回调变得非常成问题。 (无法确定哪个缓冲区仍然有效... try {}-使用这些缓冲区最终会破坏编解码器,显然在抛出错误后不能一直继续下去)

否则,帧具有正确的内容,并且编解码器报告支持自适应播放。我正在奥利奥(Oreo)上进行测试。

有没有办法在不使用flush()-编解码器的情况下获得正确的时间戳?这是预期的行为还是库错误?

0 个答案:

没有答案