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

使用MediaCodec和MTK编解码器进行编码时选择H264配置文件

呼延哲
2023-03-14

我们有一个Android应用程序,把视频编码成H264。在所有以前试用过的Android设备上,这个编码为基线配置文件,这是我需要的。

联想Yoga10的编解码器是omx.mtk.video.encoder.avc。这将视频编码为高轮廓,这给接收设备带来了问题。

共有1个答案

贝镜
2023-03-14

您可以尝试将键profile添加到您的MediaFormat中,其值为1(OMX_Video_AVCProfileBaseline)。如果您这样做,您可能还需要添加键level以及与您的分辨率匹配的级别值(使用OMX AVC级别常量中的值)。

我不确定这个编解码器是否真的符合要求的值,但它可能值得一试。

有关安装过程的示例,请参阅https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/acodec.cpp中的setupavcencoderparameters函数。它在输入参数(从您提供的MediaFormat复制)中查找profile键,但如果存在这一项,您还需要提供level参数,使用什么级别取决于您的分辨率。请参阅https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/omx_video.h以获取可用于参数的常量值。

但是在检查配置文件和级别参数之后,它似乎也会将配置文件覆盖到基线,而不管设置了什么。因此,要么这些行已从设备中删除,要么编码器完全忽略H264Type.eProfile字段。

如果有人得到了一个更接近设备实际使用的源树,那么检查一下就更好了。

作为如何为您的解决方案选择合适级别的示例,请参阅http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284中的x264_validate_levels(但是传递给MediaFormat的级别需要使用omx_video_avcleveltype常量来表示)。

不确定这是否有帮助,但至少值得一试。

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

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

  • 我正在尝试用Android6.0的MediaCodec将h264编码成实时低延迟的流。有大约6帧的延迟从编码器,我想知道如何减少 零件代码为: 编码器以320×480 60 fps的速度由屏幕表面馈入,通过dequeueOutputBuffer()输出流数据。大约有6个帧的数据没有被dequeueOutputBuffer()及时返回到编码器。换句话说,当馈送第n帧时,编码器输出第(N-6)帧的数据

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

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

  • 我能解码一个mp4视频。如果我使用配置解码器,我可以在屏幕上看到视频。现在,我要编辑帧(添加一条黄线,甚至更好的是重叠一个微小的图像),并将视频编码为一个新的视频。不需要显示视频,我现在也不关心性能。(如果我在编辑时显示帧,如果编辑功能花费大量时间,我可能会有间隙),那么,你给我推荐什么呢?还是用GlSurface配置解码器,使用(GLES),或者用null配置解码器,以某种方式将转换为,修改它,