作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一个带有缓冲区队列源和输出混合接收器的 AudioPlayer
。我已经使用与 ndk 示例中显示的格式非常相似的 pcm 格式配置源,但 OpenSL 拒绝 SL_DATAFORMAT_PCM
(“数据格式 2”)。这对我来说没有任何意义。
这是错误(在三星 Galaxy S2 上):
02-27 15:43:47.315: E/libOpenSLES(12681): pAudioSrc: data format 2 not allowed
02-27 15:43:47.315: W/libOpenSLES(12681): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED)
这是相关代码:
SLuint32 channels = 2;
SLuint32 speakers = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
SLuint32 sr = SL_SAMPLINGRATE_48;
//...
SLDataFormat_PCM format_pcm = {
SL_DATAFORMAT_PCM,
channels,
sr,
SL_PCMSAMPLEFORMAT_FIXED_16,
SL_PCMSAMPLEFORMAT_FIXED_16,
speakers,
SL_BYTEORDER_LITTLEENDIAN
};
// Configure audio player source
SLDataLocator_AndroidBufferQueue loc_bufq =
{SL_DATALOCATOR_ANDROIDBUFFERQUEUE, 2};
SLDataSource audioSrc = {&loc_bufq, &format_pcm};
// configure audio player sink
SLDataLocator_OutputMix loc_outmix =
{SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
SLDataSink audioSnk = {&loc_outmix, NULL};
// create audio player
const SLInterfaceID iidsOutPlayer[] = {SL_IID_ANDROIDBUFFERQUEUESOURCE};
const SLboolean reqsOutPlayer[] = {SL_BOOLEAN_TRUE};
result = (*engineItf)->CreateAudioPlayer(
engineItf,
&(outPlayerObject),
&audioSrc, &audioSnk,
1, iidsOutPlayer,reqsOutPlayer);
有谁知道是什么原因造成的?谢谢!
最佳答案
可能是您的设备不支持音频采样率。试试 SL_SAMPLINGRATE_8
而不是 SL_SAMPLINGRATE_48
或选择其他设备 (Nexus 4/HTC One) 进行测试。
如果您在语音通信时听到失真的声音,请增加录音机缓冲区大小,您也可以尝试更改采样率。其他采样率选项有:SL_SAMPLINGRATE_16
、SL_SAMPLINGRATE_32
、SL_SAMPLINGRATE_44_1
等
每个 Android 设备都有特定/首选的缓冲区大小和采样率。您可以从以下 Java 代码段中获得首选缓冲区大小和采样率。请注意,audioManager.getProperty() 不适用于 API 级别<17。
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);
关于java - Android OpenSL "pAudioSrc: data format 2 not allowed"- 拒绝 SL_DATAFORMAT_PCM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083255/
我正在尝试创建一个带有缓冲区队列源和输出混合接收器的 AudioPlayer。我已经使用与 ndk 示例中显示的格式非常相似的 pcm 格式配置源,但 OpenSL 拒绝 SL_DATAFORMAT_
我是一名优秀的程序员,十分优秀!