gpt4 book ai didi

java - 如何将 H.264 UDP 数据包转换为可播放的媒体流或文件(碎片整理)

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:27 25 4
gpt4 key购买 nike

在将 SDP session 的 UDP 流转换为可解码的 H.264 流时,我遗漏了一些基本的东西。我正在使用支持 H.264 的摄像机进行测试,并且可以直接使用播放器播放流。当我尝试播放翻译后的流时,播放器无法识别它(缺少 header 错误)。但是,我必须解码 UDP 流才能将其集成到周围有一些解码器的 Java 应用程序中。

我已经看到了以下问题的非常好的答案:

  1. How to process raw UDP packets so that they can be decoded by a decoder filter in a directshow source filter
  2. Problem to Decode H264 video over RTP with ffmpeg (libavcodec)

两者都有一些令人困惑的小差异(见下文)。

但首先让我们看看简单的部分。正如我从摄像头看到的那样,发送了 SPS 和 PPS 数据包。所有剩余的数据包都是分片帧索引或未索引。

对于所有没有帧的数据包(在我的例子中只有 NALUnitType 7 和 8),我去掉了 RTP header (12 字节)并在前面添加起始字节 3 x 0 字节和 1 x 1 字节(00 00 00 01)。

对于所有分段的帧数据包,我根据答案 1 的描述重建它们。所以详细来说,这意味着:RTP header 的 strip (仅用于数据验证)。然后从payload中解码片段信息:

第一个字节:[ 3 NAL UNIT BITS | 5 片段类型位]
第二个字节:[起始位|结束位|保留位 | 5 个 NAL 单元位]

如果设置了起始位,则会有一个新的有效负载 header 构造如下:[3 NAL UNIT BITS(从第一个字节开始)| 5 NAL UNIT BITS(从第二个字节开始)]
这为我们提供了非 IDR 切片的 NALUnitType 1 或 IDR 切片的 5。符合规范。

我采用这个新的有效载荷 header (1 字节)并将没有 2 字节 header 的有效载荷附加到新包中。所有连续的片段都以相同的方式添加(12 字节的 RTP header 条,2 字节的单元类型信息条),直到看到结束位信息。当看到结尾时,我将起始字节 (00 00 00 01) 放在该数据包的前面并将其写出到流中。

问题是由于未知原因无法解码。我读过的答案的答案 2 的不同之处在于,有效负载 header 的第二个字节也可能被放入转换后的数据包中。但是我都试过了,还是没有运气。

可能在新构建的流中还缺少其他东西?还是我在碎片整理时出错了?

最佳答案

托马斯,

我正在尝试自己理解所有这些。在我看来,阅读此书:How to process raw UDP packets so that they can be decoded by a decoder filter in a directshow source filter您的“起始字节”偏移了一个字节。我认为它是 3 个字节,而不是四个...如:00 00 01

也许这就是它遇到问题的地方。

关于java - 如何将 H.264 UDP 数据包转换为可播放的媒体流或文件(碎片整理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com