软件视频编解码器编码端的具体输入是什么?
编解码器输入与MP4编码标识问题解答
编码器接收什么作为编码输入
视频编码器本身根本不关心输入来自什么后缀的文件,它只认符合参数约定的未压缩原始帧数据,常见的输入来源就三类:
- 裸原始序列文件,最常见的是
.yuv、.rgb后缀的文件。这类文件没有任何封装头、元数据,整个文件从第一个字节开始就是逐帧排布的像素数据,比如做编码开发最常用的YUV420P格式.yuv文件,就是按帧依次存Y平面、U平面、V平面的二进制数据。用这类文件做输入的时候,你只要提前定好分辨率、像素格式、帧率,按固定字节长度逐帧读数据送进编码器就行,所有H.26x系列的参考编码器默认都是支持这种输入的。 - 容器封装的未压缩内容。MP4、AVI、MKV这类容器都能装未压缩的视频、音频数据,这种情况你根本不用管容器是什么后缀,先用解复用器把对应视频轨道的内容从容器里拆出来,拿到的就是和上面裸
.yuv文件完全一样的未压缩帧数据,直接送编码器就行。 - 实时帧流。比如从摄像头、采集卡直接读的帧,或者其他处理环节输出到内存里的帧,根本不落地存成文件,只要内存里的像素排布符合编码器要求的格式,就能直接送编码,和文件输入没有本质区别。
说白了,没有所谓的“标准原始视频文件”这回事,编码器只看输入的二进制数据是不是符合它要求的像素排列规则,和数据来源没有关系。
MP4中哪个字段存储编码标识,怎么判断是未压缩还是已压缩内容
MP4的所有媒体信息都是按层级嵌套的atom(也叫box)存储的,编码格式标识存在视频轨道的stsd(Sample Description Box)字段里,顺着固定层级找就行:
- 先找到MP4根目录下的
moovatom,这是存整个文件所有媒体元数据的核心容器。 - 在
moov里找到对应视频轨道的trakatom,文件里有几个媒体轨(视频、音频、字幕等)就有几个对应的trak,注意不要错选音频轨道。 - 顺着视频
trak往下找,依次进入mdia(Media Box)→minf(Media Information Box)→stbl(Sample Table Box),这个box里存的是该轨道所有帧的时间、位置、属性信息。 stbl下的stsdatom就是存编码类型的核心位置:stsd里的第一个子entry的前4个字节是FourCC四字符码,这个四字符码就是编码格式的唯一标识。
常见的四字符码对应关系可以直接用来判断压缩状态:
- 已压缩的H.26x系列编码:
avc1/avc3对应H.264,hev1/hvc1对应H.265/HEVC,vvc1/vvi1对应H.266/VVC,这类标识对应的就是已经编码完成的压缩视频。 - 无压缩视频编码:
raw(注意最后带一个半角空格,对应通用无压缩RGB/YUV数据)、yuv2/yuvs对应特定格式的无压缩YUV数据、r210对应10bit无压缩RGB数据,这类标识对应的就是封装在MP4里的未压缩内容。
别靠文件大小、后缀这类经验判断,只要解析到视频轨stsd下的FourCC属于无压缩编码的范围,那就是未压缩的,反之就是压缩过的。日常很少见到装未压缩视频的MP4,纯粹是因为无压缩视频体积太大,用MP4封装的场景少,不是标准不支持。
内容的提问来源于stack exchange,提问作者usrnew xnew
相关产品推荐
相关产品推荐

