几乎所有关于h264的文档都告诉我它由NAL包组成。 好的。 几乎所有地方都告诉我数据包应该以类似
00 00 01
或00 00 00 01
的签名开头。 例如:https://dev59.com/DGYr5IYBdhLWcg3w6OKd#18638298,https://stackoverflow.com/a/17625537/8167678
H.264格式的格式是由NAL单元组成的,每个单元都以三个字节的起始前缀开始,值为0x00、0x00、0x01,并且每个单元具有不同的类型,具体取决于这3个起始字节之后第4个字节的值。 一个NAL单元不是视频中的一个帧,每个帧由多个NAL单元组成。我从random_youtube_video.mp4文件中随机提取了一帧:
ffmpeg -ss 10 -i random_youtube_video.mp4 -frames 1 -c copy pic.avi
结果如下所示:
![hexdump of AVI](https://istack.dev59.com/QJGeK.webp)
00 00 24 A9
而不是00 00 00 01
此AVI文件可以完美播放。我对mp4容器执行相同的操作:
![hexdump of mp4](https://istack.dev59.com/b2Tn2.webp)
我尝试提取原始数据:
ffmpeg -i pic.avi -c copy pic.h264
结果如下:
![Raw data](https://istack.dev59.com/HTMSE.webp)
![ffmpeg error](https://istack.dev59.com/6QSN1.webp)
![Analysis](https://istack.dev59.com/UlewF.webp)
MP4Box
告诉我: Cannot find H264 start code
Error importing pic.h264: BitStream Not Compliant
学习H264的内部原理是非常困难的,特别是当什么都不起作用时。
因此,我有以下问题:
- MP4文件中实际包含哪些数据?
- 我必须阅读哪些内容以解码这些数据(我指的是不同的附录)?
- 如何读取流并从这个“损坏”的原始流中获取解码图像(即使使用ffmpeg)?
更新:
看起来是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
我有NALs签名和一个额外的NAL单元。其他字节相同(选定)。
这是一个bug吗?
更新
不,这不是一个bug,您必须使用选项-bsf h264_mp4toannexb将流保存为“Annex B”格式(带前缀)。