最近在自己抽时间做一个通用的视频监控客户端,通过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;
}