android SDK 中 MediaExtractor、MediaCodec 和 MediaMuxer 之间的关系是什么?

What is relation between MediaExtractor, MediaCodec and MediaMuxer in android SDK?

我正在尝试对 android 视频样本进行一些深度学习实验。而且我已经陷入了 remuxing 视频。我有几个问题需要在脑海中整理信息:) 我已经阅读了一些页面:https://vec.io/posts/android-hardware-decoding-with-mediacodec and https://bigflake.com/mediacodec/#ExtractMpegFramesTest 但我仍然一团糟。

我的问题:

  1. 我可以使用 MediaExtractor 读取视频,然后将数据传递给 MediaMuxer 以将视频保存在另一个文件中吗?不使用 MediaCodec?
  2. 如果我想在保存前修改帧,我可以不使用 Surface 吗?只是修改ByteBuffer?我假设我需要解码来自 MediaExtractor 的数据,然后修改内容,然后将其编码为 MediaMuxer.
  3. 在方法 MediaExtractor::readSampleData 的上下文中,sample 是否与 frame 相同?
  4. 我需要解码样本吗?

这是对每个 class 功能的简要描述:

  • MediaExtrator:提取编码的 video/audio 数据
  • MediaCodec:根据其配置方式,它可以是解码器或编码器。
  • MediaMuxer:将数据流多路复用到输出文件中。

管道通常应该是这样的:

MediaExtractor -> MediaCodec(作为解码器) -> 你的编辑 -> MediaCodec(作为编码器) -> MediaMuxer

为您解答问题:

  1. MediaExtractor 会给你编码的数据,如果你想做的话 任何带有它的东西你都必须使用 MediaCodec 对其进行解码。
  2. 或许可以在没有表面的情况下这样做,但它会 相当有限。表面是要走的路。你可以找到更多信息 这里:
  3. 样本可以是视频帧或音频样本
  4. 是的,您确实需要解码样本才能对其进行编辑