ffmpeg系列(三)—— 音频重采样

SwrContext

一、SwrContext 的重要字段

SwrContext 是音频重采样的核心配置对象,其关键字段决定了重采样的行为和性能。以下是常用字段及其作用:

字段名称类型作用典型值示例
in_sample_rateint输入音频的采样率(Hz)。44100
out_sample_rateint输出音频的采样率(Hz)。48000
in_ch_layoutAVChannelLayout输入音频的声道布局(如立体声、单声道)。AV_CH_LAYOUT_STEREO
out_ch_layoutAVChannelLayout输出音频的声道布局。AV_CH_LAYOUT_MONO
in_sample_fmtAVSampleFormat输入音频的样本格式(如 PCM、浮点)。AV_SAMPLE_FMT_S16
out_sample_fmtAVSampleFormat输出音频的样本格式。AV_SAMPLE_FMT_FLTP
filterconst char *重采样滤波器名称(如 Lanczos、Sinc)。SWR_FILTER_LANCZOS
speeddouble重采样速度倍数(1.0 = 实时,>1.0 加速)。1.0
channel_mapconst int *声道映射表(高级用法:自定义声道顺序)。NULL(默认布局)
error_occurredint错误标志(非零表示重采样过程中发生错误)。0(成功)/-1(失败)
bufferuint8_t **内部缓冲区指针(用于存储中间音频数据)。由 libswresample 自动管理
buffer_lenint内部缓冲区长度(字节)。自动调整

二、SwrContext 的重要函数

以下是使用 SwrContext 时最常用的函数及其作用:

1. swr_alloc()
SwrContext *swr_alloc(void);
  • 作用:分配一个空的 SwrContext 结构体(不初始化参数)。
  • 返回值:指向新分配的 SwrContext,需检查是否为 NULL(内存不足)。
    典型用法
