【问题标题】:android - mux raw h264 in mp4 containerandroid - mp4 容器中的多路复用原始 h264
【发布时间】:2016-07-10 16:36:27
【问题描述】:

我有我的帧的原始 h264 数据及其presentationTimeUs,我想在mp4 容器中混合数据。我如何使用 ffmpeg 或除 MediaMuxer 之外的任何库来做到这一点?

更新:我需要一个命令将一帧的 h264 数据写入 mp4 容器,包括 presentatoinTimeUs

【问题讨论】:

  • 听起来您正在寻找使用 ffmpeg 库进行 .mp4 复用的示例?
  • 你可以试试ffmpeg -f h264 -i raw.264 out.mp4
  • 我使用 MediaCodec 将 byte[] 编码为 h264,但我不想使用 MediaMuxer 在 mp4 容器中混合数据(因为它是从 android 4.3 添加的)。因此,当我将原始 h264 写入文件时,它的播放效果不佳且播放速度过快,并且此命令: ffmpeg -f h264 -i raw.264 out.mp4 只是将视频放入 mp4 容器中,并不能解决任何问题。我需要一个 ffmpeg 命令在 mp4 文件中写入一个 h264 帧,包括设置presentationTimeUs 或它需要的任何元数据。

标签: android ffmpeg android-mediacodec


【解决方案1】:

您不能使用 ffmpeg 或任何库编写没有相关元信息的任意 H264 原始数据。 MP4 等容器的存在使播放器知道如何处理原始数据(例如,每一帧的 PTS、编解码器配置、电影大小、颜色格式等),以及更多未包含在原始压缩视频流中的内容。

但是,如果您需要稍后分析压缩器的比特流,您可以执行相反的操作:

ffmpeg -i file.mp4 -f h264 out.h264

【讨论】:

  • 我使用 MediaCodec 将 byte[] 编码为 h264,但我不想使用 MediaMuxer 在 mp4 容器中混合数据(因为它是从 android 4.3 添加的)。因此,当我将原始 h264 写入文件时,它的播放效果不佳且播放速度过快,并且此命令: ffmpeg -f h264 -i raw.264 out.mp4 只是将视频放入 mp4 容器中,并不能解决任何问题。我需要一个 ffmpeg 命令在 mp4 文件中写入一个 h264 帧,包括设置presentationTimeUs 或它需要的任何元数据。
  • 尝试添加“-r 24”来强制帧率。您不能将单个 ENCODED 帧原始数据添加到容器中,也不能使用 ffmpeg 或任何其他工具指定其时间戳。这种详细程度远低于 ffmpeg 所能做的(即,从一种容器/格式转换或重新编码到另一种)。该帧也可能是一个关键帧(或不是),用它自己的设置编码。拥有一个原始缓冲区几乎没有说明它是如何编码的,以及它是否可以放在一个容器中。这就是为什么 MediaMuxer 需要一个 BufferInfo,它在内部保存轨道号,等等。
  • 所以我不需要 ffmpeg 但应该有一些库来处理这个。
  • ffmpeg 建立在 libav、libavcodec、libavformat 等之上。这些是您正在寻找的库。 ffmpeg 只是一个编译的实用程序,而不是一个库。如果您不想费心制作自己的东西(我向您保证,如果您想要一个完全兼容的东西,这可不是一件容易的事MP4文件到底)..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2016-09-13
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2012-10-29
相关资源
最近更新 更多