我正在尝试编写一个应用程序来传输像SipDroid这样的视频,但SipDroid只会使用H263编解码器来传输视频。 我想用H264编解码器流式传输视频,所以我要写一个nal标题。
我从这里得到了一些信息:http://www.networkdictionary.com/rfc/rfc3984.php?page=0%2C0 我决定使用碎片单元进行流式处理(5.8。碎片单元(FU)(第8页))。
我试图像这样创建一个nal标题:
nal header http://www.networkdictionary.com/images/rfc3984f14.gif
指标的以下值:
indicator http://www.networkdictionary.com/images/rfc3984-3.gif
F = 0, NRI = 2, Type = 28;
和标题:
header http://www.networkdictionary.com/images/rfc3984-4.gif
S=0 (1 at first packet), E = 0 (1 at last packet), R = 0, Type = 1;
在客户端和服务器端正确设置数据包的值。但我无法从这些数据包中读取任何视频流。
服务器是一个简单的java服务器,它接收数据并将其写入文件。 我也尝试在vlc播放器上显示流,但它也不起作用。
有人知道问题是什么,或者在服务器端获取视频流缺少什么?
修改
好吧,我想我已经解决了这个问题。我试图从(vlc播放器)rtp流中获取标头值。在此流中,数据包格式取决于帧大小。对于1个数据包,帧大小足够小,因此必须将数据包声明为具有以下值的单个nal数据包:NAL头:f 0,nri 2,类型1.如果帧大小大于数据包大小,则数据包得到拆分,格式看起来就像我在我的问题中发布的那样。答案 0 :(得分:2)
请注意,RFC 3984已被RFC 6184取代,但这不会影响此问题。
理论上你可以有一个S = 1且E = 1的FU数据包,但这是浪费的比特。一个兼容的解码器应该正确解码它,但它是一个我怀疑是运用良好的测试用例。
另外请确保您在SDP的fmtp中使用packetization-mode = 1或接收器不应正确解码它(尽管有些可能无论如何)。 FU-A在模式0中不可用,这是默认设置。