Android AudioRecord 和 AudioTrack 编解码器选项?

标签 android audio pcm codec amr

我目前在 Android 中使用 AudioTrack 和 AudioRecord 类。

我使用纯 PCM 数据,但我想知道其他编解码器有哪些选择?

来自 this page好像只能用AMR窄带编解码?

我目前按如下方式设置音频类:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                     11025,
                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                     AudioFormat.ENCODING_PCM_16BIT,
                     buffersize);

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                     11025,
                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                     AudioFormat.ENCODING_PCM_16BIT,
                     buffersize,
                     AudioTrack.MODE_STREAM);

所以我的问题是如何将编码从 PCM 更改为其他受支持的编解码器之一?

当我尝试更改 AudioFormat 上的 ENCODING_PCM_16BIT 时,我只会看到默认或无效编码选项以及 PCM 选项。

如果有人知道这里的任何帮助或任何帮助,任何关于在 Android 上编码和解码音频的教程的链接都会很棒。

谢谢

编辑:我已将我的代码更改为以下内容:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                     11025,
                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                     **MediaRecorder.AudioEncoder.AMR_NB**,
                     buffersize);

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                     11025,
                     AudioFormat.CHANNEL_CONFIGURATION_MONO,
                     **MediaRecorder.AudioEncoder.AMR_NB**,
                     buffersize,
                     AudioTrack.MODE_STREAM);

代码运行正常,但我想知道它是否真的将音频编码为 AMR_NB,这是否不是正确的方法?

我在使用原始 PCM 时出现缓冲区溢出,但自从使用新代码并使用 MediaRecorder.AudioEncoder.AMR_NB 而不是 AudioFormat.PCM 后就没有出现缓冲区溢出

最佳答案

正如 AudioRecordAudioTrack 的文档所述:

audioFormat     the format in which the audio data is represented. See ENCODING_PCM_16BIT and ENCODING_PCM_8BIT

您只能使用 8 位和 16 位 PCM。如果你想要其他格式的音频,要么不要使用 AudioRecordAudioTrack(试试 MediaRecorderMediaPlayer)或者您将不得不使用自己的代码对其进行转码,可能会利用 NDK。

AudioRecordAudioTrack 专为 OpenCORE 多媒体引擎不支持相关音频的情况而设计,因为它不是受支持的编解码器或不受支持流协议(protocol)(例如 SIP)。

关于Android AudioRecord 和 AudioTrack 编解码器选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192120/

相关文章:

android - 以编程方式发送whatsapp音频文件

java - 如何知道 ListView 特定行的复选框值

android - 尽管 Realm 被模拟,但实际的 close() 方法被调用

audio - 跨站点 swf 加载和播放 mp3

html - 音频标签自动播放在安卓浏览器中不起作用

c - 在 2ch PCM 上添加 440HZ 音调(合并 PCM、噪声叠加)

c - 如何在c程序中将u-law和a-law编码的wav文件转换为pcm wav文件?

android - 无法从 SQLite 中检索数据表示列在 android (Eclipse) 中不存在

java - 写入 SD 卡 "java.io.FileNotFoundException: Permission denied"

android - 从 Android 中的解码声音文件绘制音频波形