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

在Android上使用MediaCodec API解码AAC

翟默
2023-03-14

我正在尝试使用Android上的MediaCodec API来解码AAC流。(它是原始AAC。)我尝试使用MediaFormat.createAudioFormat()来创建要传递给MediaCodec.configure()的格式对象,但我在使用AAC(音频/mp4a-latm)时一直出错。(不过它适用于MP3(音频/mpeg)...)

最后,我为一个AAC文件创建了一个MediaExtractor,并查看了它生成的format对象。我看到它包含一个字节缓冲区的键“csd-0”,该字节缓冲区由两个字节组成,两个字节的值均为0x12。如果我在用于配置AAC编解码器的format对象中包含该键和值,一切都会正常工作。

有人知道发生了什么吗?留档指出我不应该配置那个键。有人有指向MediaCodec示例的指针来解码AAC文件而不使用MediaExtractor生成格式对象吗?

共有3个答案

贲言
2023-03-14

我在我测试的几个设备上解码/播放AAC内容没有问题。我的方法是首先使用MediaExtractor设置数据源,然后初始化MediaFormat,最后在一个循环中完成工作,缓冲区从MediaCodec送入/送出。对于表面,我使用了null,因为这只是一个音频播放器,所以没有什么可显示的。

国斌斌
2023-03-14

我使用了跟随代码并添加了删除ADTS头的ES,它可以很好地工作,但我真的不知道为什么要设置“csd-0”,否则编解码器会出现错误

      decoder = MediaCodec.createDecoderByType("audio/mp4a-latm");
      mMediaFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", 44100,2);
      byte[] bytes = new byte[]{(byte) 0x12, (byte)0x12};
      ByteBuffer bb = ByteBuffer.wrap(bytes);
      mMediaFormat.setByteBuffer("csd-0", bb);
施彬郁
2023-03-14

是的,编解码器配置2字节是你收到的初始数据。是的,它是原始aac数据块。你可以看到我在编码时是如何导出下面的格式的。我最初试图遵循留档,它说它们是latm格式的,并试图解析它。然后我在android留档上发现了一些“差异”,说输出确实是原始块。知道了这一点,这只是根据我的需要选择一个容器的问题。特别是,我需要adts容器而不是flv或mp4。

将有效负载数据复制到一个足以容纳您的容器的数组中,只需添加您的位。因此,在互联网上搜索我的解决方案后,我产生了以下代码:

profile = (configParams[0]>>3)&0x1f;

frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1;

channel_config = (this.configParams[1]>>3) &0xf;

int finallength = encoded_length + 7;       
ENCodedByteArray[0] = (byte) 0xff;
ENCodedByteArray[1] = (byte) 0xf1;
ENCodedByteArray[2] = (byte) ( ((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2));
ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11));
ENCodedByteArray[4] = (byte)( (finallength & 0x7ff) >> 3);
ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ;
ENCodedByteArray[6] = (byte) 0xfc;

用这样的方法:

byte chunkADTS[]=new byte[info.size + 7];
fillInADTSHeader(chunkADTS,info.size);
outputBuffers[bR].get(chunkADTS,7,info.size);
buffer.pushData(chunkADTS);
 类似资料:
  • 我目前正在尝试从RTP流解析H264数据,然后将其发送到MediaCodec以呈现在Android的SurfaceView上。 但是,我不确定如何: 根据RTP数据包正确构建H264切片 将H264切片组装成切片后发送到媒体编解码器

  • 我正在尝试使用android AudioRecord和MediaCodec对aac音频进行编码。我创建了一个非常类似于(使用Android MediaCodec从相机编码H.264)的编码器类。使用此类,我创建了一个AudioRecord实例,并告诉它将其byte[]数据读出到AudioEncoder(audioEncoder.offerEncoder(Data))。 这是我的音频记录设置 我成功

  • 问题内容: 有人尝试过使用Android应用程序吗? 可能吗?我试图从中使用Jar,并收到以下异常: 我使用的代码非常简单 我有,,和在我的目录中。 在我的服务器应用程序中,此代码可以在相同的库中正常工作。 问题答案: msgpack :可在Android上正常使用 msgpack-rpc :适用于Android,但有一个警告。 具体来说,您需要为API级别8(Android 2.2.1)添加以下

  • 我有一些用RNCryptor加密的图像文件,我想对它们进行解密,并将它们用作框架布局的背景。我浏览了示例文件,但我的应用程序force在一段时间后关闭,没有显示任何图像。我使用JNCryptor库 我将加密图像放入raw文件夹,如下所示: 这是我活动中的代码: 这个文件可以很好地iOS这个代码: 这里是logcat输出: 08-2819:52:11.720:E/AndroidRuntime(106

  • 我想实现与以下2个请求旋转: 1。在显示选择项列表时,文本如下图所示左对齐。4. 2。在选择一个项目后,我想让所选的一个显示右对齐,如下图所示。 我的旋转器布局旋转器布局如下: 和适配器的getView如下所示: 但是,如果将行改为. 将显示为picture.3和picture.4. 如何修改以同时到达picture.1和picture.4?

  • 本文向大家介绍Android AsyncTask使用以及源码解析,包括了Android AsyncTask使用以及源码解析的使用技巧和注意事项,需要的朋友参考一下 综述   在Android中,我们需要进行一些耗时的操作,会将这个操作放在子线程中进行。在子线程操作完成以后我们可以通过Handler进行发送消息,通知UI进行一些更新操作(具体使用及其原理可以查看Android的消息机制——Handl