[英]How to play two channel wav file with OpenSLES on Android in C++?
我找到了一個Google示例 ,可以在C ++中使用OpenSLES播放1聲道音頻。 如果我嘗試播放兩通道的wav文件並替換
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_8,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
同
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_44_1,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
在此C文件中 ,應用程序崩潰。
無法弄清楚我還應該更改什么? 為了播放不同的格式,可能應該對AudioPlayer或OutputMix進行不同的初始化嗎?
有一個代碼兩次調用CreateOutputMix來播放2聲道音頻,但是看起來有些奇怪。 這是正確的嗎?
兩個問題:
我看到的一個問題是OpenSLES.h文件中的注釋 :
SLDataFormat_PCM已棄用 。 請改用SLDataFormat_PCM_EX。
/** PCM-type-based data format definition where formatType must be SL_DATAFORMAT_PCM*/
/* SLDataFormat_PCM IS DEPRECATED. Use SLDataFormat_PCM_EX instead. */
typedef struct SLDataFormat_PCM_ {
SLuint32 formatType;
SLuint32 numChannels;
SLuint32 samplesPerSec;
SLuint32 bitsPerSample;
SLuint32 containerSize;
SLuint32 channelMask;
SLuint32 endianness;
} SLDataFormat_PCM;
/** PCM-type-based data format definition where formatType must be SL_DATAFORMAT_PCM_EX*/
typedef struct SLDataFormat_PCM_EX_ {
SLuint32 formatType;
SLuint32 numChannels;
SLuint32 sampleRate;
SLuint32 bitsPerSample;
SLuint32 containerSize;
SLuint32 channelMask;
SLuint32 endianness;
SLuint32 representation;
} SLDataFormat_PCM_EX;
第二期:
在您鏈接到的文件中:android-ndk / native-audio / app / src / main / cpp / native-audio-jni.c
第297行:
// configure audio source
SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_8,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
804行:
// configure audio sink
SLDataLocator_AndroidSimpleBufferQueue loc_bq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_16,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
您說將代碼更改為此會導致崩潰:
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_44_1,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
您不應該使用它:
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 2 SL_SAMPLINGRATE_44_1,
SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT,
SL_BYTEORDER_LITTLEENDIAN
};
問題:
使用不推薦使用的調用,這些調用在未知設備上可能沒有經過良好調試的代碼(在其他品牌或仿真器上進行測試)。
您應該使用:
format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
參考: Android OpenSL“ pAudioSrc:數據格式2不允許”-拒絕SL_DATAFORMAT_PCM?
你說; “ ...應用程序崩潰。”。 為什么不讓錯誤處理程序彈出一條消息,解釋該調用后引發了哪個錯誤,在消除該錯誤后,程序應僅退出()而不是“崩潰”。
PS:我沒有開發環境設置來測試您的代碼,所以我沒有更多幫助。 當然,已經有足夠的示例實現已得到改進,可以針對您的設備進行測試。 當我們不知道您要使用哪個電話或編譯器查找已知錯誤時,提供幫助無疑會更加困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.