尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FFmpeg libswresample 模块的关键函数swr_convert 到底在干嘛?
目录一、先给一句话定性二、swr_convert 函数原型三、参数逐个拆重点在“样本不是字节”① SwrContext *s② out[]/ in[]—— 不是 void*packedS16 / S32 / U8planarFLTP / S16P③ in_count/ out_count单位是什么四、返回值到底什么意思五、最经典的坑残留 FIFO90%人踩现象原因正确 flush 姿势六、AVFrame 流派的“标准模板”解码 → swr → SDL / D3D七、S16 packed → SDL 最小完整例子八、常见翻车表血泪九、swr_convert 内部在干嘛十、一句话总结觉得有用就请您帮忙点赞转发收藏吧您的鼓励是我创作的动力多谢看官。由于能力水平有限文中的错误或不严谨的地方在所难免还请批评指正。swr_convert是 FFmpeg 中libswresample库的核心函数用于执行音频重采样操作。它能够将音频流的‌采样率‌、‌采样格式‌如从浮点转为整型或‌声道布局‌如从单声道转为立体声进行转换且不会改变音频的播放时长。做音频播放 / 录音 / 转码的人迟早都会撞上这一句swr_convert(swr_ctx, out_buf, out_samples, in_buf, in_samples);抄能跑但一问为什么返回值是输出帧数in_samples 怎么给planar 怎么摆残留数据在哪​今天把swr_convert拆干净不绕术语。一、先给一句话定性swr_convert 不是“格式转换器”是音频流水线工人负责 采样率 / 声道布局 / 样本格式 / 位深 全部打包干完。核心任务只有三个重采样SRC 声道重排channel layout packed ↔ planar二、swr_convert 函数原型int swr_convert(struct SwrContext *s, uint8_t *const out[], int out_count, const uint8_t *const in[], int in_count);看着简单其实 4 组语义上下文 输出地址 / 想要多少样本 输入数据 / 实际多少样本三、参数逐个拆重点在“样本不是字节”①SwrContext *s一次初始化反复用swr_alloc_set_opts(nullptr, AV_CH_LAYOUT_STEREO, // out layout AV_SAMPLE_FMT_S16, // out fmt 48000, // out rate AV_CH_LAYOUT_5POINT1_BACK, // in layout AV_SAMPLE_FMT_FLTP, // in fmt 44100, 0, nullptr);layout rate fmt 缺一不可②out[]/in[]—— 不是 void*packedS16 / S32 / U8uint8_t* out[1] { (uint8_t*)pcm16 }; swr_convert(s, out, ...);planarFLTP / S16Puint8_t* out[2]; out[0] left; out[1] right;规则planar data[i] 每声道一块packed data[0] 全挤一起AVFrame::data 原样传就行③in_count/out_count单位是什么单声道样本数per channel sample count参数意思in_count输入每个声道多少帧out_count我最多能吃多少帧不是字节不是 packet size例1024 帧立体声in_count 1024; // FLTP: data[0][1024], data[1][1024]四、返回值到底什么意思int ret swr_convert(...);ret 本次输出的 per-channel sample 数ret含义0输出样本数0FIFO 里攒着呢0出错常见误解“我给了 1024为啥返回 882”因为48000 → 44100 ratio 44100/48000 ≈ 0.91875五、最经典的坑残留 FIFO90%人踩现象最后几秒声音没了每次 flush 都有一小截原因swr 内部有 FIFO不够一帧不吐正确 flush 姿势while ((ret swr_convert(swr, out, out_max, nullptr, 0)) 0) { write_pcm(out, ret); }口诀innullptr, in_count0 冲 FIFO六、AVFrame 流派的“标准模板”解码 → swr → SDL / D3DAVFrame* dec got_frame; uint8_t* out[1] { audio_buf }; int out_nb swr_get_out_samples(swr, dec-nb_samples); int ret swr_convert(swr, out, out_nb, (const uint8_t**)dec-data, dec-nb_samples); // ret 实际可播放样本数swr_get_out_samples()先问大小避免 alloc 太小七、S16 packed → SDL 最小完整例子int dst_nb swr_get_out_samples(swr_ctx, frame-nb_samples); uint8_t* dst (uint8_t*)malloc(dst_nb * 2 * 2); uint8_t* out[1] { dst }; swr_convert(swr_ctx, out, dst_nb, (const uint8_t**)frame-data, frame-nb_samples); SDL_QueueAudio(dev, dst, dst_nb * 4); free(dst);八、常见翻车表血泪症状真凶声音加速in/out rate 反了爆音planar 当 packed声道左右反layout 没设最后没声没 flush返回负out_count 太小九、swr_convert 内部在干嘛[in frame] ↓ delay / compensation ↓ 重采样polyphase filter ↓ 声道混合downmix / upmix ↓ planar ↔ packed ↓ [FIFO] → out不是一帧进一帧出十、一句话总结swr_convert 给样本数吃样本数返回输出样本数结束必须 nullptr/0 flushplanar 用 data[]永远别碰字节数。
RELATED

相关推荐

玛卡巴卡~

玛卡巴卡~

1)pip命令(标题三) pip freeze > requirements.txt pip install -r requirements.txt pip cache purge pip config list pip install opencv-python -i https://mirrors.tuna.tsinghua.edu.cn/ http://mirrors.aliyun.com/pypi/simple/…

