簡體   English   中英

如何在C ++中的Android上使用OpenSLES播放兩個通道的wav文件?

[英]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
};
  • 問題:

    1. 使用不推薦使用的調用,這些調用在未知設備上可能沒有經過良好調試的代碼(在其他品牌或仿真器上進行測試)。

    2. 您應該使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM