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

mediacodec解码h264流限制

楚煜
2023-03-14

我正在使用mediacodec对三星S6上的h264流进行解码,发现mediacodec的输入缓冲区必须以“0001”开头(并且不需要设置pps、sps),否则ACodec将报告错误。

我也尝试使用mediaextractor播放一个mp4文件,它工作良好,但缓冲区到mediacodec不是以“0001”开始。

我不知道为什么decodec一个h264流有这样的限制,目前我需要从socket分析流,并将数据切割成小包(每个包以0001开头)然后交给mediacodec,但是效率很低。

MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1024, 1024);

共有1个答案

臧友樵
2023-03-14

一些特定的解码器也可以解码“MP4”格式的H264 NAL单元(使用不同类型的起始代码),但这并不是所有设备都能保证的。

(尽管IMO让MediaExtractor返回只有当前设备的解码器才能处理的数据是错误的,因为人们可能希望使用MediaExtractor读取文件,但将压缩后的数据通过网络发送到另一个设备进行解码,在这些情况下,以非标准格式返回数据是错误的。)

正如fadden所写的,MediaCodec运行在完整的NAL单元上,因此您需要以这种格式提供数据(即使您觉得这样做效率很低)。如果您通过套接字接收的数据格式(关于帧边界的信息)不容易获得,那么这是您的协议格式的问题(例如,实现RTP接收并不容易!),而不是MediaCodec本身的问题--解码之前需要完整的帧,而不是在完整的帧之前能够提供随机块,这是一个相当常见的限制。这不应该是低效的,除非您自己的实现是低效的。

 类似资料:
  • 我正在解码从Android上的wifi摄像头接收到的原始h264。 这是解码时产生的视频的一个例子,除了底部部分看起来很好。 我还注意到一些奇怪的事情,当我移动摄像机时,饲料似乎运行几乎完全流畅(底部没有垃圾),一旦我把它放下,垃圾视频返回(我会以为它是相反的方式...) 我正在将h264数据解析成以澳元开头的块,每个块以澳元开头,当另一个开始时结束。 我的理解是,每个解析的“块”(以AUD开头)

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

  • 这是本问题的后续问题。 这是我的代码: 我的问题-我的实现对于呈现由解码的H264流是否可以?或者我需要做EGL设置或其他什么? 提前道谢!

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

  • 我正在尝试解码h264现场流从WIFI摄像头的madiacodec在Galaxy S3,视频播放还可以,但似乎mediacode低电平总是缓冲1秒的视频帧,一个新的帧可以解码只有一个新的传入NAL单元。这会导致大约1秒的延迟。 调用时,我可以从logcat看到分配了22个缓冲区, 我可以看到大约16个NAL单元需要推入解码器才能得到任何帧。 我的问题是为什么这个视频缓冲?如果这是问题所在,我可以尝

  • 我正在开发一个通过RTP接收H264编码数据的应用程序,但我无法让Android的MediaCodec输出任何内容。我正在按照https://stackoverflow.com/a/7668578/10788248对RTP数据包进行解包 在编码帧被重新组装后,我将它们输入到出列的输入缓冲区中。 当我对输入缓冲区进行排队时,我不会得到任何错误,但是解码器的回调从来不会调用onOutputBuffer