我正在尝试在特定时间使用MediaExtractorMediaCodec从电影中获取特定帧作为图像。如果满足以下条件,我可以成功完成此操作:


我使用extractor.seekTo(time, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);,但是,这仅给出最近的同步帧而不是目标帧。
我依次使用extractor.advance();提取所有帧,但我需要获取并非所有目标帧。


因此,我尝试以下方法:

extractor.seekTo(time, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
while(extractor.getSampleTime()<time /*target time*/) extractor.advance();


这样可以提供正确的帧,但是由于某些原因图像已损坏。看起来像是正确的图像(我从成功的案例中得到的图像),但是有一些像素化和奇怪的雾度。

while-loop是成功案例与损坏案例之间唯一的不同之处。如何将MediaExtractor提前到特定时间(而不仅仅是同步时间)而又不会损坏图像?

最佳答案

多亏了淡淡的评论,由于I-frame具有完整图片,并且PB帧具有差异(这是实现压缩的方式),因此我必须继续提供编码器。因此,我需要从I-frame(与同步帧相同)开始,并继续将其他帧馈送到解码器以接收完整图像。

10-08 07:20