SwrContext重采样结构体使用说明

关于PCM音频重采样思路及注意事项(频率变换和通道数变换(单通道转双通道)) 最近在做一个语音广播的项目,实现语音广播的过程主要是:音频采集、音频编码、音频发送、音频解码和音频播放,这个过程在这里不展开说明,本文主要讲述其中的音频重采样和音频降噪的问题和记录如何解决的思路。本文主要讲述重采样部分,降噪部分在下一篇文章讲述 一、重采样和降噪的关系 之所以降噪过程中需要借助重采样的力量来实现,原因是一般情况下我们从电脑端采集到的音频数据是44.1Khz或者48Khz的16位或者8位双通道的PCM数据,而对于目前一些通用开源的降噪库例如speex或者webrtc来说一般都是有对送入降噪 阅读详情

在了解FFMPEG音频解码过程中,看到SwrContext重采样这个结构体,于是便详细了解下这个结构体相关的一些概念,记录下笔记。。。。
一、重采样
1)什么是重采样

所谓的重采样,就是改变音频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。
2)为什么要重采样

为什么要重采样?当然是原有的音频参数不满足我们的需求,比如在FFMPEG解码音频的时候,不同的音源有不同的格式,采样率等,在解码后的数据中的这些参数也会不一致(最新FFMPEG 16 解码音频后,音频格式为AV_SAMPLE_FMT_FLTP,这个参数应该是一致的),如果我们接下来需要使用解码后的音频数据做其他操作,而这些参数的不一致导致会有很多额外工作,此时直接对其进行重采样,获取我们制定的音频参数,这样就会方便很多。
再比如在将音频进行SDL播放时候,因为当前的SDL2.0不支持planar格式,也不支持浮点型的,而最新的FFMPEG 16年会将音频解码为AV_SAMPLE_FMT_FLTP格式,因此此时就需要我们对其重采样,使之可以在SDL2.0上进行播放。
3)可调节的参数

通过重采样,我们可以对 sample rate(采样率)、sample format(采样格式)、channel layout(通道布局,可以通过此参数获取声道数)。
二、SwrContext常用函数
1)swr_alloc

函数原型:struct SwrContext *swr_alloc(void);
此函数用于申请一个SwrContext结构体

2)swr_init

函数原型:int swr_init(struct SwrContext *s);
当设置好相关的参数后,使用此函数来初始化SwrContext结构体
3)swr_alloc_set_opts

函数原型:
struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
                                      int64_t out_ch_layout,    
                                      AVSampleFormat out_sample_fmt,
                                      int out_sample_rate,
                                      int64_t  in_ch_layout,  
                                      AVSampleFormat  in_sample_fmt,
                                      int  in_sample_rate,
                                      int log_offset,
                                      void *log_ctx);
此函数是比较重要的函数,分配SwrContext并设置/重置常用的参数。
相关参数解释如下:

 * @param s               Swr context, can be NULL
 * @param out_ch_layout   output channel layout (AV_CH_LAYOUT_*)
 * @param out_sample_fmt  output sample format (AV_SAMPLE_FMT_*).
 * @param out_sample_rate output sample rate (frequency in Hz)
 * @param in_ch_layout    input channel layout (AV_CH_LAYOUT_*)
 * @param in_sample_fmt   input sample format (AV_SAMPLE_FMT_*).
 * @param in_sample_rate  input sample rate (frequency in Hz)
 * @param log_offset      logging level offset
 * @param log_ctx         parent logging context, can be NULL
上面的参数即包含了输入输出参数中sample rate(采样率)、sample format(采样格式)、channel layout等参数。
4)swr_convert

函数原型:int swr_convert(struct SwrContext *s, uint8_t **out, 
                       int out_count, const uint8_t **in ,
                       int in_count);

此函数便是将输入的音频按照定义的参数进行转换,并输出
5)swr_free

函数原型:void swr_free(struct SwrContext **s);
释放掉SwrContext结构体并将此结构体置为NULL;

三、基本用法

此结构体比较简单,参考FFMPEG中头文件 swresample.h中说明,基本用法如下:
申请结构体—>设置相关参数—>初始化—>转换—->释放结构体

