H.264变换用的FFmpeg(从RTP流)(H.264 conversion with FFmpe

2019-07-30 11:34发布

环境:

我有一台网络摄像机,它能够进行流式传输的数据通过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]

由此我可以判断:

  • 开始和视频帧的结束 - >起始位和结束位
  • 有效载荷的类型 - > 5片段类型位
  • NAL单元字节

片段类型的是必要的,我的情况是:

Fragment Type  7 = SPS
Fragment Type  8 = PPS
Fragment Type 28 = Video Fragment

的NAL字节是通过将NAL单元位从字节1和2一起创建。

现在取决于碎片型我做到以下几点:

SPS / PPS:

  1. 写NAL前缀( 0x00 0x00 0x01 ),然后将SPS或PPS数据

碎片与起始位

  1. 写NAL前缀
  2. 写NAL单元字节
  3. 写剩余的原始数据

碎片没有开始位

  1. 写原始数据

这意味着我的原始文件看起来是这样的:

[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]...

对于每一个PPS和SPS我在流数据发现,我只写一个NAL前缀(0×00 0×00 0×01),然后将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的书面之间的下列区别:

  1. 标题:FFmpeg的文件具有类似有关的0x30头的字节
  2. 页脚:ffmpeg的文件也有一个页脚
  3. 更改前缀和2个新的字节:

而从原始文件新的视频帧开始像[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]...

据我所知,视频流需要一个容器格式(纠正我,如果我错了,但我相信,新的页眉和页脚是负责这一点)。 但为什么它实际上改变一些字节的原始数据? 它不可能是因为流本身应该由球员,而不是的ffmpeg解码得到一些解码。

正如你所看到的,我不需要我的问题就更加说明了新的解决方案(这样我就可以自己解释)。 什么是ffmpeg的实际做? 为什么它会改变视频数据中的一些字节?

Answer 1:

除了增加在MP4容器,FFMPEG转换您的H.264附件B字节流(与NAL前缀)到一个长度前缀格式。

你的[0×00 0×00] [2“随机”字节]是一个32位整数,给予以下NAL单元的长度以字节为单位。



Answer 2:

貌似流得到了打包。 许多容器格式分裂位流为分组,并添加一个比特信息的诸如时间戳,分组的长度等。这给出了钩到解码器通过文件跳过不解码的一切,当分组丢失再同步,synching音频/视频,组合多个流等

看更多信息,MP4文件格式信息:
http://en.wikipedia.org/wiki/MPEG-4_Part_14



Answer 3:

你可以阅读更多关于开放更改H264规格 。 章附录B.



文章来源: H.264 conversion with FFmpeg (from a RTP stream)