【问题标题】:What does it mean if Android MediaCodec dequeueOutputBuffer returns -1?如果 Android MediaCodec dequeueOutputBuffer 返回 -1 是什么意思?
【发布时间】:2016-10-06 09:44:08
【问题描述】:

我按照 Android 官方文档使用 MediaCodec 对象为我的音频输入设置了编码器。但是下面代码中的dequeueOutputBuffer方法总是返回-1。这个返回值是什么意思?

我的代码:

/*configuarion of MediaCodec object*/
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_AAC_PROFILE,MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

codec.start();
 ByteBuffer[] inputBuffers = codec.getInputBuffers();
 ByteBuffer[] outputBuffers = codec.getOutputBuffers();

/*main loop to encode audio data*/
 for (;;) {
   int inputBufferIndex = codec.dequeueInputBuffer(-1); -->this is never zero so data should be written correctly!
   if (inputBufferIndex >= 0) {

     // write data from audiorecord in queue
     inputBuffer = inputBuffers[inputBufferIndex];
     inputBuffer.clear();

     inputBuffer.put(buf);-->data from audiorecord object

     encoder.queueInputBuffer(inputBufferIndex, 0, buf.length, 0, 0);
     codec.queueInputBuffer(inputBufferIndex, ...);

   }

   int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);-------->>> "-1"
   if (outputBufferIndex >= 0) {

       //do something but never called because outputbufferindex is always -1??

【问题讨论】:

  • 数据不会马上准备好。在输出可用之前,您可能需要提交多个缓冲区。另见bigflake.com/mediacodec
  • buf.length 的大小是多少?你会以某种方式向编码器发送正常的帧吗?也尝试将 codec.dequeueOutputBuffer(bufferInfo, 0) 更改为 codec.dequeueOutputBuffer(bufferInfo, 10000)

标签: android android-mediacodec


【解决方案1】:

当您传递非负的timeoutUS 时,返回值-1 表示对dequeueOutputBuffer 的调用已超时。根据Android Sample,它返回以下整数

 public static final int INFO_TRY_AGAIN_LATER = -1;

【讨论】:

  • 表示编码器当前正忙于当前循环迭代。你需要等到编码器完成它的工作。
【解决方案2】:

据我所知,您必须每次都增加 "encoder.queueInputBuffer" 中的 timestamp 字段,因为如果每次都给出相同的时间戳,则缓冲区可能会被 encoder 删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2012-09-06
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2012-11-02
    相关资源
    最近更新 更多