申请结构体和设置相关参数有两种方法:
方法1:

 SwrContext *swr = swr_alloc();
 av_opt_set_channel_layout(swr, "in_channel_layout",  AV_CH_LAYOUT_5POINT1, 0);
 av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO,  0);
 av_opt_set_int(swr, "in_sample_rate",     48000,                0);
 av_opt_set_int(swr, "out_sample_rate",    44100,                0);
 av_opt_set_sample_fmt(swr, "in_sample_fmt",  AV_SAMPLE_FMT_FLTP, 0);
 av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16,  0);

方法2:

 SwrContext *swr = swr_alloc_set_opts(NULL,  // we're allocating a new context
                        AV_CH_LAYOUT_STEREO,  // out_ch_layout
                        AV_SAMPLE_FMT_S16,    // out_sample_fmt
                        44100,                // out_sample_rate
                        AV_CH_LAYOUT_5POINT1, // in_ch_layout
                        AV_SAMPLE_FMT_FLTP,   // in_sample_fmt
                        48000,                // in_sample_rate
                        0,                    // log_offset
                        NULL);                // log_ctx
上面的两种方法是将输入音源参数为: 5.1声道 48K采样率 AV_SAMPLE_FMT_FLTP格式转换为 双声道 44.1k采样率 AV_SAMPLE_FMT_S16格式

原文链接:https://blog.youkuaiyun.com/u011003120/article/details/81542347
FFmpeg学习(五)-- libswresample使用说明及函数介绍 libswresample 使用说明及函数介绍 阅读详情

相关推荐

FFmpeg连载6-音频重采样

所谓重采样,一句话总结就是改变音频的三元素,也就是通过重采样改变音频的采样率、采样格式或者声道数。例如音频A是采样率48000hz、采样格式为f32le、声道数为1,通过重采样可以将音频A的采样率变更为采样率44100hz、采样格式为s16le、声道数为2等。

qq_52703909的博客 1883

FFMPEG结构体分析之SwrContext

SwrContext是音频重采样的结构体,需要注意的是这个结构体和libavcodec 、libavformat不同, 它是不透明的,不能直接为结构体成员变量设置值,需要调用AVOptionsAPI接口设置参数 SwrContext结构体定义位于/ffmpeg-5.0/libswresample/swresample_internal.h中,如下 struct SwrContext { const AVClass *av_class; ...

幽雨雨幽 3771

优快云积分获取与管理全攻略

技术社区积分系统是知识共享生态的核心激励机制,通过量化用户贡献实现资源交换。其底层逻辑遵循Web2.0时代的UGC经济模型,用户通过内容创作、社区互动等行为积累虚拟资产。在开发者社区场景中,积分体系能有效促进技术文档、工具源码等资源的流通,优快云作为国内头部平台,其积分规则具有典型参考价值。掌握签到策略、内容互动技巧和资源上传规范等实操方法,可系统性提升积分获取效率。2023年新规强化了连续签到奖励和互动质量检测机制,结合GitHub等开源平台资源互补,能构建更高效的技术资源获取路径。

weixin_34233974的博客 218

SwrContext重采样结构体

SwrContext重采样结构体使用说明 在了解FFMPEG音频解码过程中,看到SwrContext重采样这个结构体,于是便详细了解下这个结构体相关的一些概念,记录下笔记。。。。 一、重采样 1)什么是重采样 所谓的重采样,就是改变音频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 2)为什么要重采样 为什么要重采样?当然是原有的音频参数不满足我们的需...

Stoneshen的博客 3834

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1491

Linux内存优化:KSM技术原理与实践指南

内存共享是提升虚拟化环境资源利用率的关键技术,其核心原理是通过识别相同内容的内存页进行合并。Linux内核的KSM(Kernel Samepage Merging)机制采用红黑树数据结构管理内存页,通过多级哈希比较算法实现高效合并。该技术能显著降低物理内存消耗,提升CPU缓存命中率,特别适用于运行大量相似虚拟机实例的场景。在容器化和云计算环境中,KSM与NUMA优化、内存气球等技术协同,可实现40%-60%的内存节省。典型应用包括金融云平台的高密度虚拟机部署,以及Kubernetes集群的基础镜像优化。

