无法在“表面输入”模式下使用Android平台的MediaCodec类

时间:2017-08-01 06:05:36

标签: android c++ mediacodec

我正在尝试编写一个简单的视频编码器,在“曲面输入”模式下使用Android平台的MediaCodec类。

这些是我正在遵循的步骤(为了简洁起见支持代码):

mediaCodec = MediaCodec::CreateByType(looper, "video/avc", true);
mediaCodec->configure(config, NULL, NULL, CONFIGURE_FLAG_ENCODE);
mediaCodec->createInputSurface(&inputSurface);
mediaCodec->start();

在此之后,我试图从创建的输入表面(这是一个IGraphiBufferProducer接口对象)出列缓冲区,但它失败并出现NO_INIT错误:

inputSurface->dequeueBuffer(&slot, &fence, w, h, format, 0);

ADB日志中的错误消息是:

BufferQueueProducer: [GraphicBufferSource] dequeueBuffer: BufferQueue has no connected producer

知道为什么缓冲区队列没有连接的生产者?我假设MediaCodec类将处理缓冲区队列的创建以及生产者和消费者与队列的连接。

我正在使用Android API级别26(7.1.2)。我正在使用平台级别的库,因为我的用例需要访问GraphicBuffer个对象。

提前致谢!

编辑:一般的想法是:

  • 从输入表面出发缓冲区&填补它们。
  • 将填充的缓冲区排队回输入表面(这可能会触发表面所属的媒体编解码器(视频编码器)实例 到)。
  • 从媒体编解码器实例中将输出缓冲区(包含原始H.264比特流数据)出列,并将其写入文件。
  • 将输出缓冲区释放回媒体编解码器实例。

1 个答案:

答案 0 :(得分:0)

来自IGraphiBufferProducer文档:

// * NO_INIT - the buffer queue has been abandoned or the producer is not
//             connected.

我猜您的代码中缺少的部分就是“连接”。

IGraphiBufferProducer有这样一种方法,你使用它吗?