最近在自己抽時間做一個通用的視訊監控用戶端,通過rtsp協定擷取媒體流然後解碼渲染,在這個過程中發現音頻流比視訊流慢大概4~5秒,初步懷疑是音頻播放子產品引發的。
舊的音頻播放使用SDL_OpenAudio、SDL_PauseAudio加回調實作,因為回調中何時讀取音頻資料不由我的程式控制,懷疑問題出現在這裡,檢視SDL2相關資料後發現有新的音頻播放接口代替SDL_OpenAudio,即SDL_OpenAudioDevice,但是使用過程中發現,切換為SDL_OpenAudioDevice播放音頻時一直沒有聲音,通過多次分析測試發現問題出現在SDL_OpenAudioDevice的參數中,當第5個參數為SDL_AUDIO_ALLOW_ANY_CHANGE時,會發生無法播放聲音的問題,将該值改為SDL_AUDIO_ALLOW_FREQUENCY_CHANGE後可以正常播放聲音。可正常播放代碼如下:
int num = SDL_GetNumAudioDevices(0);
const char* deviceName = SDL_GetAudioDeviceName(num, 0);
m_deviceID = SDL_OpenAudioDevice(deviceName, 0, &m_audioSpec, NULL, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
if (m_deviceID < 2)
{
LOG_DEBUG("SDL_OpenAudioDevice with error deviceID : %d", m_deviceID);
return false;
}