我正在为Android编写一个rtp视频流,它从Android本地套接字读取h264编码数据并将其打包。问题是我做到了,但我一直在客户端获得黑框(Voip)。
沟通如下:Android - >星号 - > Jitsi(Osx)(和反向)
我还有一些事情尚未被理解:
1)Android的mediarecorder为我提供了一个原始的h264流,我怎么知道NAL何时基于该流开始/结束?它没有任何0x000001模式,但它确实有一个0x0000(我假设它是一个分隔符)
修改
添加更多信息。这些是输入缓冲区的2(first,second)个不同的读取(按顺序)。如果我做对了,前4个字节应该用来获得NALU长度而第5个字节(索引4)是NALU头。
我会在这里复制字节的值以供将来使用:
1) 0 0 12 114 101 -72 4 25 -15 -1 -121 -53 .....
length = (114&0xFF) + (12&0xFF)*256 + (0&0xFF)
length -> 3186
forbidden = 101 & 0x80
forbidden -> 0
nri = 101 & 0x60
nri -> 96
nal_unit_type = 101 & 0x1F
nal_unit_type -> 5
2) 0 0 1 -93 97 -32 32 103 -14 93 -1 ....
length = (-93&0xFF) + (1&0xFF)*256 + (0&0xFF)
length -> 419
forbidden = 97 & 0x80
forbidden -> 0
nri = 97 & 0x60
nri -> 96
nal_unit_type = 97 & 0x1F
nal_unit_type -> 1
这是对的吗?
2)如何从该流中获取NALu时间戳及其长度?
3)由于某种原因,正在标记数据包(即使我取消设置标记)。 (如果你检查pcap文件)[ FIXED:我没有为每个数据包使用相同的SSCR]
这是来自星号的流的pcap捕获(来自Android)。 Android设备是带有Android ICS的Asus Transform Prime。
我正在sdp发送打包模式(1
)和个人资料级别ID(42801e
),我也尝试发送sprops(sps:{{1} },psp:Z0KAHpWgUHxA
)参数但没有改变。
干杯。
答案 0 :(得分:0)
1)没有" android h264流格式"。如果RTP用作传输协议,则分组应遵循RFC6184。 RTP有效载荷格式不存在起始码。 RTP数据包中包含的内容完全取决于分组模式,该模式指定是否可以聚合,分段等NAL单元。有关详细信息,请阅读packetization modes上的RFC部分。打包模式通常通过SDP进行通信。
2)时间戳是RTP头的一部分。 NAL单元的长度再次取决于分组化模式。
3)你的意思是什么?你的意思是RTP标记位已设置?如果是这样,这又必须遵循RFC中规定的规则。