使用MediaCodec

时间:2018-04-06 16:32:09

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

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

我的理解是你应该从消息中剥离RTP头,并在消息的开头插入一个RTP开始代码0x00000001,这样你的解码器输入缓冲区的形式为 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,而是使用来自互联网示例的硬编码集。我试图找到解释如何从数据包中提取SPS和PPS但未能找到任何内容的来源。

问题:

如果MediaFormat已经提供SPS和PPS,我是否应该将SPS和PPS从我的缓冲区中删除,然后再将其传递给MediaCodec?

如何从邮件中正确解析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 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 ca 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 af 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 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   a5 aa

1 个答案:

答案 0 :(得分:1)

是的,你是正确的,mediacodec需要首先初始化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?