Tob*_*oby 17 video ffmpeg stream rtp h.264
环境:
我有一台IP摄像机,能够通过RTP以H.264编码格式传输数据.从以太网记录该原始流.有了这些数据,我必须工作.
目标:
最后我想要一个*.mp4文件,我可以使用常见的媒体播放器(如VLC或Windows MP).
到目前为止我做了什么:
我拿了原始流数据并解析它.由于数据是通过RTP传输的,我需要处理NAL字节,SPS和PPS.
1.写一个原始文件
首先,我确定通过以太网接收的每个帧的类型.为此,我解析每个RTP有效负载的前两个字节,因此我可以获得8个NAL单元位,片段类型位以及开始,保留和结束位.在有效载荷中,它们的排列方式如下:
Byte 1: [ 3 NAL Unit Bits | 5 Fragment Type Bits]
Byte 2: [Start Bit | Reserved Bit | End Bit | 5 NAL Unit Bits]
Run Code Online (Sandbox Code Playgroud)
由此我可以确定:
在我的案例中必要的片段类型是:
Fragment Type 7 = SPS
Fragment Type 8 = PPS
Fragment Type 28 = Video Fragment
Run Code Online (Sandbox Code Playgroud)
通过将字节1和2中的NAL单元位放在一起来创建NAL字节.
现在,根据碎片类型,我执行以下操作:
SPS/PPS:
0x00 0x00 0x01
),然后写入SPS或PPS数据使用起始位进行分段
没有Start Bit的碎片
这意味着我的原始文件看起来像这样:
[NAL Prefix][SPS][NAL Prefix][PPS][NAL Prefix][NAL Unit Byte][Raw Video Data][Raw Video Data]....[NAL Prefix][NAL Unit Byte][Raw Video Data]...
Run Code Online (Sandbox Code Playgroud)
对于我在流数据中找到的每个PPS和SPS,我只写一个NAL前缀(0x00 0x00 0x01)然后写入SPS/PPS本身.
现在我无法使用某些媒体播放器播放这些数据,这导致我:
2.转换文件
由于我想避免使用编解码器,我只是使用现有的应用程序 - > FFmpeg.这是我用这些参数调用:
ffmpeg.exe -f h264 -i <RawInputFile> -vcodec copy -r 25 <OutPutFilename>.mp4
-f h264
:这应该告诉ffmpeg我有一个h264编码流
-vcodec copy
:从联机帮助页引用:
Force video codec to codec. Use the "copy" special value to tell that the raw codec data must be copied as is.
-r 25
:将帧速率设置为25 FPS.
当我用这些参数调用ffmpeg时,我得到一个.mp4文件,我可以使用VLC和Windows MP,所以它实际上有效.但是该文件现在看起来与我的原始文件有点不同.
这引出了我的问题:
我到底做了什么?
我的问题不在于它不起作用.我只是想/需要知道我调用ffmpeg实际上做了什么.我有一个原始的H264文件,我无法播放.使用FFmpeg之后我就可以玩了.
原始文件(我写的)和FFmpeg写的文件之间有以下区别:
虽然原始文件中的新视频帧像[NAL Prefix][NAL Unit Byte][Raw Video Data]
新文件一样启动
,但它看起来像这样:
[0x00 0x00][2 "Random" Bytes][NAL Unit Byte][Raw Video Data].....[0x00 0x00[2 other "Random" Bytes][NAL Unit Byte][Raw Video Data]...
Run Code Online (Sandbox Code Playgroud)
我知道视频流需要一个容器格式(如果我错了,请纠正我,但我认为新的页眉和页脚是负责的).但为什么它实际上会改变原始数据中的一些字节?它不能是一些解码,因为流本身应该被播放器解码而不是ffmpeg.
正如你所看到的,我不需要为我的问题找到一个新的解决方案,而是一个解释(所以我可以自己解释).ffmpeg实际上做了什么?为什么它会改变视频数据中的某些字节?
小智 0
看起来流已被打包。许多容器格式将比特流分割成数据包,并添加一些信息,例如时间戳、数据包长度等。这为解码器提供了钩子,可以跳过文件而不解码所有内容,当数据包丢失时重新同步,同步音频/视频、组合多个流等。
查看 MP4 文件格式信息以获取更多信息:
http://en.wikipedia.org/wiki/MPEG-4_Part_14