【问题标题】:about fmp4 encoding , how to fill the mdat box wit H264 frame?关于 fmp4 编码,如何用 H264 帧填充 mdat 框?
【发布时间】:2019-05-28 07:24:50
【问题描述】:

我使用 C 语言将 H264 帧(只有 I/P 帧)编码为 fmp4 文件。填mdat框的时候,不知道怎么填frame数据。
(I/P)帧数据是直接填充的吗?
前 4 个字节是否需要填充帧长度?

我尝试使用FFMPG对fmp4文件进行编码,发现mdat box中的数据和原来的I/P帧数据完全不同。
是不是又打码了?
可以直接将I/P帧的数据填入mdat box吗?

【问题讨论】:

  • 请添加您尝试过的代码。
  • 代码乱七八糟,不方便展示,告诉我思路,然后我去调试,非常感谢!
  • 请创建一个minimal reproducible example。如果你遵循这个概念,它就不会再乱七八糟了。此外,如果你这样做,帮助你会更容易。描述代码通常充满了导致其故障的误解。制作 MCVE 提供了第二层通信,这通常有助于发现问题的根源。
  • 答案对于 Q/A 格式来说太复杂了,除非你更具体一点。 mdat 的布局在 moov(或 moof)中进行了描述,如果不解决另一个问题,您就无法解决其中一个问题。

标签: c mp4 h.264 fmp4


【解决方案1】:

H.264 可以采用不同的流格式。一种叫做“附件B”,另一种是MP4。 在“附件 B”中,您的 NAL 单位以起始代码 00 00 00 01 或 00 00 01 为前缀。 在 MP4 中,您的 NAL 单位以字节大小为前缀。

我假设您的编码器发出“附件 B”。

  1. 去掉起始码(00) 00 00 01

  2. 在 NAL 单元前加上大小(通常为 4 个字节)

  3. 从流中过滤掉 AUD/SPS/PPS NAL 单位

  4. 将您转换后的 NAL 单位写入 MDAT 框中

  5. 根据您的 SPS、PPS 和长度大小创建 AVC 配置框 ('avcC')

  6. 将您的 avcC 盒子存储在 moov->trak->mdia->minf->stbl->avc1->avcC

  7. 在将样本写入 mdat 时 - 跟踪大小、偏移量和帧类型以创建正确的 stts、stss、stsc、stsz 和 stco 框。

【讨论】:

  • 您说“我假设您的编码器发出“附件 B”,但您正在删除起始代码。也许您的意思是“MP4”而不是“附件 B”?
  • 不 - 我的意思是附件 B,是的,您正在删除起始代码 (00) 00 00 01 以从附件 B 转换为 MP4。
  • 啊,明白了。您正在将其从附件 B 转换为 MP4。阅读您的答案,我的印象是您可以将两种类型(附件 B 或 MP4)都用作 MDAT,但您不能,您需要将其转换为 MP4。现在很清楚了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2019-06-09
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多