繁体   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