【问题标题】:Send Android h264 capture over a rtp stream通过 rtp 流发送 Android h264 捕获
【发布时间】:2012-05-20 17:03:28
【问题描述】:

我正在为 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]

这是来自星号(来自 Android)的流的pcap 捕获。 Android 设备是带有 Android ICS 的 Asus Transform Prime。

我在 sdp 中发送打包模式 (1) 和配置文件级别 ID (42801e),我也尝试发送 sprops (sps: Z0KAHpWgUHxA, psp: @987654328 @) 参数,但没有任何改变。

干杯。

【问题讨论】:

    标签: android voip h.264 asterisk rtp


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

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

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

    【讨论】:

    • Android 发送一个必须解析的原始 h264 流 (AFAIU) 但我怎么知道 NAL 应该从哪里开始/结束?这就是我的观点,我认为我遗漏了一些东西。
    • 你确定它没有使用 RTP 吗?
    • AFAIK 它没有使用 RTP。我也没有找到任何文件说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2012-04-10
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多