我正在为 android 编写一个 rtp 视频流媒体,它从 Android 本地套接字读取 h264 编码数据并将其打包。问题是我做到了,但我在客户端(Voip)不断收到黑框。
通信是这样的:Android -> Asterisk -> Jitsi (Osx)(和反向)
有几点我还没有理解:
1) Android 的 mediarecorder 给了我一个原始的 h264 流,我怎么知道 NAL 何时根据该流开始/结束?它没有任何 0x000001 模式,但它确实有一个 0x0000 (我假设它是一个分隔符)
编辑:
添加更多信息。这些是输入缓冲区的 2 次(第一次,第二次)不同读取(按顺序)。如果我做对了,应该使用前 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]
这是来自星号的流的pcap捕获(来自 Android)。Android 设备是带有 Android ICS 的 Asus Transform Prime。
我在 sdp 中1
发送了打包模式(42801e
Z0KAHpWgUHxA
aM48gA==
干杯。