我正在为Android编写一个rtp视频流播放器,它从Android本地套接字读取H264编码数据并进行分组。问题是,我已经做到了,但客户端(Voip)仍然会出现黑色帧。
通信过程如下:Android -> Asterisk -> 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文件)[已解决:我没有为每个数据包使用相同的SSCR]
这是来自Asterisk的流的pcap捕获。 Android设备是带有Android ICS的Asus Transform Prime。
我在sdp中发送了分组模式(1
)和配置文件级别ID(42801e
),我还尝试发送sprops(sps:Z0KAHpWgUHxA
,psp:aM48gA==
)参数,但没有任何变化。
干杯。