2. swr_alloc_set_opts()
SwrContext *swr_alloc_set_opts(SwrContext **ctx,const AVChannelLayout *in_ch_layout,AVSampleFormat in_sample_fmt,int in_sample_rate,const AVChannelLayout *out_ch_layout,AVSampleFormat out_sample_fmt,int out_sample_rate,double speed,const char *filter,const char *filter_name
);
  • 作用一步到位分配并初始化 SwrContext,设置所有核心参数。
  • 参数说明
    • 输入参数(前 3 个):输入音频的布局、格式、采样率。
    • 输出参数(后 3 个):输出音频的布局、格式、采样率。
    • speed:重采样速度(1.0 表示实时处理)。
    • filter:滤波器类型(如 SWR_FILTER_LANCZOS)。
    • 返回值:成功返回配置后的 SwrContext,失败返回 NULL
  • 关键点
    • **替代 swr_alloc **:此函数内部已调用 swr_alloc` 无需手动初始化。
    • 参数顺序:必须严格区分输入和输出参数,否则可能导致逻辑错误。
  • 示例
3. swr_free()
void swr_free(SwrContext *ctx);

作用:释放 SwrContext 占用的内存及内部缓冲区。
注意:无论初始化是否成功,最终必须调用此函数避免内存泄漏。
示例

4. swr_convert()
int swr_convert(SwrContext *ctx,uint8_t **out_buf,int out_samples,const uint8_t *in_buf,int in_samples
);

作用:执行实际的重采样操作。
参数
in_buf:输入音频数据指针(需符合 in_sample_fmt 的格式)。
in_samples:输入样本数量(以 in_sample_rate 为单位)。
out_buf:输出缓冲区指针(需预分配,格式由 out_sample_fmt 决定)。
out_samples:请求的输出样本数量(可能被调整)。
返回值:实际输出的样本数量,或负数表示错误。
关键点
输入/输出缓冲区格式:必须与 SwrContext 中的 in_sample_fmt/out_sample_fmt 匹配。
缓冲区大小:需提前分配足够空间(参考 swr_get_out_samples())。

5. swr_get_sample_rate()
int swr_get_sample_rate(SwrContext *ctx);

作用:获取当前上下文的采样率(输入或输出,取决于调用时机)。
注意:在初始化后,输出采样率是固定的,输入采样率可能动态变化(如流式处理)。

6. swr_init()

swr_init 是 FFmpeg 中用于初始化音频重采样器(SwrContext)的函数。它的作用是根据 swr_alloc_set_optsswr_alloc_set_opts2 设置的参数,完成重采样器的内部配置和准备工作。以下是关于 swr_init 的详细说明:


##### 1. 函数原型

#include <libswresample/swresample.h>int swr_init(SwrContext *s);
参数类型说明
sSwrContext *音频重采样器上下文
返回值int成功返回 0,失败返回负的错误码

2. 功能说明

swr_init 的主要功能包括:

  1. 验证参数

    • 检查输入和输出的声道布局、采样格式、采样率等参数是否合法。
    • 如果参数不合法,返回错误码(如 AVERROR(EINVAL))。
  2. 初始化内部状态

    • 根据输入和输出的参数,计算重采样器的内部状态(如滤波器系数、缓冲区大小等)。
    • 如果输入和输出的采样率不同,初始化重采样滤波器。
  3. 分配内部资源

    • 分配重采样器所需的内存(如缓冲区、滤波器等)。
  4. 准备重采样

    • 完成所有准备工作,使重采样器可以开始处理音频数据。

3. 使用场景

swr_init 通常在以下步骤之后调用:

  1. 使用 swr_alloc()swr_alloc_set_opts() / swr_alloc_set_opts2() 创建并配置 SwrContext
  2. 调用 swr_init() 初始化重采样器。
  3. 使用 swr_convert() 进行音频重采样。

4. 返回值处理

swr_init 的返回值需要检查,如果返回值 < 0,说明初始化失败。

常见错误码
错误码说明
AVERROR(EINVAL)参数不合法(如声道布局不支持)
AVERROR(ENOMEM)内存分配失败
AVERROR(EOPNOTSUPP)不支持的采样格式或布局

四、完整使用示例

#include <libswresample/swresample.h>
#include <libavutil/channel_layout.h>void setup_resampler(AVCodecContext *ac) {// 创建 SwrContextSwrContext *actx = swr_alloc();if (!actx) {fprintf(stderr, "Failed to allocate SwrContext\n");return;}// 设置输入和输出的声道布局AVChannelLayout out_ch_layout;AVChannelLayout in_ch_layout;// 输出声道布局:立体声(2声道)av_channel_layout_default(&out_ch_layout, 2);// 输入声道布局:从 AVCodecContext 中获取av_channel_layout_copy(&in_ch_layout, &ac->ch_layout);// 配置 SwrContextint ret = swr_alloc_set_opts2(&actx,&out_ch_layout,            // 输出声道布局AV_SAMPLE_FMT_S16,         // 输出采样格式ac->sample_rate,           // 输出采样率&in_ch_layout,             // 输入声道布局ac->sample_fmt,            // 输入采样格式ac->sample_rate,           // 输入采样率0,                         // 日志偏移NULL                       // 日志上下文);if (ret < 0) {char errbuf[AV_ERROR_MAX_STRING_SIZE];av_strerror(ret, errbuf, sizeof(errbuf));LOGW("swr_alloc_set_opts2 failed: %s", errbuf);return;}// 初始化重采样器ret = swr_init(actx);if (ret < 0) {char errbuf[AV_ERROR_MAX_STRING_SIZE];av_strerror(ret, errbuf, sizeof(errbuf));LOGW("swr_init failed: %s", errbuf);return;}LOGW("SwrContext initialized successfully");// 使用 actx 进行重采样...// 释放资源swr_free(&actx);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模糊数学 | 模型 / 集合 / 关系 / 矩阵

注&#xff1a;本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常&#xff0c;请看原文。 模糊数学模型&#xff1a;隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…

如何根据目标网站调整Python爬虫的延迟时间?

一、为什么需要调整爬虫的延迟时间&#xff1f; 1. 反爬虫机制的挑战 大多数网站&#xff08;尤其是电商平台如淘宝&#xff09;都部署了反爬虫机制&#xff0c;用于检测异常的访问行为。如果爬虫的请求频率过高&#xff0c;可能会触发以下反制措施&#xff1a; IP封禁&…

【嵌入式学习2】内存管理

## C语言编译过程 预处理&#xff1a;宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法&#xff0c;将#include #define这些头文件内容插入到源码中 gcc -E main.c -o main.i 编译&#xff1a;检查语法&#xff0c;将预处理后文件编译生成汇编文件&#xff…

案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”

研究显示&#xff0c;与传统户外广告相比&#xff0c;数字户外广告在消费者心中的记忆率提高了17%&#xff0c;而动态户外广告更是能提升16%的销售业绩&#xff0c;整体广告效率提升了17%。这一显著优势&#xff0c;使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…

WindowsPE文件格式入门02.选项头其它和节表

https://www.bpsend.net/thread-444-1-1.html 选项头 IMAGE_OPTIONAL_HEADER&#xff1a;以供操作系统加载PE文件使用&#xff0c;32位必选。 重要字段&#xff1a; DWORD AddressOfEntryPoint&#xff1b; 入口点 DWORD ImageBase 建议模块地址…

【Arm+Qt+Opencv】基于人脸识别考勤系统实战

1.编译时问题汇总 windows下编译opencv-4.5.4 opencv-4.5.4编译 问题1&#xff1a;配套使用opencv-4.5.4,opencv_contrib-4.5.4,cmake3.22.3问题会少一点 问题2&#xff1a;在windows下哪里执行该命令 解决&#xff1a; 问题3&#xff1a;在对应cmake中搜索不到要修改的配置…

Linux与HTTP中的Cookie和Session

HTTP中的Cookie和Session 本篇介绍 前面几篇已经基本介绍了HTTP协议的大部分内容&#xff0c;但是前面提到了一点「HTTP是无连接、无状态的协议」&#xff0c;那么到底有什么无连接以及什么是无状态。基于这两个问题&#xff0c;随后解释什么是Cookie和Session&#xff0c;以…

【Tauri2】001——安装及运行

前言 笔者其实不想写教程&#xff0c;写教程很麻烦。 但是网上关于Tauri2的教程&#xff0c;要么不全&#xff0c;要么是Tauri1的&#xff0c;真的太少了&#xff0c;虽然有官网&#xff0c;还是太少了。 问Ai&#xff0c;也感觉比较离谱&#xff0c;有很多时候&#xff0c;…

【DFS】羌笛何须怨杨柳,春风不度玉门关 - 4. 二叉树中的深搜

本篇博客给大家带来的是二叉树深度优先搜索的解法技巧,在后面的文章中题目会涉及到回溯和剪枝,遇到了一并讲清楚. &#x1f40e;文章专栏: DFS &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…

操作系统导论——第13章 抽象:地址空间

一、早期系统 从内存来看&#xff0c;早期的机器并没有提供多少抽象给用户。基本上&#xff0c;机器的物理内存如图13.1所示 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&…

网络爬虫-2:基础与理论

一.同步加载与异步加载 1.1同步加载定义: 页面所有内容一起加载出来,当某一个数据加载有问题,整个页面就不会加载出来(如HiFiNi音乐网站),所以又叫阻塞模式 1.2爬取步骤: 看netword->document 2.1异步加载定义: 数据是分开加载的,当某一份数据有异常时,不影响其他数据…

【Docker系列五】Docker Compose 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步&#xff0c;就可以 点击搜索 Models &#xff1a; https://ollama.com/search然后点击下载&#xff1a; 选择后复制: ollama run deepseek-r1:32b例如&#xff1a; 让它安装完成后&#xff1…

【CC2530 教程 二】CC2530定时器实现微秒、毫秒、秒延时函数

目录 一、CC2530定时器&#xff1a; 二、CC2530定时器&#xff1a; &#xff08;1&#xff09;定时器1&#xff08;Timer1&#xff09;&#xff1a; &#xff08;2&#xff09;定时器2&#xff08;Timer2&#xff09;&#xff1a; &#xff08;3&#xff09;定时器3和定时…

23种设计模式-创建型模式-工厂方法

文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式&#xff0c;它提供了在父类中创建对象的接口&#xff0c;但允许子类…

Umi-OCR- OCR 文字识别工具,支持截图、批量图片排版解析

Umi-OCR 是免费开源的离线 OCR 文字识别软件。无需联网&#xff0c;解压即用&#xff0c;支持截图、批量图片、PDF 扫描件的文字识别&#xff0c;能识别数学公式、二维码&#xff0c;可生成双层可搜索 PDF。内置多语言识别库&#xff0c;界面支持多语言切换&#xff0c;提供命令…

【JavaEE】Mybatis基础使用注解 增删改查操作

目录 一、配置日志二、传递参数 #{}三、增(Insert)四、返回主键Options五、删&#xff08;Delete&#xff09;六、改&#xff08;Update&#xff09;七、查&#xff08;Select&#xff09; 一、配置日志 我们加上下面的代码在配置文件中&#xff0c;那么我们在日志中就可以看到…

4.2、网络安全体系与建设内容

目录 网络安全体系架构网络安全组织安全管理网络安全等级保护2.0等保项目流程等保标准变化等保2.0新增内容等保2.0变化智慧城市安全体系应用参考智能交通网络安全体系应用参考 网络安全体系架构 建设网络安全&#xff0c;要体系化&#xff0c;要从一个整体去做考虑&#xff0c…

TCP协议原理

TCP协议原理 本篇介绍 前面已经基本介绍了TCP编程的接口以及基本的步骤&#xff0c;但是并没有其中的原理进行解释。本篇主要聚焦于TCP原理部分&#xff0c;对TCP中重要的内容进行解释 TCP协议报格式 基本示意图如下&#xff1a; 下面针对每一个字段的作用进行简要的概括&a…

go中的文件、目录的操作

1.文件的概念 文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件等。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音等。 文件在程序中以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间…