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[]永远别碰字节数。

相关新闻

玛卡巴卡~

玛卡巴卡~

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/10/17 16:18:15 阅读更多 →
海量存储挑战如何破局?SaaS短链接系统的数据库设计与优化

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

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

2026/10/17 21:20:48 阅读更多 →
软工毕设新颖的方向汇总

软工毕设新颖的方向汇总

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

2026/10/18 3:37:28 阅读更多 →

最新新闻

Hermes Agent接入飞书:TaoToken统一Key打通消息与任务流

Hermes Agent接入飞书:TaoToken统一Key打通消息与任务流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 23:13:21 阅读更多 →
Windows 下 Neo4j 5.25.1 安装配置与避坑指南

Windows 下 Neo4j 5.25.1 安装配置与避坑指南

简介:Neo4j社区版5.25.1的Windows安装包,面向在Windows环境下开发图数据库应用的开发者、技术团队及图数据库初学者。它解决的是复杂关联数据的高效存储与查询问题,适用于社交网络分析、推荐系统、欺诈检测、知识图谱构建等场景,社…

2026/10/18 23:13:21 阅读更多 →
Sharpe为负也值得学:读懂ml-quant-trading-synthetic-mlp的metrics.json回测指标与成本拖累

Sharpe为负也值得学:读懂ml-quant-trading-synthetic-mlp的metrics.json回测指标与成本拖累

【免费下载链接】ml-quant-trading-synthetic-mlp 项目地址: https://ai.gitcode.com/hf_mirrors/dddyym/ml-quant-trading-synthetic-mlp 点击查看 免费下载 新手第一次看量化交易项目的回测报告,最常见的困惑是:为什么这个模型的夏普比率&…

2026/10/18 23:13:21 阅读更多 →
大模型做视频的真相:五步流水线从代码到成片

大模型做视频的真相:五步流水线从代码到成片

1. 先厘清一个被标题带偏的认知:模型不产视频,产的是"可渲染的中间态"很多人第一次看到"用大模型做视频"这个说法,脑子里浮现的画面是:敲一句话,模型吐出一个 mp4 文件。我一开始也这么以为&#…

2026/10/18 23:13:21 阅读更多 →
DeepSeek Harness 插件化底座:从零搭建可扩展 Agent 系统

DeepSeek Harness 插件化底座:从零搭建可扩展 Agent 系统

1. 从"模型即产品"到"模型即底座"的认知转变过去两年,绝大多数人接触大模型的方式,是打开一个对话框,输入问题,等待回答。这种交互模式把模型本身当成了最终产品——你用的是"某个模型"&#xff0c…

2026/10/18 23:13:21 阅读更多 →
SINUMERIK STEP 7 Toolbox V16.0 配置加速器实战指南

SINUMERIK STEP 7 Toolbox V16.0 配置加速器实战指南

简介:本资源是西门子SINUMERIK数控系统专用编程工具箱SINUMERIK STEP 7 Toolbox V16-0的完整安装包,面向自动化工程师、数控系统调试人员及工业控制领域技术人员,用于高效开发、仿真与调试SINUMERIK平台下的PLC逻辑与运动控制程序。压缩包共1…

2026/10/18 23:12:20 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →