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

使用mediacodec的Aac编码器初始化为一个通道,但输出为两个通道

毕魁
2023-03-14

aac解码器初始化如下:

MediaFormat outfmt = new MediaFormat();
outfmt.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
outfmt.setInteger(MediaFormat.KEY_AAC_PROFILE, mAudioProfile);
mSampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
outfmt.setInteger(MediaFormat.KEY_SAMPLE_RATE, mSampleRate);
mChannels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
outfmt.setInteger(MediaFormat.KEY_CHANNEL_COUNT, mChannels);
outfmt.setInteger(MediaFormat.KEY_BIT_RATE, 64000);
audioEncoder.configure(outfmt, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
            audioEncoder.start();

但编码器在两种设备上的行为不同。

一个输出正常表示:64000 128000 192000 256000 320000

另一个输出为两个通道:64000 64000 128000 128000 192000 192000 256000 256000 320000 320000

使用MediaExtractor提取的html" target="_blank">格式在两种设备上有所不同:

正常的是{max input size=1572864,aac profile=2,csd-0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2],采样率=16000,durationUs=8640000,channel count=1,mime=audio/mp4a latm,isdmmextractor=1}

另一个是{max input size=798,durationUs=8640000,channel count=1,mime=audio/mp4a latm,csd-0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2],sample rate=16000}

因此,原始音频有一个通道,编码器也配置了一个通道。但编码器以双通道方式输出。

这与ISDMextractor标志有关系吗?

帮助救命@法登

共有1个答案

翟柏
2023-03-14

首先,这个问题很难理解——列出的两个MediaFormat内容都显示channel-count=1,因此对问题本身的实际解释很少,只有对其他周围细节的解释。

然而,一些Android版本(如果我没记错的话,可能是4.1,也可能是4.2)中的软件AAC解码器会将单声道AAC解码为立体声——不确定一些硬件AAC解码器是否也会这样做。你可以争论这是一个错误还是只是意外的行为,但这是你必须忍受的。如果解码器返回立体声数据,即使输入是单声道,两个立体声通道将具有相同的(单声道)内容。

因此,基本上,你必须准备好处理这个问题——要么将实际格式信息从解码器(而不是从MediaExtractor)传递给使用数据的人(例如,将音频输出重新配置为立体声),要么准备将立体声混合回单声道,如果你真的需要以单声道格式输出。

 类似资料:
  • 问题很简单,但我没有任何线索来解决它: 我编写一行代码来在我的Nexus 4(Android 4.4.2)上创建AAC编码器 保存在“codec”中的返回值不为空,但我在Logcat中收到一条红色错误消息: 我还尝试了另一条线: 并得到相同的错误结果。 在使用MediaCodec之前,我是否错过了任何初始化步骤?我在官方文档中没有找到有关此的任何信息。 有人遇到过这个问题吗? 实际上,我正在尝试将

  • 我试图用以下参数初始化AAC编码器:AAC profile=5,mime=audio/mp4a latm,比特率=12000,通道计数=1,采样率=8000 但是编解码器初始化失败并出现以下错误: 06-14 19:17:58.009 6194-6450/? E/SoftAACEncoder2:无法为配置文件/采样率/比特率/通道初始化编码器 06-14 19:17:58.010 6194-644

  • 大小范围在2.5MB-20MB之间。这个问题在较长的剪辑上变得更糟,例如7分钟的范围是9MB-120MB。 正常吗? 我试图捕捉同样的场景,但还是得到了不同的结果。

  • 我正在尝试使用使用编解码器对一些音频流进行编码。为此,我使用了google cts ExtractEncodeMust的这个实现。 对于某些aac文件,它会在编码某些帧后抛出。更准确地说,它会在第1030行抛出异常,。 我正在配置如下: 我完全不知道如何解决这个问题。任何形式的帮助都将不胜感激。 带有一些日志的堆栈跟踪: 设备:小米POCO x3 操作系统:Android10 导致溢出的示例文件信

  • 我正在使用MediaCodec将PCM数据转换为AAC,并使用MediaMuxer将此aac数据存储到m4a文件中。没有视频。 该文件会生成,甚至会播放。但是没有声音。如果我将aac文件导入Audacity,它不会显示任何数据。音频的长度甚至是预期的时间。我知道数据正在被编码,尽管我不确定这些数据是否被正确编码。 对pcm数据进行编码: 我已经浏览了大量示例,我所做的一切似乎都是正确的。如果我在o

  • 问题内容: 我有一个包含未初始化通道的结构。 当我向它写入内容时,该例程将按预期方式阻塞,但是永远不会通知读者管道中有东西。 我很惊讶没有错误,我想知道Go在做什么。 在下面的示例中,消息和消息均未打印。(取消注释初始化,它将像超级按钮一样起作用) 这是操场https://play.golang.org/p/76zrCuoeoh (我知道我应该初始化通道,这不是问题的目的,我想知道使用未初始化的通