我正在尝试在特定时间使用MediaExtractor
和MediaCodec
从电影中获取特定帧作为图像。如果满足以下条件,我可以成功完成此操作:
我使用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
具有完整图片,并且P
和B
帧具有差异(这是实现压缩的方式),因此我必须继续提供编码器。因此,我需要从I-frame
(与同步帧相同)开始,并继续将其他帧馈送到解码器以接收完整图像。