【问题标题】:Problems with MediaExtractor媒体提取器的问题
【发布时间】:2014-01-13 23:21:51
【问题描述】:

我正在尝试使用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 提前到特定时间(不仅仅是同步时间)而不会出现损坏的图像?

【问题讨论】:

  • 您是在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


【解决方案1】:

感谢 fadden 评论,我必须继续输入编码器,因为 I-frame 具有完整图片,而 PB 帧有差异(这是实现压缩的方式)。所以我需要从I-frame 开始(它与同步帧相同)并继续将其他帧馈送到解码器以接收完整图像。

【讨论】:

  • 我面对的是same kind of situation。您如何首先获得具体时间?因为我使用的是类似的解决方案,但我从来没有得到预期的帧。我怀疑我从视频视图中收到的时间不准确,或者我的 while 循环工作不正常。
  • 您能否详细说明您是如何从 I 帧“持续喂食”它直到到达您想要的帧的?
  • @Mohamed_AbdAllah:MediaExtractor.SEEK_TO_PREVIOUS_SYNC 会寻找 I 帧的视频吗?你究竟是如何从 I Frame 继续喂食的?
  • 是的。我一直使用 extractor.advance() 来获取以下 P/B 帧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多