📅 2026/9/9 20:21:40
海量存储挑战如何破局?SaaS短链接系统的数据库设计与优化

海量存储挑战如何破局?SaaS短链接系统的数据库设计与优化

海量存储挑战如何破局?SaaS短链接系统的数据库设计与优化 【免费下载链接】shortlink 🔥 热门推荐 🔥 SaaS 短链接系统,承载高并发和海量存储等场景难题。专为实习、校招以及社招而出的最新项目,项目质量不亚于 12306 …

📅 2026/9/9 17:36:32
软工毕设新颖的方向汇总

软工毕设新颖的方向汇总

0 选题推荐 - 人工智能篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际…

📅 2026/10/9 4:57:23
MORE NEWS

更多资讯

📰

T3技术栈实战:用tRPC+Prisma打造代码片段管理工具

如果你常刷全栈圈,对“T3”这个词应该不陌生——Next.js、TypeScript、Tailwind 和 tRPC 的组合拳。t3code 这个项目,名字里就写了一半答案:T3 技术栈 code 管理。简单说,这是一个用 T3 全家桶搭建的个人代码片段管理工具&#x…

📰

MATLAB 2021a 实现小球弹射强化学习控制

简介:本资源是面向深度强化学习初学者与控制算法研究者的MATLAB仿真实践项目,聚焦小球弹射这一典型连续控制任务,系统对比DDPG与TD3两种主流确定性策略梯度算法在稳定性、收敛性与抗过估计能力上的差异。压缩包共18个文件,含11个核…

📰

SpringBoot蛋糕店系统:入门级可交付业务闭环实践

简介:本资源是一套完整的基于SpringBoot的毕业设计级电商系统,面向计算机专业本科生及Java全栈初学者,聚焦线上蛋糕零售场景,提供从需求分析、系统开发到部署落地的全流程实践范例。压缩包共5个文件,含SpringBootVue前…

📰

SpringBoot 三层架构里 DTO 该放哪一层:从鸿蒙登录接口返回密码说起

答辩前一周,我给鸿蒙 App 配的后端 lifeApp0110 已经跑通了登录、待办和图标三个模块。技术栈很普通:SpringBoot 2.3.4、MyBatis 2.1.4、MySQL 5.x,包名 com.qf.lifeapp0110,用 Controller ResponseBody 把对象直接转成 JSON 回给…

📰

SpringBoot2.7+MyBatis-Plus+MySQL5.7校园小程序实战

简介:这是一套面向高校开发者与Java全栈学习者的校园生活服务类微信小程序完整源码,聚焦学生群体高频需求——跑腿代办、快递代取与校园社交脱单,基于SpringBootMybatis-PlusMySQL技术栈实现前后端分离架构。资源包共1792个文件,涵…

📰

W5500 DHCP实战:状态机控制、realnde PHY协同与保底机制

简介:本资源是面向嵌入式开发工程师与物联网初学者的W5500以太网控制器DHCP功能实践代码包,解决设备在局域网中自动获取IP地址、子网掩码、网关及DNS等网络参数的核心需求,适用于基于STM32、ESP32等MCU平台接入W5500的网络通信项目。压缩包为…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