我正在使用MediaCodec解码来自MediaExtractor的视频轨道。它以异步模式运行,并以Surface作为输出。我需要能够在视频中随机搜索特定的帧。
调用onOutputBufferAvailable()时,我希望bi.presentationTimeUs包含帧的时间戳:它在视频文件轨道中的时间戳。
这确实是一开始发生的,但是在尝试使用MediaExtractor.seekTo(...)向后搜索到另一个时间之后,返回的时间帧似乎“卡住了”:它们与调用seekTo()之前的最后一帧相同。 >
如果我在搜索后正确理解了所有内容,那么我将无法期望所有先前提交的输入缓冲区的输出缓冲区,因为其中一些可能包含B帧,这些帧无法在没有后续数据的情况下进行解码。因此,我不能仅根据输入缓冲区的时间戳来跟踪时间戳。
如果我flush()缓冲区没有发生此问题,则时间戳是正确的,但是异步回调变得非常成问题。 (无法确定哪个缓冲区仍然有效... try {}-使用这些缓冲区最终会破坏编解码器,显然在抛出错误后不能一直继续下去)
否则,帧具有正确的内容,并且编解码器报告支持自适应播放。我正在奥利奥(Oreo)上进行测试。
有没有办法在不使用flush()-编解码器的情况下获得正确的时间戳?这是预期的行为还是库错误?