【问题标题】:Is it possible to output raw mpeg4-es video frame to mp4 container with mp4parser in Android?是否可以在 Android 中使用 mp4parser 将原始 mpeg4-es 视频帧输出到 mp4 容器?
【发布时间】:2019-08-24 11:56:13
【问题描述】:

我正在尝试从 mpeg4-es 视频帧生成 mp4 文件。 到目前为止,我可以毫无问题地使用 mp4parser 从 H264 视频帧生成 mp4 文件。

但我不确定我们是否也可以使用 mp4parser 将 mpeg4-es 视频帧输出到 mp4? (似乎没有任何关于这种方式的例子。) 还是我应该寻找另一种在 Android 中制作它的方法?

任何意见或建议将不胜感激。谢谢

【问题讨论】:

    标签: android video mp4 mp4parser


    【解决方案1】:

    this Post。它有你需要理解的答案。您的 MPEG 基本流在 AVCC 中。这意味着要使其像往常一样 H.264(附件 B)您必须替换代表 NAL 单元 大小(在 MP4 中)的每个 4 字节与开头像00 00 00 01 这样的代码。然后,您可以在 MP4Parser 工具中使用与 H.264 相同的 MPEG-es。也许我的Answer here 可以帮助您识别NALU。

    获取一个十六进制编辑器并检查原始 H.264 之间的差异,然后检查相同的 H264 数据现在包含在 MP4 文件中(在 MP4 中找到 "mdat",然后它将您的 H. .264 字节)。看看 NALU 是如何从以00 00 00 01 开始变为使用(十六进制)数字D8 9C 00 00 来表示字节大小的?

    PS:如果您了解 FFmpeg,我建议您将 1 张图片转换为 H.264 视频帧,然后将 codec copy H264 转换为 MP4 容器。现在您可以在 MP4 文件中轻松找到 H.264(就像它被复制/粘贴到那里一样)。一旦您可以将一个小的 1 帧 MPEG-es 转换回 H264,然后尝试更长的文件。

    【讨论】:

    • 感谢您的友好回复。到目前为止,我们可以毫无问题地将H264(AVC)帧打包成MP4文件,方法和你说的差不多。但是我们遇到的问题是关于 MPEG4 (video/mpeg4-es) 帧(不是 AVC),所以您会建议我们将 MPEG4 帧的起始代码更改为 00 00 00 01 吗?非常感谢。
    • MPEG-es 的前 16 个字节(十六进制格式)是什么?
    • 您好,这是一个示例:00 00 01 B6 52 E0 33 FD EB E9 1A 7C 1F 79 47 BE ....。任何建议将不胜感激。谢谢
    • 如果您选择(或跳过)从字节 52 开始的 438 个字节,接下来的 4 个字节会是什么样子(在位置/偏移量 442 处)?我看不出00 00 01 是否是您的起始代码,否则(b)字节00 00 01 B6 表示NALU 的size(这就是为什么我希望您提前检查483 个字节以查看如果在这个 size 的跳跃之后给出一个新的 NALU。
    • 嗨,VC.One 感谢您的建议,我将粘贴完整字节作为您的建议。请等一会儿。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多