我正在为 android 编写一个 rtp 视频流媒体,它从 Android 本地套接字读取 h264 编码数据并将其打包。问题是我做到了,但我在客户端(Voip)不断收到黑框。
通信过程如下:Android -> Asterisk -> Jitsi (Osx)(以及反向)
有几件事我还没有理解:
1)Android的mediarecorder给我一个原始的h264流,我如何知道基于该流的NAL何时开始/结束?它没有任何 0x000001 模式,但它确实有一个 0x0000 (我假设它是分隔符)
EDIT:
添加更多信息。这些是 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。
我正在发送打包模式(1
) 和配置文件级别 ID (42801e
)在sdp中,我还尝试发送sprops(sps:Z0KAHpWgUHxA
, psp: aM48gA==
)参数但没有改变。
Cheers.
-
没有“android h264 流格式”。打包应该遵循RFC6184如果使用 RTP 作为传输协议。 RTP 有效负载格式中不存在起始代码。 RTP 数据包中包含的内容完全取决于打包模式,该模式指定 NAL 单元是否可以聚合、分段等。请阅读 RFC 部分打包模式了解更多信息。打包方式通常通过SDP进行通信。
-
时间戳是 RTP 标头的一部分。 NAL 单元的长度同样取决于打包模式。
-
你说的标记是什么意思?您的意思是设置了 RTP 标记位吗?如果是这样,则必须再次遵循 RFC 中规定的规则。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)