weixin_28730353的博客 369

SwrContext重采样结构体--swr_alloc()、swr_init()、swr_free()

所谓的重采样,就是改变音频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 SwrContext常用函数: struct SwrContext *swr_alloc(void); 此函数用于申请一个SwrContext结构体 int swr_init(struct SwrContext *s); 当设置好相关的参数后,使用此函数来初始化SwrContext结构体...

SmallBottle-CGWLMX的博客 2871

CYUSB3065配置CMOS

按照OG02B10的时序电路,在通过SCCB配置CMOS之前,需要三个电源上电,Xshutdown高电平和配置时钟电路。找到手册的第6章SCCB(跟IIC很像),可以看到SCCB的地址与SID引脚有关,这个需要到硬件原理图上确认下。这是Cypress的一个支持MIPI和UVC的模块,有例程支持OV5640,现在要替换替换成OG02B10。寄存器参数需要找到厂家的FAE,由他们提供,OG02B10的资料已经上传。(2)参考得宏的电路,时钟由主控提供,目前程序未实现。这里有两个重要参数需要搞定,摄像头的。

qq_40773212的博客 2947

【FFmpeg实战】音频重采样

测试发现,其中AAC解码输出的数据为浮点型的 AV_SAMPLE_FMT_FLTP 格式,MP3解码输出的数据为 AV_SAMPLE_FMT_S16P 格式(使用的mp3文件为16位深)。将音频进行SDL播放的时候,因为当前的SDL2.0不支持plannar格式,也不支持浮点型的,而最新的FFpemg会将音频解码为AV_SAMPLE_FMT_FLTP,这个时候进行对它重采样的话,就可以在SDL2.0上进行播放这个音频了。也有计算所需内存空间的函数av_samples_get_buffer_size()

C/C++Linux、音视频、DPDK 1536

基于互联网的智能旧衣回收箱设计与实现

本文介绍了基于嵌入式系统的智能旧衣回收箱的设计与实现,涵盖了硬件设计、软件开发、图像识别、物联网连接等方面的内容。通过利用最新的技术,如图像识别、物联网和云计算,实现了智能、便捷的旧衣物回收系统。未来,随着技术的不断进步,智能回收系统将会在环保领域发挥更大的作用。

2201_76125393的博客 908

第二节:Vben Admin 登录逻辑梳理和对接后端准备

第一节,我们已经配置了前端环境,运行起来了我们的Vben Admin的项目。本节内容,我们先熟悉下项目的目录和文件,然后开始准备对接后端程序路由在 src/router页面在 sr/views本节前端登录逻辑梳理完成了,后端只要在/api/login 接口编写返回逻辑,前后段就可以打通了,具体详情我们下一节介绍。

cuiwin的专栏 5084

ffmpeg音频重采样分析

在学习ffmpeg的过程中

小人物专栏 5956

Proxmox(pve)集群(4)存储(1)配置分布式存储ceph

它使用一种称为CRUSH(Controlled Replication Under Scalable Hashing)算法的数据分布算法来将数据均匀地分布在多个存储节点上,并确保数据的冗余和容错。它负责管理数据的分布、冗余和自动修复。PVE支持本地存储、LVM、NFS、iSCSI、CephFS、RBD、ZFS等存储方式,我这里使用两种存储方式,一种是通过ceph实现分布式存储,一种是通过truenas实现集中式存储。自我管理和自动恢复:Ceph具有自我管理的特性,可以动态地调整和优化存储集群的配置。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2625

SwrContext实现音频重采样

