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

news2025/3/31 18:12:52

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) {
    // 创建 SwrContext
    SwrContext *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);

    // 配置 SwrContext
    int 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.coloradmin.cn/o/2323572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS&#xff01;这款由花儿不哭大佬精心打造的语音克隆神…

Flutter视频播放优化

在Flutter中实现流畅视频播放&#xff0c;选择合适的播放器插件是关键。推荐使用以下两类插件&#xff1a; 跨平台低延迟方案 flutter_vlc_player&#xff1a;基于VLC引擎&#xff0c;支持RTSP/RTMP协议&#xff0c;通过hwAcc: HwAcc.full启用硬件加速&#xff0c;配合setOpti…

嵌入式学习第二十八天--顺序栈

栈的基本代码 栈是限定仅在表尾进行插入和删除操作的线性表。 先进后出、后进先出 栈顶:允许操作的一端 栈底:不允许操作的一端 入栈&#xff0c;出栈。 顺序栈 链式栈 302\5 1.创建 CreateSeqStack 2.销毁 DestroySeqStack 3.判断是否为空栈 IsEmptySeqStack 4.判断是否为满…

基于MCP协议的多模态模型优化在医疗3D打印精密人工关节制造中的研究

一、引言 1.1 研究背景与意义 在全球人口老龄化趋势愈发明显的当下,诸如骨关节炎、类风湿性关节炎这类关节疾病的发病率不断攀升,进而使得人工关节置换手术的需求呈现出激增态势。人工关节置换手术作为治疗终末期关节疾病的有效手段,能够显著缓解患者疼痛,提升关节功能与生…

【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典

更新日期&#xff1a;2025年3月26日。 Github 仓库&#xff1a;https://github.com/SaiTingHu/HTFramework Gitee 仓库&#xff1a;https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…

8路CXP相机采集系统介绍

8xCXP相机采集系统介绍 目录 1 系统概述 4 2 硬件架构 5 2.1 FPGA处理单元 5 2.2 CXP接口层 6 2.3 CXP相机说明与使用要求 7 2.4 SSI控制器板 8 3 FPGA方案 9 3.1 FPGA实现 9 3.2 Block Design说明 10 4 软件方案 14 4.1 嵌入式层 14 4.2 上位机软件&#xff08;C…

Stable Diffusion 基础模型结构超级详解!

1. Transformer 第一个只用 Attention 机制来解决序列到序列问题的模型&#xff0c;最早被 Google 用来解决翻译问题 对于中英翻译而言&#xff0c;需要解决三个具体的问题&#xff1a; 如何用数字表示中文和英文 如何让神经网络理解语义 如何让神经网络生成英文 1.1 Tok…

【Linux网络(七)】数据链路层

目录 1、认识MAC地址 2、 mac帧格式 3、局域网的通信原理 4、ARP协议 浏览器输入url1后发生的事情&#xff1a;&#xff08;面试题&#xff09; 数据链路层解决的是&#xff1a;直接相连的主机&#xff08;不仅仅包括电脑&#xff0c;还包括路由器&#xff09;之间&#x…

2025年渗透测试面试题总结-某奇安信-Ateam(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 奇安信-Ateam 一、SQL注入攻防技术体系 1.1 SQL注入类型矩阵&#xff08;基于利用方式&#xff09; …

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架&#xff0c;也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级&#xff0c;不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…

31天Python入门——第16天:模块与库详解

你好&#xff0c;我是安然无虞。 文章目录 Python模块模块之间的调用 Python包库的概念Python标准库安装第三方库 \_\_name\_\_ \_\_main\_\_ Python模块 在 Python 中, 模块是一个包含函数、变量和类等代码定义的py文件. 所以也可以说, 普通的py文件就是一个模块. 模块可以…

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象&#xff0c;同时确保良好的性能表现。它通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非使用传统的构造函数创建方式。这种设计…

【Linux】应用层协议 HTTP

应用层协议 HTTP 一. HTTP 协议1. URL 地址2. urlencode 和 urldecode3. 请求与响应格式 二. HTTP 请求方法1. GET 和 POST (重点) 三. HTTP 状态码四. HTTP 常见报头五. 手写 HTTP 服务器 HTTP&#xff08;超文本传输协议&#xff09;是一种应用层协议&#xff0c;用于在万维网…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …

使用VSCODE导致CPU占用率过高的处理方法

1&#xff1a;cpptools 原因&#xff1a;原因是C/C会在全局搜索文件&#xff0c;可以快速进行跳转&#xff1b;当打开的文件过大&#xff0c;全局搜索文件会占用大量CPU&#xff1b; 处理方法&#xff1a; 1&#xff1a;每次只打开小文件夹&#xff1b; 2&#xff1a;打开大文…

【力扣hot100题】(004)盛水最多的容器

现在能这么快做出来纯粹是因为当时做的时候给我的印象实在太深了。 犹记得这题是当年开启我用CSDN记录leetcode日记历史的开端。 总之印象太深了不会都不行啊&#xff01;&#xff01;记得当年是想到用各种动态规划回溯等等等等最终发现是最简单贪心和双指针。 解法也是非常简…