【发布时间】:2014-01-13 23:21:51
【问题描述】:
我正在尝试使用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 提前到特定时间(不仅仅是同步时间)而不会出现损坏的图像?
【问题讨论】:
-
您是在
while循环中将所有帧传递给解码器,还是只是提取目标帧并将其交给解码器? (即您是否将 P 帧交给解码器?) -
@fadden 感谢您一直在回答 MediaCodec 问题 :) 我按照问题中的说明循环,直到提取器到达目标时间,然后通过 extractor.readSampleData() 为解码器提供数据。老实说,我不知道什么是P帧
-
基本上,我最初使用extractor.advance();获取所有时间,然后将这些时间传递给自定义适配器。这个适配器的 getView() 需要时间,传递给它的 while 循环声明将提取器设置为我从适配器获取的时间,然后将这个时间传递给 MediaCodec 以提取当时的帧
-
见en.wikipedia.org/wiki/Video_compression_picture_types。每个帧都不是单独压缩的,因此您必须从 I 帧开始解码。据我所知,术语“I 帧”、“关键帧”和“同步帧”在某种程度上可以互换使用。所以我相信你必须从最近的同步帧开始解码。
-
现在可以使用了,谢谢 :)
标签: android android-mediacodec mediaextractor