当前位置: 首页 > 知识库问答 >
问题:

H.264与FFmpeg的转换(来自RTP流)

傅毅然
2023-03-14

环境:

到目前为止我做了什么:

我获取所拥有原始流数据并对其进行解析。由于数据是通过RTP传输的,我需要处理NAL字节、SPS和PPS。

1.编写原始文件

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字节是通过将来自字节1和2的NAL单位位放在一起来创建的。

现在,根据碎片类型,我执行以下操作:

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前缀(0x000x000x01),然后编写SPS/PPS本身。

现在我不能用一些媒体播放器播放这个数据,这导致我:

2.转换文件

由于我想避免过多地使用编解码器,所以我使用了一个现有的应用程序->FFMPEG。我用这些参数调用它:

ffmpeg.exe-f h264-i -vcodec copy-r 25 .mp4

-f h264:这应该告诉ffmpeg我有一个h264编码流

-vcodec copy:手册页中的引用:

强制视频编解码到编解码。使用“copy”特殊值告知原始编解码器数据必须按原样复制。

这就引出了我的问题:

我到底做了什么?

我的问题不是它不起作用。我只想/需要知道我对调用FFMPEG实际做了什么。我有一个原始的H264文件,我不能播放。使用FFmpeg后,我可以播放它。

原始的raw文件(我已经编写了)和FFMPEG编写的文件有以下区别:

  1. 头:FFmpeg文件有大约0x30字节的头
  2. 页脚:FFmpeg文件也有页脚
  3. 已更改前缀和2个新字节:

当原始文件中的新视频帧以[NAL前缀][NAL单位字节][Raw视频数据]的方式开始时,新文件中的视频帧如下所示:

[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实际上是做什么的?为什么它会改变视频数据中的某些字节?

共有1个答案

微生永春
2023-03-14

除了添加MP4容器之外,ffmpeg还将H.264附件B字节流(带有NAL前缀)转换为长度前缀格式

您的[0x00 0x00][2“随机”字节]是一个32位整数,以字节为单位给出了以下NAL单元的长度。

 类似资料:
  • 我想把一个MP4文件转换成一个MPEG-DASH视频,可以通过Chrome上的Dash-if HTML5播放器播放。我使用FFMPEG和MP4Box(来自GPAC)对视频进行转码,然后对其进行拆分,并在JavaScript控制台上不断得到一个MEDIA_ERR_SRC_NOT_SUPPORTED错误。 从网上提供的(非常稀疏的)信息(请参见此Chromium线程)来看,Chrome似乎只支持带有约

  • H.264分析器可以用来分析学习H.264码流结构。可以比较详细的列出H.264码流中NAL的信息。

  • 我已从安装ffmpeg 3.0https://github.com/FFmpeg/FFmpeg,我正在尝试将用mepeg4第2部分编码的视频转换为H264,但我得到未知编码器“libx264”错误 我试过h264, x264, libx264,都不管用) 我查看了支持的编解码器列表 这里是h264: 我使用的是ffmpeg 3.0,从列表中可以看出,似乎不支持h264编码,只支持h264解码,对吗

  • 我正在对来自IP摄像机的视频(H.264)和音频(AAC)进行一些集成工作。 我取得了一些进步,我可以存储视频 我现在正在尝试将流混合到MP4文件中,而不进行任何解码或编码,但到目前为止还没有找到答案。 我可以通过ffmpeg:ffmpeg-I录制手动完成。h264-i录音。aac-vcodec副本-acodec副本-absf aac_adtstoasc记录。mp4 如何使用C中的ffmpeg库执

  • 我想使用ffmpeg将RTP流转换为MP4(HTTP)流,这样我就可以在html视频标签中播放, 但我只能成功地转码到flv格式。 下面是我的设置: “其他信息” 输入格式 如果有人知道如何解决或需要更多的信息,请告诉我,谢谢!

  • 以下代码: 无论单击的按钮如何,都会显示以下错误: j_idt6: discount tCode:验证错误。 这是怎么造成的,我该如何解决?