当前位置: 首页 > 知识库问答 >
问题:

H264 RTP视频流被MediaCodec损坏

姚臻
2023-03-14

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

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?

下面是一个包含报头的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 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff0 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 10 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 5347 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 ff ff ff ff ffd0 5F f5 de c9 9E f7 f8 23 ab a5 aa

共有1个答案

龙骏
2023-03-14

是的,mediacodec需要先初始化SPS和PPS。您必须从SDP响应中提取SPS/PPS,SDP响应是RTSP握手期间发送给服务器(摄像机)的description命令的回复。SDP响应中有一个包含SPS/PPS的sprop参数集。您可以在WireShark上看到它们:

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

它们之间用逗号分隔,必须使用base64进行解码。请参阅以下说明:如何解码H264 SDP中的存储参数集?

 类似资料:
  • 我正在使用Java API实现一个解码器,用于解码实时H.264远程流。我正在使用回调()从本机层接收H.264编码数据,并在的上解码和呈现。我的实现已经完成(使用回调、解码和呈现等方式检索编码流)。下面是我的解码器类: 现在的问题是-流正在解码和呈现在表面,但视频不清楚。看起来像是框架被打破了,场景被扭曲了/脏了。移动是破碎的和方形的碎片到处(我真的很抱歉,因为我没有截图现在)。 关于我的流-它

  • 我已经使用Android MediaCodec库来转码视频文件(这里主要是更改分辨率示例代码) 我想做的另一件事是截断视频--只花15秒开始。逻辑是检查是否大于15秒,我将向解码器缓冲区写入。 但是我得到了一个异常

  • 我想将本地保存的视频文件压缩到更小的大小,以便上传到服务器。 自从我使用MediaCodec以来,我发现了一些压缩视频的技巧。以下是我遵循的步骤 1) . 使用MediaExrtactor提取媒体文件并对其进行解码。2) . 使用所需的文件格式创建编码器(3)。创建muxer以将文件保存在本地存储中。(不完整) 问题:但我不知道如何对已经解码的流进行编码,并使用MediaMuxer将其保存到本地存

  • 输出视频创建成功,没有任何问题,但mediacodec已经更改了更改的测试值,我无法检索它。 这是我的问题,这是一个正确的方法做视频隐写在Android?如果这不是正确的方法,你能提出一个建议吗?

  • 我正在尝试使用MediaCodec从视频中检索所有帧,用于图像处理,我正在尝试渲染视频并从outBuffers捕获帧,但我无法从接收到的字节启动位图实例。 我试着将它呈现为一个表面或无(null),因为我注意到当你呈现为null时,outBuffers将获得呈现帧的字节。 这是代码: 任何帮助都是非常有用的

  • 问题内容: 我正在尝试将用户相机拍摄的视频从UIImagePickerController压缩(不是现有视频,而是一个正在播放的视频)以上传到我的服务器,并花费少量时间这样做,因此较小的尺寸是理想的选择,而不是30-在更新质量的相机上为45 mb。 这是为iOS 8快速压缩的代码,压缩效果非常好,我轻松地从35 mb降至2.1 mb。 这是我的UIImagePickerController的代码,