安防:
一种场景,安防厂家通过RTSP协议交互,再通过RTP回传音频数据,音频为G711格式,不过传输的数据采用了A-law algorithm压缩,所以如果需要播放,则需要先解压缩,然后再SDL_OpenAudio播放。
概念:
PCMA: G.711A(PCMU: G.711U) : 采样频率8000,采样精度16bit,单声道
G.711 标准下主要有两种压缩算法。一种是µ-law algorithm (又称often u-law, ulaw, mu-law),主要运用于北美和日本;另一种是A-law algorithm,主要运用于欧洲和世界其他地区。中国使用的是A-law algorithm。
以海康设备为例:G722编码时,音频数据的采样频率为16000,16位采样且是单通道的
音频为G711或者G726编码时,音频数据的采样频率为8000,16位采样且是单通道的
算法
PCM音频压缩A-Law算法,uLaw :测试成功
SDL方案:--单路验证成功
SDL播放音频(PCM) : SDL函数调用范例,有注释
SDL官方范例: https://wiki.libsdl.org/SDL_OpenAudio
最简单的视音频播放示例9:SDL2播放PCM : 有源码工程,推荐。 测试成功
Rtsp之音频 : a=rtpmap:8 PCMA/8000 可以看出是g711a格式,采样率是8000
SDL播放音频的时候发现SDL_OpenAudioDevice打开一直失败 : 多线程问题, 注意CoInitialize(NULL);
SDL_OpenAudioDevice : 无法播放,很奇怪。
SDL_OpenAudio: 可以播放。(但由于需要支持多路RTSP音频播放,放弃)
Qt方案:-多路播放验证成功
Qt播放PCM音频 : 测试成功
对比工具:
RTSP Windows专用播放器EasyPlayer : 稳定、兼容、高效、超低延时
VLC: 百度下载
SDL函数相关:
int SDL_OpenAudio(SDL_AudioSpec* desired, SDL_AudioSpec* obtained) 打开音频设备 |
void SDL_CloseAudio(void) 关闭音频设备 |
void SDL_PauseAudio(int pause_on) pause_on: 0, 暂停播放;1, 播放; |
void SDL_MixAudio(Uint8* dst, const Uint8* src, Uint32 len , int volume) dst: 目的缓冲区 |