播放器系列4——PCM重采样

FFmpeg重采样过程

swr_alloc创建重采样上下文 swr_alloc_set_opts设置重采样参数 swr_init初始化重采样器 swr_convert执行重采样 swr_free释放资源

swr_alloc_set_opts
c 复制代码
struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
                                      int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
                                      int64_t  in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
                                      int log_offset, void *log_ctx);
  • 功能: 分配并设置重采样上下文
  • 参数 :
    • s: 现有SwrContext指针,可为NULL
    • out_ch_layout: 输出声道布局
    • out_sample_fmt: 输出采样格式
    • out_sample_rate: 输出采样率
    • in_ch_layout: 输入声道布局
    • in_sample_fmt: 输入采样格式
    • in_sample_rate: 输入采样率
    • log_offset: 日志偏移量
    • log_ctx: 日志上下文
  • 返回值: 成功返回SwrContext指针,失败返回NULL
swr_init
c 复制代码
int swr_init(struct SwrContext *s);
  • 功能: 初始化重采样上下文
  • 参数 :
    • s: SwrContext指针
  • 返回值: 成功返回0,失败返回负值错误码
swr_convert
c 复制代码
int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,
                                const uint8_t **in , int in_count);
  • 功能: 执行重采样
  • 参数 :
    • s: SwrContext指针
    • out: 输出缓冲区
    • out_count: 输出采样数
    • in: 输入缓冲区
    • in_count: 输入采样数
  • 返回值: 成功返回输出采样数,失败返回负值错误码
swr_free
c 复制代码
void swr_free(struct SwrContext **s);
  • 功能: 释放重采样上下文
  • 参数 :
    • s: 指向SwrContext指针的指针
  • 返回值: 无

重采样介绍

在本项目中使用ffmpeg对pcm数据进行重采样,使其输出格式满足SDL的要求。

重采样主要改变了三部分内容

  • 采样率
  • 采样格式
  • 声道数

1.重采样的目的

1.匹配设备的采样率

在日常开发中会发现,采购的不同品牌的声卡可能支持的sample_rate不同,比如常见的有44100Hz、48000Hz等。这时候如果将不匹配的pcm数据输入到声卡中,会出现无声或者杂音的情况。因此需要在输入到声卡之前对pcm数据进行重采样,使其采样率与声卡支持的采样率一致。

2.优化存储和传输效率

降低采样率可以减少音频文件的大小,从而节省存储空间和带宽资源。例如,将高采样率(如48kHz)的音频降采样到更低的采样率(如16kHz),虽然会损失一定的音质,但显著减少了文件大小。

我们开发的电视扬声器只有左右声道,那么我们可以将解析出来的pcm数据重采样为2声道,然后在通过音效节点处理,这样可以减少计算量,提高效率。

3.解决混音需求

  • 在K歌软件中,话筒采集到的声音需要与伴奏混合然后通过输出设备输出,假如话筒采集到的pcm数据采样率为48000Hz,而扬声器播放的音频采样率为44100Hz,这时候就需要对麦克风采集到的pcm数据进行重采样,使其采样率与扬声器播放的音频采样率一致,这样才能做之后的MIX处理。
  • 有时候会有多个APP同时从扬声器播放出声音,如果每个app设置的sample_rate不同,那么也会出现无法mix的情况。因此也需要有模块对每个app的音轨resample成相同的sample_rate,然后再进行mix处理。

源码地址

https://github.com/OrangeKitten/VideoPlayer

相关推荐
VidDown1 天前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
可乐鸡翅yeah_2 天前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
开开心心就好3 天前
本地文件搜索工具推荐,占用小速度还快
智能手机·ffmpeg·ocr·word·音视频·网络攻击模型·安全架构
我科绝伦(Huanhuan Zhou)3 天前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
RS迷途小书童3 天前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
开开心心就好3 天前
视频压缩工具推荐,画质效果很能打
智能手机·ffmpeg·ocr·word·排序算法·音视频·散列表
可乐鸡翅yeah_4 天前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
redfred4 天前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
Arcai10244 天前
PostgreSQL数据备份和恢复完全指南
数据库·postgresql·ffmpeg·备份一体机·备份软件·smartstor·智备科技
可乐鸡翅yeah_4 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8