Android OpenSL:What';当通过AASET_读取加载wav文件时,是否会导致静态?

Android OpenSL:What';当通过AASET_读取加载wav文件时,是否会导致静态?,android,audio,android-ndk,opensl,Android,Audio,Android Ndk,Opensl,我正在做一个本地android项目,并试图使用OpenSL来播放一些音频效果。根据VisualGDB提供的本机音频示例项目,我编写了下面发布的代码 在结尾处,您可以看到我对一行进行了注释,该行将名为hello的变量的内容存储在缓冲区中,并将其发送到目标。hello来自示例项目,包含大约700行字符字节,如下所示: “\x02\x00\x01\x00\xff\xff\x09\x00\x0c\x00\x10\x00\x07\x00\x07\x00” 这使得有人说“你好”的音频文件。当将字节数据读入流

我正在做一个本地android项目,并试图使用OpenSL来播放一些音频效果。根据VisualGDB提供的本机音频示例项目,我编写了下面发布的代码

在结尾处,您可以看到我对一行进行了注释,该行将名为hello的变量的内容存储在缓冲区中,并将其发送到目标。hello来自示例项目,包含大约700行字符字节,如下所示:

“\x02\x00\x01\x00\xff\xff\x09\x00\x0c\x00\x10\x00\x07\x00\x07\x00”

这使得有人说“你好”的音频文件。当将字节数据读入流时,我的代码工作正常,运行应用程序时听到“hello”。然而,当我从wav文件读取以播放我想要的资产时,我只听到静态的声音。数据缓冲区的大小与文件的大小相同,因此看起来它被正确地读入。在wav文件期间(或非常接近wav文件)静态播放

我对数据格式或音频编程一无所知。我尝试过使用不同的枚举值调整pcm变量的格式,但没有成功。使用我在互联网上找到的一个名为GSpot的工具,我知道以下关于我试图播放的音频文件的信息:

文件大小:557KB(570503字节)(这与数据缓冲区的大小相同 AAsset_读取返回

编解码器:PCM音频

采样率:48000Hz

比特率:1152 kb/s

频道:1

任何帮助或指导都将不胜感激

SLDataLocator_AndroidSimpleBufferQueue loc_bufq = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1 };
SLDataFormat_PCM format_pcm;
format_pcm.formatType = SL_DATAFORMAT_PCM;
format_pcm.numChannels = 1;
format_pcm.samplesPerSec = SL_SAMPLINGRATE_48;// SL_SAMPLINGRATE_8;
format_pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_8; // SL_PCMSAMPLEFORMAT_FIXED_16;
format_pcm.containerSize = 16;
format_pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;

SLDataSource audioSrc = { &loc_bufq, &format_pcm };

// configure audio sink
SLDataLocator_OutputMix loc_outmix = { SL_DATALOCATOR_OUTPUTMIX, manager->GetOutputMixObject() };
SLDataSink audioSnk = { &loc_outmix, NULL };

//create audio player
const SLInterfaceID ids[3] = { SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND, SL_IID_VOLUME };
const SLboolean req[3] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };

SLEngineItf engineEngine = manager->GetEngine();
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk,
    3, ids, req);

// realize the player
result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);

// get the play interface
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);

// get the buffer queue interface
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE,
    &bqPlayerBufferQueue);

// register callback on the buffer queue
result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);

// get the effect send interface
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_EFFECTSEND,
    &bqPlayerEffectSend);

// get the volume interface
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);

// set the player's state to playing
result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);

uint8* pOutBytes = nullptr;
uint32 outSize = 0;
result = MyFileManager::GetInstance()->OpenFile(m_strAbsolutePath, (void**)&pOutBytes, &outSize, true);
const char* filename = m_strAbsolutePath->GetUTF8String();
result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, pOutBytes, outSize);
// result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, hello, sizeof(hello));
if (SL_RESULT_SUCCESS != result) {
    return JNI_FALSE;
}

有几件事是罪魁祸首。我测试的wave文件的格式与规范中描述的不一样。在头数据的第一块之后似乎有很多空数据。此外,需要传递到队列的缓冲区需要是一个字符*的wav数据,而不是头。我错误地假设队列已解析头球出界了