通过 RTP 流发送 Android H264 捕获的视频

3
我正在为Android编写一个rtp视频流播放器,它从Android本地套接字读取H264编码数据并进行分组。问题是,我已经做到了,但客户端(Voip)仍然会出现黑色帧。

通信过程如下:Android -> Asterisk -> Jitsi (Osx) (反向)

有一些事情我还没有理解:

1)Android的MediaRecorder给我提供了一个原始的h264流,我怎么知道一个NAL何时开始/结束?它没有任何0x000001模式,但它确实有一个0x0000(我认为是一个分隔符)

编辑:

添加更多信息。这是输入缓冲区的2个(firstsecond)不同读取(按顺序)。如果我没弄错,前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==)参数,但没有任何变化。

干杯。

1个回答

0
  1. 不存在“android h264流格式”。如果使用RTP作为传输协议,则数据包应遵循RFC6184。在RTP负载格式中不存在起始码。RTP数据包中包含的内容完全取决于分组模式,该模式指定NAL单元是否可以聚合、分段等。请阅读RFC章节packetization modes以获取更多信息。分组模式通常通过SDP进行通信。

  2. 时间戳是RTP头的一部分。NAL单元的长度再次取决于分组模式。

  3. 你所说的“标记”是什么意思?你是指设置了RTP标记位吗?如果是这样,那么这也必须遵循RFC中规定的规则。


Android发送原始的h264流,需要进行解析(据我所知),但是我如何知道NAL应该从哪里开始/结束?这是我的疑点,我认为我漏掉了什么。 - FlaPer87
你确定它没有使用 RTP 吗? - Ralf
据我所知,它没有使用 RTP。我也没有找到任何文件说明这一点。 - FlaPer87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接