我正在尝试使用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
推进到特定时间(而不仅仅是同步时间)?
答案 0 :(得分:1)
感谢fadden评论,我必须继续提供编码器,因为I-frame
具有完整的图片,而P
和B
帧有差异(这就是压缩的实现方式) 。所以我需要从I-frame
开始(它与同步帧相同)并继续将其他帧送到解码器以接收完整的图像。