android – 解码音频文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位

android – 解码音频文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位,第1张

概述我想将音频文件解码为原始PCM数据,以将其流式传输到本地网络中的播放设备.我使用了API级别16引入的新的 MediaExtractor和 MediaCodec类.该器件要求PCM数据为44,100 kHz,有2个通道和16位样本大小.只要输入文件大致符合这些要求,这就可以正常工作.但是,无论何时我正在解码使用的文件 – 例如 – 32,000 kHz的采样率并且可能只有一个通道,那么我无法从Me 我想将音频文件解码为原始PCM数据,以将其流式传输到本地网络中的播放设备.我使用了API级别16引入的新的 MediaExtractor和 MediaCodec类.该器件要求PCM数据为44,100 kHz,有2个通道和16位样本大小.只要输入文件大致符合这些要求,这就可以正常工作.但是,无论何时我正在解码使用的文件 – 例如 – 32,000 kHz的采样率并且可能只有一个通道,那么我无法从MediaCodec类获得所需的输出.

因为我似乎无法指定MediaCodec类的输出格式.所以我决定实例化另一个MediaCodec对象,将原始数据重新编码为我想要的格式.根据supported media formats AndroID列表支持自AndroID 4.1以来编码到PCM / Wave.但是我无法创建编码为PCM / Wave的MediaCodec对象.我尝试将各种MIME类型传递给MediaCodec.createEncoderByType(type);但我总是以IOException失败:

java.io.IOException: Failed to allocate component instanceat androID.media.MediaCodec.native_setup(Native Method)at androID.media.MediaCodec.<init>(MediaCodec.java:210)at androID.media.MediaCodec.createEncoderByType(MediaCodec.java:194)[..]

你有没有人能够成功创建一个编码为PCM / Wave的MediaCodec实例,并能为我提供一个有效的例子吗?

解决方法 根据我们在评论中的对话,这个答案涉及使用OpenSL将音频数据解码到PCM.不幸的是,我无法使用MediaCodec类提供类似的答案.

首先,设置一个AndroID NDK项目(使用Eclipse:右键单击项目,AndroID工具 – >添加本机支持…).然后,在创建的AndroID.mk文件中,至少需要链接到OpenSL库:

LOCAL_LDliBS += -lOpenSLES

如果您还不熟悉NDK项目,那么旧的互联网上会有很多教程,例如here和here.

一旦你有一个NDK项目工作,总的目标是设置一个音频播放器作为PCM的解码器.实际上有一个example in the NDK samples正是如此.它比你制作一个最小功能的工具要复杂一点,但它应该让你前进.有一个非常容易理解的描述正在发生的事情at this link(搜索“解码音频到PCM”).我在评论中为您提供了相关OpenSL spec的链接,但又有了.指定数据接收器时需要使用的SLDataFormat_PCM结构如下所示:

SLDataFormat_PCM pcm = {    SL_DATAFORMAT_PCM,2,// numChannels    SL_SAMPliNGRATE_44_1,// samplesPerSec    SL_PCMSAMPLEFORMAT_FIXED_16,// bitsPerSample    SL_PCMSAMPLEFORMAT_FIXED_16,// containerSize    SL_SPEAKER_FRONT_left |        SL_SPEAKER_FRONT_RIGHT,// channelMask    SL_BYTEORDER_liTTLEENDIAN     // endianness};

按照示例和描述性指南,您将使用AndroID简单缓冲区队列数据定位器和上述数据格式定义SLDataSink.然后,播放器应为您提供一系列包含正确格式数据的缓冲区.然后,您可以将该数据传递回Java,或者(更好地)从本机代码传输数据.

总结

以上是内存溢出为你收集整理的android – 解码音频文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位全部内容,希望文章能够帮你解决android – 解码音频文件并重新编码为所需的PCM格式:44,100 kHz,2个通道,16位所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1136604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存