我試圖使用SDL2附帶的SMPEG2庫在緩衝區中加載MP3。每個SMPEG函數調用返回都沒有錯誤,但是當我完成時,聲音緩衝區充滿了零。SDL2&SMPEG2 - 試圖讀取MP3的空聲音緩衝區
下面的代碼:
bool LoadMP3(char* filename)
{
bool success = false;
const Uint32 Mp3ChunkLen = 4096;
SMPEG* mp3;
SMPEG_Info infoMP3;
Uint8 * ChunkBuffer;
Uint32 MP3Length = 0;
// Allocate a chunk buffer
ChunkBuffer = (Uint8*)malloc(Mp3ChunkLen);
SDL_RWops *mp3File = SDL_RWFromFile(filename, "rb");
if (mp3File != NULL)
{
mp3 = SMPEG_new_rwops(mp3File, &infoMP3, 1, 0);
if(mp3 != NULL)
{
if(infoMP3.has_audio)
{
Uint32 readLen;
// Inform the MP3 of the output audio specifications
SMPEG_actualSpec(mp3, &asDeviceSpecs); // static SDL_AudioSpec asDeviceSpecs; containing valid values after a call to SDL_OpenAudioDevice
// Enable the audio and disable the video.
SMPEG_enableaudio(mp3, 1);
SMPEG_enablevideo(mp3, 0);
// Play the MP3 once to get the size of the needed finale buffer
SMPEG_play(mp3);
while ((readLen = SMPEG_playAudio(mp3, ChunkBuffer, Mp3ChunkLen)) > 0)
{
MP3Length += readLen;
}
SMPEG_stop(mp3);
if(MP3Length > 0)
{
// Reallocate the buffer with the new length (if needed)
if (MP3Length != Mp3ChunkLen)
{
ChunkBuffer = (Uint8*)realloc(ChunkBuffer, MP3Length);
}
// Replay the entire MP3 into the new ChunkBuffer.
SMPEG_rewind(mp3);
SMPEG_play(mp3);
bool readBackSuccess = (MP3Length == SMPEG_playAudio(mp3, ChunkBuffer, MP3Length));
SMPEG_stop(mp3);
if(readBackSuccess)
{
// !!! Here, ChunkBuffer contains only zeros !!!
success = true;
}
}
}
SMPEG_delete(mp3);
mp3 = NULL;
}
SDL_RWclose(mp3File);
mp3File = NULL;
}
free(ChunkBuffer);
return success;
}
廣泛基礎上SDL_Mixer,我不能爲我謨,是根據它的侷限性使用該代碼的。
我知道Ogg Vorbis會是一個更好的文件格式選擇,但我正在移植一個非常古老的項目,而且它完全可以用MP3播放。
我確定音響系統已經正確初始化,因爲我可以播放WAV文件。它的初始化頻率爲44100,2個通道,1024個採樣和AUDIO_S16SYS格式(後者是我從SMPEG源中瞭解到的,是強制性的)。
我已經根據比特率,MP3數據量和OpenAudioDevice音頻規格計算了預期的緩衝區大小,並且所有內容都是一致的。
我不明白爲什麼除了緩衝區數據以外的任何東西似乎都在工作。
更新#1
仍在試圖弄清楚什麼是錯的,我想支持MP3可能無法正常工作,所以我創建了以下功能:
SMPEG *mpeg;
SMPEG_Info info;
mpeg = SMPEG_new(filename,&info, 1);
SMPEG_play(mpeg);
do { SDL_Delay(50); } while(SMPEG_status(mpeg) == SMPEG_PLAYING);
SMPEG_delete(mpeg);
的MP3播放。所以,解碼應該實際上是工作。但那不是我需要的;我真的需要聲音緩衝區數據,所以我可以把它發送到我的調音臺。