提取ISOBMFF格式MP4的moof box时ASCII反转,是否为大端格式?
ISOBMFF格式中MP4 Box的字节序说明
是的,ISOBMFF(MP4所采用的底层格式)明确规定:所有Box的4字节size字段和4字节type字段必须以**大端(Big-Endian)**字节序存储,与运行代码的CPU架构无关——你的Intel Xeon属于小端架构,这就是你遇到ASCII反转问题的核心原因。
你直接用fwrite把内存中的结构体数据写入文件时,小端CPU存储的字节序会被直接输出,而ISOBMFF要求大端,因此出现了字段内容反转的情况。
针对你的代码补充几个关键注意点:
- 禁止直接通过结构体指针整体写入文件:必须先将
size和type等多字节字段转换为大端字节序后再写入。 - 代码中
fp和fp2是两个不同的文件指针,存在笔误风险,需确保写入目标文件句柄正确。 - moof Box内部的子字段(比如mfhd中的sequence number)同样需要遵循大端字节序要求,不能直接按内存中的小端数据输出。
转换小端到大端的常用方法可以借助系统提供的函数:
#include <arpa/inet.h> // 将32位小端整数转换为大端 uint32_t big_endian_size = htonl(moof->size);
写入时先输出转换后的big_endian_size,再直接写入moof->type的4个字节(确保内存中type是按'm'->'o'->'o'->'f'的顺序存储,而非反转),最后写入Box的剩余内容。
内容的提问来源于stack exchange,提问作者Kundera
相关产品推荐
相关产品推荐

