1 算法介绍Opus 是IETF 标准化的开源、免专利费音频编码格式RFC 6716由 Xiph.OrgVorbis/Speex 开发团队联合 Skype 团队共同推出2012 年正式标准化。下面是几种算法的比较编码授权时延优势擅长场景典型缺点Opus免费开源极低最小 2.5ms语音 音乐通用硬件解码器普及度略低于 AACAAC专利商用需授权较高帧长固定音乐媒体播放低码率语音表现差Speex开源低只适合语音音乐音质很差已停止维护被 Opus 替代Vorbis开源中等音乐语音性能一般最低时延不如 OpusMP3专利过期中等媒体音频低码率语音质量差最大特色是Opus 内部融合两套编码模式编码器自动切换也可手动强制CELT频域编码适合音乐、高音质音频类似 Vorbis基于 MDCT 变换SILK线性预测编码 LPC源自 Skype专门优化人声语音类似 Speex。 编码器根据带宽、码率、音频内容动态混合两种模式兼顾语音清晰度与音乐保真度。几个关键参数采样率支持 8kHz / 12kHz / 16kHz / 24kHz / 48kHz最高 48kHz 全频声道单声道、立体声码率范围6 kbps ~ 510 kbps6~20kbps窄带语音对讲机、低带宽语音20~64kbps宽带语音VoIP、通话64kbps 以上音乐、高保真音频帧长时延关键参数可选2.5ms / 5ms / 10ms / 20ms / 40ms / 60ms2 Opus的使用树莓派为例2.1 一般命令sudo apt updatesudo apt install opus-tools ffmpeg -yopusenc --bitrate 32 input.wav output.opusopusdec input.opus output.wav2.2 ALSA命令# 从 ALSA 麦克风捕获 raw PCM 数据并直接打入 opusenc 管道arecord -f S16_LE -r 48000 -c 1 -t raw | opusenc --raw --raw-rate 48000 - output.opus2.3 libopus#include stdio.h #include opus/opus.h #define SAMPLE_RATE 48000 #define CHANNELS 1 #define FRAME_SIZE 960 // 20ms 48kHz int main() { int error; // 1. 创建编码器 OpusEncoder *encoder opus_encoder_create(SAMPLE_RATE, CHANNELS, OPUS_APPLICATION_VOIP, error); if (error ! OPUS_OK) { printf(Failed to create encoder: %s\n, opus_strerror(error)); return -1; } // 动态调整码率 (例如设为 32 kbps) opus_encoder_ctl(encoder, OPUS_SET_BITRATE(32000)); opus_int16 pcm_buffer[FRAME_SIZE]; // 输入的 PCM 采样数据 unsigned char opus_out[512]; // 输出的压缩 Buffer // 2. 执行编码 (返回值为压缩后的实际字节数) int encoded_bytes opus_encode(encoder, pcm_buffer, FRAME_SIZE, opus_out, sizeof(opus_out)); printf(Encoded frame size: %d bytes\n, encoded_bytes); // 3. 销毁编码器 opus_encoder_destroy(encoder); return 0; }2.4 GStreamer使用发送gst-launch-1.0 alsasrc ! audioconvert ! audioresample ! \opusenc bitrate32000 ! rtpopuspay ! \udpsink host192.168.1.100 port5000接收gst-launch-1.0 udpsrc port5000 capsapplication/x-rtp, mediaaudio, clock-rate48000, encoding-nameOPUS ! \rtpopusdepay ! opusdec ! autoaudiosink
Opus压缩算法(TODO)
1 算法介绍Opus 是IETF 标准化的开源、免专利费音频编码格式RFC 6716由 Xiph.OrgVorbis/Speex 开发团队联合 Skype 团队共同推出2012 年正式标准化。下面是几种算法的比较编码授权时延优势擅长场景典型缺点Opus免费开源极低最小 2.5ms语音 音乐通用硬件解码器普及度略低于 AACAAC专利商用需授权较高帧长固定音乐媒体播放低码率语音表现差Speex开源低只适合语音音乐音质很差已停止维护被 Opus 替代Vorbis开源中等音乐语音性能一般最低时延不如 OpusMP3专利过期中等媒体音频低码率语音质量差最大特色是Opus 内部融合两套编码模式编码器自动切换也可手动强制CELT频域编码适合音乐、高音质音频类似 Vorbis基于 MDCT 变换SILK线性预测编码 LPC源自 Skype专门优化人声语音类似 Speex。 编码器根据带宽、码率、音频内容动态混合两种模式兼顾语音清晰度与音乐保真度。几个关键参数采样率支持 8kHz / 12kHz / 16kHz / 24kHz / 48kHz最高 48kHz 全频声道单声道、立体声码率范围6 kbps ~ 510 kbps6~20kbps窄带语音对讲机、低带宽语音20~64kbps宽带语音VoIP、通话64kbps 以上音乐、高保真音频帧长时延关键参数可选2.5ms / 5ms / 10ms / 20ms / 40ms / 60ms2 Opus的使用树莓派为例2.1 一般命令sudo apt updatesudo apt install opus-tools ffmpeg -yopusenc --bitrate 32 input.wav output.opusopusdec input.opus output.wav2.2 ALSA命令# 从 ALSA 麦克风捕获 raw PCM 数据并直接打入 opusenc 管道arecord -f S16_LE -r 48000 -c 1 -t raw | opusenc --raw --raw-rate 48000 - output.opus2.3 libopus#include stdio.h #include opus/opus.h #define SAMPLE_RATE 48000 #define CHANNELS 1 #define FRAME_SIZE 960 // 20ms 48kHz int main() { int error; // 1. 创建编码器 OpusEncoder *encoder opus_encoder_create(SAMPLE_RATE, CHANNELS, OPUS_APPLICATION_VOIP, error); if (error ! OPUS_OK) { printf(Failed to create encoder: %s\n, opus_strerror(error)); return -1; } // 动态调整码率 (例如设为 32 kbps) opus_encoder_ctl(encoder, OPUS_SET_BITRATE(32000)); opus_int16 pcm_buffer[FRAME_SIZE]; // 输入的 PCM 采样数据 unsigned char opus_out[512]; // 输出的压缩 Buffer // 2. 执行编码 (返回值为压缩后的实际字节数) int encoded_bytes opus_encode(encoder, pcm_buffer, FRAME_SIZE, opus_out, sizeof(opus_out)); printf(Encoded frame size: %d bytes\n, encoded_bytes); // 3. 销毁编码器 opus_encoder_destroy(encoder); return 0; }2.4 GStreamer使用发送gst-launch-1.0 alsasrc ! audioconvert ! audioresample ! \opusenc bitrate32000 ! rtpopuspay ! \udpsink host192.168.1.100 port5000接收gst-launch-1.0 udpsrc port5000 capsapplication/x-rtp, mediaaudio, clock-rate48000, encoding-nameOPUS ! \rtpopusdepay ! opusdec ! autoaudiosink