音频的重采样可以使用SwrContext这个结构体来实现首先要对这个结构体进行初始化代码如下 - (SwrContext *)get_swrcontext_fa_oc{ int ret = 0; SwrContext *s_ctx = NULL; uint64_t src_channel_layout_in = self.resample_a_config.channel_layout_in; int src_sample_fmt = self.resample_a_co

月月月的博客 499

AIGC游戏开发:如何评估生成内容的玩家满意度?

如何量化评估生成内容对玩家体验的影响?本文聚焦AIGC生成的游戏内容(包括但不限于剧情、关卡、NPC对话、道具),系统探讨玩家满意度的评估方法论,覆盖主观与客观评估、静态与动态内容、短期与长期体验等场景。核心概念:定义AIGC与玩家满意度的关联维度;评估方法:主观(问卷/访谈)与客观(行为/生理数据)评估的技术细节;数学模型:构建多指标融合的评估模型;实战案例:以AIGC生成关卡为例,演示从数据采集到模型落地的全流程;工具资源:推荐数据采集、分析与建模的工具链;

AI天才研究院 1224

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【FFmpeg(2016)】SwrContext重采样结构体

【前言】 在看这篇文章前,我推荐你先看看我的另外两篇文章: 【FFmpeg(2016)】视频文件分离器(demuxing)——H264&PCM 【FFmpeg(2016)】PCM编码AAC 本文章主要介绍SwrContext的用处 和 使用方法,到底什么是重采样,为什么需要重采样,希望你耐心看完。 重采样,也就是对已得到的数据进行重新的采样;比如,

依然那霖哥 6779

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FFmpeg 核心 API 系列:音频重采样 SwrContext 完全指南(新API版本)

介绍解码音频流的过程以及如何用ffplay验证pcm音频文件是否解码正确

筏的博客 1102

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

•。

weixin_43063398的博客 1459

SwrContext

是音频重采样器的上下文,负责管理音频格式转换的所有状态和参数。:成功转换的样本数,负数表示错误。

2301_79941386的博客 456

SwrContext重采样

https://blog.youkuaiyun.com/u011003120/article/details/81542347 swr_alloc() swr_init() swr_alloc_set_opts( swr_context,int64_t out_ch_layout,enum AVSampleFormat out_sample_fmt, int out_sample_rate, ...

weixin_42568326的博客 452

java pcm 重采样_FFmpeg音频重采样API(libswresample)

目录参考lswr功能介绍lswr使用说明示例代码1. 参考2. lswr功能介绍FFmpeg中重采样的功能由libswresample(后面简写为lswr)提供。lswr提供了高度优化的转换音频的采样频率、声道格式或样本格式的功能。功能说明:采样频率转换:对音频的采样频率进行转换的处理,例如把音频从一个高的44100Hz的采样频率转换到8000Hz。从高采样频率到低采样频率的音频转换是一个有损的过...

weixin_39575737的博客 606

FFmpeg 音频重采样的两种方法libavcodec和libswresample

1、libavcodec 2、libswresample

myvest的专栏 7423

FFmpeg(五) 重采样相关函数理解

一、重采样流程   重采样(解码音频数据之后格式不可以直接播放,需要重采样,类似图像的像素转换)     1.分配上下文     2.设置参数(分为(前几个是)输出格式和(后几个)输入格式,两个相对应的) 可以通过改变样本率来改变音频的播放速度,但是会失帧。     3.初始化     4.开始转换 二、相关函数说明    1、 SwrContext *actx = sw...

Harry_123321的博客 526

音频重采样

很多时候在播放音频时,音频的采样率、通道数等并不能满足我们播放得需求,这就需要我们对音频进行重采样。 FFmpeg提供的方法libswresample.a库为我们很好的解决重采样的问题,下面就对如何使用这个库进行具体说明。

Paddy的个人博客 4660

Qt + FFmpeg 音频工具:重采样实现

音频重采样功能解析 本文详细介绍了音频处理工具中的重采样功能实现,支持采样率、位深和通道数三个维度的同步调整。核心采用FFmpeg的SwrContext实现高效转换,关键技术点包括: 格式映射:通过SampleSpec结构体统一管理采样格式,支持8/16/32位位深转换 重采样管线:利用SwrContext单次完成采样率/位深/通道数转换,包含延迟样本处理机制 安全设计:包含整数溢出保护、残留样本刷出等健壮性措施 非破坏性处理:重采样后自动替换当前PCM并清空相关缓存 该功能作为音频处理流水线的基础环节,为

luoyayun361的专栏 389
上一篇: 使用VLC media player搭建简单的流媒体服务器
下一篇: FFmpeg时间戳详解
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值