TL;DR:我想从 AVI/MP4 文件读取原始 h264 流,甚至是损坏/不完整的。
几乎所有有关 h264 的文档都告诉我它由 NAL 数据包组成。好的。几乎所有地方都告诉我,数据包应该以这样的签名开头00 00 01
or 00 00 00 01
。例如,https://stackoverflow.com/a/18638298/8167678, https://stackoverflow.com/a/17625537/8167678
H.264的格式是由NAL单元组成,每个单元开始
具有三个字节的起始前缀,值为 0x00、0x00、0x01
每个单位都有不同的类型,具体取决于第四个的值
这 3 个起始字节之后的字节。一个 NAL 单元不是一帧
视频中,每一帧由多个NAL单元组成。
Okay.
我下载了 random_youtube_video.mp4 并从中删除一帧:
ffmpeg -ss 10 -i random_youtube_video.mp4 -frames 1 -c copy pic.avi
And got:
Red part - this is part of AVI container, other - actual data.
As you can see, here I have 00 00 24 A9
instead of 00 00 00 01
这个AVI文件可以完美播放
I do same for mp4 container:
正如您所看到的,这里的字节完全相同。这个MP4文件可以完美播放
I try to strip out raw data:
ffmpeg -i pic.avi -c copy pic.h264
This file can't play in VLC or even ffmpeg, which produced this file, can't parse it:
I downloaded mp4 stream analyzer and got:
MP4Box
告诉我:
Cannot find H264 start code
Error importing pic.h264: BitStream Not Compliant
当什么都不起作用时,学习 h264 的内部结构是非常困难的。
所以,我有疑问:
- mp4里面的实际数据是什么?
- 我必须阅读什么来解码该数据(我的意思是不同的附件)
- 如何从这个“损坏的”原始流中读取流并获取解码图像(即使使用 ffmpeg)?
UPDATE:
ffmpeg 中似乎有错误:
当我进行双重转换时:
ffmpeg -ss 10 -i random_youtube_video.mp4 -frames 1 -c copy pic.mp4
ffmpeg pic.mp4 -c copy pic.h264
但是当我直接转换文件时:
ffmpeg -ss 10 -i random_youtube_video.mp4 -frames 1 -c copy pic.h264
我有 NAL 签名和一个额外的 NAL 单元。其他字节相同(选定)。
这是错误?
UPDATE
不,这不是错误,您必须使用选项 -bsf h264_mp4toannexb 将流保存为“Annex B”格式(带前缀)