【问题标题】:H264 RTP video stream corrupted with MediaCodecH264 RTP 视频流被 MediaCodec 损坏
【发布时间】:2018-09-16 17:59:25
【问题描述】:

我可以在我的 TextureView 中看到正在播放的视频,但它已严重损坏。我已经确认我正在以正确的顺序接收完整的数据包。我已经能够正确解析 RTP 标头。我相信我的问题与 SPS 和 PPS 以及 MediaCodec 有关。

我的理解是,您应该从消息中剥离 RTP 标头,并在消息的开头插入一个 0x00000001 的 RTP 起始代码,以便解码器的输入缓冲区的格式为 0x00000001[sps ] 0x00000001[pps] 0x00000001[视频数据].

我的困惑是 MediaCodec 似乎需要一个 MediaFormat ,其中 SPS 和 PPS 分别手动定义。我发现了我目前正在使用的这个示例以及我上面定义的消息格式:

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height);

// from avconv, when streaming sample.h264.mp4 from disk
byte[] header_sps = {0, 0, 0, 1, 0x67, 0x64, (byte) 0x00, 0x1e, (byte) 0xac, (byte) 0xd9, 0x40, (byte) 0xa0, 0x3d,
            (byte) 0xa1, 0x00, 0x00, (byte) 0x03, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x0F, 0x16, 0x2D, (byte) 0x96}; // sps
byte[] header_pps = {0, 0, 0, 1, 0x68, (byte) 0xeb, (byte) 0xec, (byte) 0xb2, 0x2C}; // pps


format.setByteBuffer(CSD_0, ByteBuffer.wrap(header_sps));
format.setByteBuffer(CSD_1, ByteBuffer.wrap(header_pps));

如您所见,我没有为 MediaFormat 提供来自我的视频流的 SPS 和 PPS,而是使用来自 Internet 示例的硬编码集。我试图找到解释如何从数据包中提取 SPS 和 PPS 的来源,但找不到任何东西。

问题:

如果已经为 MediaFormat 提供了 SPS 和 PPS,我是否应该在将其传递给 MediaCodec 之前从缓冲区中剥离 SPS 和 PPS?

如何正确解析消息中的 SPS 和 PPS?

这是我的一个 RTP 数据包的前几个字节,其中包含标头:

80 a1 4c c3 32 2c 24 7a f5 5c 9f bb 47 40 44 3a 40 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 0 0 1 c0 0 71 80 80 5 21 0 5d d6 d9 ff fb 12 c4 e7 0 5 5c 41 71 2c 30 c1 30 b1 88 6c f5 84 98 2c 82 f5 84 82 44 96 72 45 约 96 30 35 91 83 86 42 e4 90 28 b1 81 1a 6 57 a8 37 b0 60 56 81 72 71 5c 58 a7 4e af 67 bd 1​​0 13 1 afe e9 71 15 13 da a0 15 d5 72 38 36 2e 35 11 31 10 a4 12 1e 26 28 40 b5 3b 65 8c 30 54 8a 96 1b c5 a7 b5 84 cb a9 aa 3d d4 53 47 0 45 34 55 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff bf 9 95 2b 73 93 4e c3 f9 b1 d0 5f f5 de c9 9e f7 f8 23 ab 一个5个啊

【问题讨论】:

    标签: android video-streaming h.264 rtp android-mediacodec


    【解决方案1】:

    是的,您是正确的,媒体编解码器需要首先初始化 SPS 和 PPS。您必须从 SDP 响应中提取 SPS/PPS,该响应是在 RTSP 握手期间发送到服务器(相机)的 DESCRIBE 命令的响应。在 SDP 响应中有一个包含 SPS/PPS 的 sprop 参数集。你可以在 WireShark 上看到它们:

    Media format specific parameters: sprop-parameter-sets=Z2QAKKwbGoB4AiflwFuAgICgAAB9AAAOph0MAHz4AAjJdd5caGAD58AARkuu8uFAAA==,aO44MAA=
    

    它们以逗号分隔,并且必须使用 Base64 解码。看这个解释:How to decode sprop-parameter-sets in a H264 SDP?

    【讨论】:

    • 大部分时间 SPS 和 PPS 将在流中定期发送,如果已经有数据在流式传输,您可以在那里提取它。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2015-06-17
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多