0

编辑,因为我第一次不清楚:

我正在尝试使用 android MediaCodec 从现有视频文件(videoBefore.MP4)中获取每一帧,处理帧(如模糊),然后将每一帧编码为一个新的视频文件(videoAfter.MP4)。
新视频的持续时间必须与第一个视频相同。

只有一个条件:
每一帧都应该无限时间处理,这意味着10秒的视频可能需要1分钟的处理时间。

到目前为止,我只看到了可以实时完成的快速处理(如蓝移)的示例。
有没有办法从视频中抓取帧,然后“花时间”处理它,并且仍然以相同的帧速率或帧时序保留新视频?

*如果我也能保留音频可能会更好——但框架才是最重要的。

谢谢!

4

1 回答 1

1

你可以花多久时间。帧的时间由嵌入在 .mp4 文件中的演示时间戳决定,而不是访问代码的速率。

您从 中获取每一帧的时间值MediaExtractor#getSampleTime(),将其传递到解码器的中,并在与解码器的输出缓冲区关联queueInputBuffer()的结构中接收它。BufferInfo进行处理并将帧提交给编码器,再次在queueInputBuffer(). 它将被传递BufferInfo到编码器的输出端,您只需将整个传递BufferInfoMediaMuxer#writeSampleData().

您可以在ExtractMpegFramesTest中看到提取端,在EncodeAndMuxTest中看到复用端。DecodeEditEncodeTest进行编码/解码保留时间戳,但不显示or用法。MediaExtractorMediaMuxer

请记住,编解码器并不真正关心时间戳。它只是处理关心的 .mp4 文件的提取器/复用器代码。该值通过编解码器传递部分是为了方便,部分是因为编码帧可能出现乱序。(解码的帧,即从解码器出来的帧,总是有序的。)

如果您未能保留演示时间,您将获得持续零秒(并且不是很有趣)的视频,或者可能持续非常非常长的视频。Android 4.4 中引入的screenrecord命令使用时间戳来避免在屏幕未更新时记录帧。

于 2013-12-02T15:57:40.317 回答