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

设备上的音频编解码器dequeueInputBuffer返回-1

端木乐语
2023-03-14

我正在尝试播放从MPEG2传输(. ts)文件中获取的一些音频。我通过MediaExtractor获取音频流,使用readSampleData将样本复制到MediaCodec输入缓冲区,然后将MediaCodec输出缓冲区写入AudioTrack。MediaExtractor将音频MIME类型指示为“音频/mp4a-latm”。

所有这些都可以在Nexus 7 2013平板电脑上完美运行。

但它在价格低廉的Neutab x7平板电脑上根本不起作用。问题是,在几个样本之后,dequeueInputBuffer会反复返回-1。评论电话录音。write()并没有改变这一事实,所以问题在于MediaCodec的操作。

代码如下(日志记录,省略了一些错误处理):

  audioInputBufferIndex = audioCodec.dequeueInputBuffer(TIMEOUT);
  if (audioInputBufferIndex >= 0) {
    audioInputBuffers[audioInputBufferIndex].clear();
    sampleSize = audioExtractor.readSampleData(audioInputBuffers[audioInputBufferIndex], 0);
    audioPresentationTimeUs = audioExtractor.getSampleTime();
    audioCodec.queueInputBuffer(audioInputBufferIndex,0,sampleSize,audioPresentationTimeUs,0);
    audioOutputBufferIndex = audioCodec.dequeueOutputBuffer(audioBufferInfo, TIMEOUT);
    if (audioOutputBufferIndex >= 0) {
      ByteBuffer buffer = audioOutputBuffers[audioOutputBufferIndex];
      byte[] chunk = new byte[audioBufferInfo.size];
      buffer.get(chunk);
      buffer.clear();
      if (audioTrack != null & chunk.length > 0) {
        audioTrack.write(chunk, 0, chunk.length);
        audioExtractor.advance();
      }
      audioCodec.releaseOutputBuffer(audioOutputBufferIndex,false);

audioCodec配置了从audioExtractor获得的MediaFormat。我尝试将TIMEOUT增加到大值,但没有乐趣。

为什么这段代码在这两个设备上的行为会不同?有旋钮要转动吗?

Neutab上有一个“Videos”应用程序可以很好地播放此文件。Logcat透露它也在使用MediaExtractor和AudioTrack,但显然没有使用MediaCodec。我在logcat中看到Omx*条目,所以可能它直接使用libstanefright。

共有1个答案

邓韬
2023-03-14

就我阅读您的代码而言,每次尝试将一个输入缓冲区排队时,您只会尝试将输出缓冲区出列一次。

请记住,解码器是异步运行的,并且只有有限的输入和输出缓冲区。即使解码器对输入缓冲区进行解码,输出也可能无法立即在输出缓冲区中使用。在这种情况下,增加超时值可能会有所帮助,但不能保证。

尝试拆分两个if语句,以便在循环中每次调用dequeueOutputBuffer,即使dequeueInputBuffer没有返回任何缓冲区。

 类似资料:
  • 16 音频编码器 介绍当前可用的音频编码器 aac AAC(Advanced Audio Coding )编码器 当前原生(内置)编码器还处于实验阶段,而且只能支持AAC-LC(低复杂度AAC)。要使用这个编码器,必须选择 ‘experimental’或者’lower’ 因为当前还处于实验期,所以很多意外可能发生。如果需要一个更稳定的AAC编码器,参考libvo-aacenc,然而它也有一些负面报

  • 问题内容: 我一直在努力用Java播放aac编码的音频文件。 我们在第一学期末有一个小组项目,希望有一个背景音乐,并且那里几乎没有音效。最后,我们使用了WAV文件,因为我们无法播放AAC。 问题答案: 这个周末,我再次尝试了一次,然后再次搜索,并且从不同的站点一起搜索了一个工作代码,但是没有一个完整的工作解决方案。 为了在以后的项目中更舒适地使用,我为我准备了一个小库,用于AAC播放。 由于很难找

  • AndroidLollipop现在支持USB音频开箱即用。但是,我希望能够控制到USB音频设备的音频路由。Android SDK中是否有任何方法允许这种程度的控制?我尝试使用setForceUse,但这在不同的设备上是不一致的,而且似乎只适用于未连接USB音频设备的情况(更不用说SetForceUser没有USB选项)。 例如,我希望我的应用程序能够在普通手机耳机插孔上播放,但通过切换按钮,可以将

  • 13 音频解码器 介绍一些有效的音频解码器 ac3 AC-3 音频解码器,该解码器实现在ATSC A/52:2010 和 ETSI TS 102 366部分,以及RealAudio 3(又名DNET)中。 ac3解码器选项 -drc_scale value 动态范围因子。该因子适合应用于从AC-3流中获取的动态值范围。这个值是指数值。有3个显着效果的典型值(范围): drc_scale == 0

  • 我在使用媒体​流式录制API,用于录制用户的麦克风。该代码在chrome windows上运行良好,但在android上,它只会在录制哔哔声后立即停止录制。 如何使API在android设备上工作 我是否遗漏了什么,或者这是Web音频API的错误? 代码如下: 然后我就用这些台词开始录音: 还有这个要停下来玩:

  • 问题内容: 我正在尝试获取文件的大小,然后再下载。我曾经这样做,它在我的家用计算机Android 2.1 Emulator上运行良好。 但是,一旦我从手机(WiFi或3G)运行我的应用程序,该功能将无法使用,而当我从工作笔记本电脑的Android 2.1仿真器中运行该应用程序时,它也将无法使用。 有谁知道解决方法?还有另一种方法可以获取文件的大小,而无需使用。 问题答案: 此信息并非始终可用。通常