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

在Android中解码原始H264流?

伏建修
2023-03-14

我有一个项目,我被要求在android中显示一个视频流,该流是原始的H.264,我正在连接到一个服务器,并将从服务器接收一个字节流。

基本上,我想知道有没有一种方法可以将原始字节发送到android的解码器并显示在Surface上?

我使用Android4.1中新的MediaCodec和MediaExtractor API成功地解码了包装在mp4容器中的H264,不幸的是,我没有找到使用这些API解码原始H264文件或流的方法。

我知道一种方法是编译和使用FFmpeg,但我更愿意使用一种可以使用HW加速的内置方法。我也知道android支持RTSP流,但这不是一个选项。Android版本不是问题。

共有1个答案

令狐宏伟
2023-03-14

不幸的是,我不能提供任何代码,但我将尽我所能,根据我如何使它工作的基础上解释它。

下面是我如何使用MediaCodec类使原始H.264编码视频工作的概述。

使用上面的链接有一个获得解码器设置和如何使用它的例子,你将需要设置它解码H264 AVC。

现在,如果您设置了用于解码H.264 AVC的解码器,并且有来自解码器的InputBuffer,那么您就可以开始了。您需要用一个NAL单元填充这个InputBuffer并将其传递回解码器,并在流的长度上继续这样做。但是,要使这个工作,我必须首先传递给解码器一个SPS(序列参数集)NAL单元。该单元在起始前缀(第4个字节)之后有一个字节值0x67,在某些设备上,解码器将崩溃,除非它首先接收到该单元。基本上直到你找到这个单元,忽略所有其他NAL单元并保持解析流直到你得到这个单元,然后你就可以把所有其他单元传递给解码器。

有些设备不需要SPS,有些则需要,但您最好先通过它。

现在,如果您有一个曲面,当您配置它时,您将它传递给解码器,那么一旦它获得足够的NAL单位,一个帧,它就应该显示在曲面上。

 类似资料:
  • 我从服务器接收到h264数据,我想在Android上使用mediacodec和texture view对该流进行解码。我从服务器获取数据,解析它得到SPS、PPS和视频帧数据,然后我将该数据传递给mediacodec,但函数dequeueOutputBuffer(info,100000)总是返回-1,并且我得到dequeueOutputBuffer超时。 请帮忙,我三周来一直在忙这个问题。 这是用

  • 这是我对线下的后续问题 Android Lollipop 5.0.2上慢速H264 1080p@60fps解码 在调试上述问题的根本原因的过程中,我尝试了各种方法以60 fps的速度解码1080p。 > 我尝试将H264数据包装到MP4容器中(不进行代码转换)。各种库存播放器的MP4播放速度都比较慢(60fps以下,42fps左右)。 我尝试使用来自Android NDK的本机编解码器示例。还是没

  • 我之前也尝试使用此方法创建Mediacodec 但视频质量与YouTube上分享的视频一样。

  • 大小范围在2.5MB-20MB之间。这个问题在较长的剪辑上变得更糟,例如7分钟的范围是9MB-120MB。 正常吗? 我试图捕捉同样的场景,但还是得到了不同的结果。

  • 我现在正在Android上对一个h264字节流进行解码。流是从第三方产品发送的,我不太确定它的视频格式。该文件说,流由PPS和SPS NAL单位组成。但我接收到的h264字节流包括以0x00、0x00、0x00、0x01开头的序列,并且在我接收到的样本中,第5个字节可能是0x09、0x21或0x06。这让我兴奋了一段时间,因为它似乎与通常的0x67或0x68指示器不同。有人知道NAL单元头中的0x

  • 我正在尝试用android低级媒体API实时解码h264 nals。 每个nal都包含一个完整的帧,所以我希望在用我的nal提供输入并调用之后,它会“立即”(当然有一个litle延迟)显示我的帧,但它没有显示。我看到了第一个帧,出列器返回第一个缓冲区,只有在将第二个缓冲区馈送给解码器之后才返回第一个缓冲区,此时该缓冲区应该呈现第二个帧。帧编码时预置为x264,因此没有B帧等。 我想可能有一种方法可