FFmpeg学习(五)-- libswresample使用说明及函数介绍

libswresample Audio合成和重采样

libswresample库用来进行audio数据的合成和重采样操作。调用流程:

  1. 调用 swr_alloc 创建SwrContext结构体。
  2. 设置SwrContext参数,有两种方法: 调用av_opt_set_xx函数逐项设置参数;swr_alloc_set_opts2同时设置多个参数(如果传入参数为null,swr_alloc_set_opts2中会调用swr_alloc创建SwrContext结构体).
  3. 调用swr_init利用设置的参数初始化SwrContext结构体的内部参数。
  4. 调用 swr_convert 或 swr_convert_frame 转换audio数据。
  5. 数据转换完成后,调用 swr_free 释放资源。如果需要多次此结构体,可以调用 swr_close 清理当前上下文,然后重复步骤2.

如果基于AVFrame进行audio数据的合成和重采样操作。调用流程:

  1. 调用 swr_alloc 创建SwrContext结构体。
  2. 设置输入AVFrame中的channel_layout, sample_rate和format
  3. 调用swr_convert_frame进行数据转换。
  4. 数据转换完成后,调用 swr_free 释放资源。如果数据格式发生变化,可以swr_config_frame重新设置参数,然后重复步骤3.

函数

SwrContext结构体处理函数

  • struct SwrContext *swr_alloc(void)
    • 创建SwrContext结构体,在swr_init调用之前必须要设置转换参数。
  • int swr_init(struct SwrContext *s)
    • 设置完参数后,初始化上下文变量。
  • int swr_is_initialized(struct SwrContext *s)
    • 检测是否已经初始化,0为没有初始化。正数为已经初始化。
  • int swr_alloc_set_opts2(struct SwrContext **ps, const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, const AVChannelLayout *in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
    • 使用AVChannelLayout直接创建SwrContext结构体,并设置输入、输出audio数据的参数。log_offset为转换时log level,log_ctx为log的上下文。
  • void swr_free(struct SwrContext **s)
    • 释放SwrContext结构体。
  • void swr_close(struct SwrContext *s)
    • 清理swr_init时设置的内部参数,没有清理用户设置的参数。调用此函数后,可以修改参数,然后重新调用swr_init。

转换函数

  • int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,
    const uint8_t **in , int in_count)
    • 转换audio数据。当in 和 in_count 设置为0时,表示输入数据已结束,会将剩余的少量数据输出到out中。返回值为每个channel的采样数量。负数表示错误。
  • int64_t swr_next_pts(struct SwrContext *s, int64_t pts)
    • 获取输入的pts对应的输出pts的值,单位:1/(in_sample_rate * out_sample_rate) 。
    • swr_set_compensation 是swr_next_pts内部调用的函数,不建议在其他地方调用。

底层可选设置函数

  • int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map)
    • 设置一个输入channel的映射数组,不需要输出的channel设置为-1.
  • int swr_build_matrix2(const AVChannelLayout *in_layout, const AVChannelLayout *out_layout, double center_mix_level, double surround_mix_level, double lfe_mix_level, double maxval, double rematrix_volume, double *matrix, ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding, void *log_context)
    • 创建一个channel的合成矩阵。一般只是内部使用,也可用来创建自定义混合矩阵。
  • int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride)
    • 将swr_build_matrix2创建的合成矩阵设置到SwrContext中。

采样处理函数

  • int swr_drop_output(struct SwrContext *s, int count)
    • 丢弃指定数量的输出数据,
  • int swr_inject_silence(struct SwrContext *s, int count)
    • 注入指定数量的静音输出数据,
    • 如果需要强制补偿,swr_next_pts 调用 swr_drop_output 或 swr_inject_silence 进行数据对齐。
  • int64_t swr_get_delay(struct SwrContext *s, int64_t base)
    • 获取下一个输入采样数据相对于下一个输出采样数据将经历的延迟。延时单位根据base的值进行计算,为 1/base
  • int swr_get_out_samples(struct SwrContext *s, int in_samples)
    • 根据输入的输入采样率in_samples计算输出采样率的上限,SwrContext的内部状态不同,即使in_samples的值相同,也有可能返回不同的值。

配置信息函数

  • unsigned swresample_version(void)
    • 返回swresample的版本
  • const char *swresample_configuration(void)
    • 返回编译时的配置信息
  • const char *swresample_license(void)
    • 返回swresample的授权信息

基于AVFrame的处理函数

  • int swr_convert_frame(SwrContext *swr,AVFrame *output, const AVFrame *input);

    • 转换输入AVFrame中的数据并将其写入输出AVFrame。输入和输出AVFrames必须有channel_layout, sample_rate和format。如果输出AVFrame没有分配nb_samples的数据指针,将使用av_frame_get_buffer()分配数据并设置字段。
    • 输出AVFrame可以为NULL或分配的样本比所需的少。在这样的情况下,将添加未写入输出的所有剩余数据到内部FIFO缓冲区,在下次调用该函数或swr_convert时返回
    • 如果转换采样率可能会有数据留在内部重采样延迟缓冲器。调用Swr_get_delay()可以获取剩余的数量。如果需要获取剩余数据,请调用此函数或将swr_convert的输入设置为NULL。
    • 如果SwrContext配置不匹配输出和输入AVFrame设置,不会转换数据,并会报错。
    • 如果SwrContext没有初始化,此函数会利用输入、输出AVFrame中的参数初始化SwrContext,并进行数据转换。
    • 此函数不会创建SwrContext,也不会检测swr的值,调用之前必须通过确保swr的值为合法值
  • int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in);

    • 使用输入的AVFrame重新配置SwrContext的用户参数。此函数调用后必须调用swr_init初始化SwrContext。

结构体

  • SwrContext定义在swresample_internel.h中,属于非公开结构体,因此不同版本的定义可能不同。
  • swr_alloc、swr_get_class及SwrContext结构体对应的AVClass在libswresample/options.c中定义,此类的option项较多,请自行参考此文件。

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

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

相关文章

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统,后端基于Python语言,采用flask-restful开发后端接口,前端采用VueAntDesignVue实现。对其他类似系统的实现,比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

04.为什么line-height是无单位的 兄弟元素淡出效果 蚀刻文字效果

为什么 CSS 中的 line-height 应该是无单位的? 我经常听说 line-height 应该始终是无单位的。在我早期的编码年代,我没有过多地质疑这一点,但最近我开始想知道为什么会这样。在我看来,1.5 和 1.5em 应该产生相同的结果,对吧?事实证明,它们并非如此。 两者之间有一个细微的区…

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器,然后再给他添加一个curve修改器,使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后,死活无法沿着曲线阵列&#xff…

Dockerfile指令

Dockerfile指令 1、Dockerfile指令? 1)、COPY&#xff1a;类似ADD&#xff0c;将我们的文件拷贝到镜像中&#xff0c;也就是复制本地(宿主机)上的文件到镜像。 COPY [--chown<user>:<group>] ["<源路径1>",... "<目标路径>"] …

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

Django是干什么的?好用么?

Django是一个开源的Python Web框架&#xff0c;用于快速开发高质量的Web应用程序。它提供了许多功能和工具&#xff0c;以简化常见的Web开发任务&#xff0c;如路由、请求处理、数据库管理等。 Django的优点包括&#xff1a; 简单易用&#xff1a;Django提供了清晰的文档和丰…

HASHTABLE, HASHMAP,TreeMap区别

Hashtable、HashMap 和 TreeMap 都是Java集合框架中的实现&#xff0c;它们提供了键值对映射的数据结构&#xff0c;但它们在实现细节、性能特性和使用场景上有所不同&#xff1a; 1. Hashtable: - Hashtable 是遗留下来的类&#xff0c;继承自 Dictionary 类。 - 它实现…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

SQL基本查询

简单查询 单表查询 查询表的全部信息&#xff1a; --student是要查询的表 select * from student 使用别名查询表中的某个字段&#xff0c;或使用别名创建一个新的字段&#xff1a; select name as studentname from student --把查询出来的名字的列名改为学生姓名 …

服务器提交记录有Merge branch消除

背景&#xff1a;在共同开发分支release上&#xff0c;你提交了commit&#xff0c;push到服务器上时&#xff0c;发现有人先比你push了&#xff0c;所以你得先pull&#xff0c; 后再push&#xff0c;然而pull后自动产生了一个Merge branch的一个commit&#xff0c;这个commit本…

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅, 没有做太多的引申, 把总结推迟到了后面. 补上一些总结, 以防止出现 “下面呢? 下面没有了” 的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点, 但首先, 我们还是要问, 它能用递归解决吗? 有点怀疑精神是好的, 既要低头走路, 更要抬头看路, 以防…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals&#xff0c;JDK 增强提案)&#xff0c;筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 对非数组类型使用 for...of 循环2. 对非可迭代对象使用扩展运算符3. 在 Promise.all 中传递非可迭代对象4. 使用解构赋值时&#xff0c;右侧值非可迭代 四、解决方案与预防措施1. 确保使用可迭代对象2. 使用…

一些Java集合面试题

1.总体讲一下Java集合 Java集合主要是由两大接口派生而来。一个是Collection接口&#xff0c;主要用于存放单一元素&#xff0c;主要分成Set&#xff0c;List和Queue三大类&#xff1b;另一个是Map接口&#xff0c;主要用于存放键值对元素&#xff0c;主要实现类就是HashMap、…

各种Attention|即插即用|适用于YoloV5、V7、V8、V9、V10(一)

摘要 本文总结了各种注意力&#xff0c;即插即用&#xff0c;方便大家将注意力加到自己的论文中。 SE import torch from torch import nn class SEAttention(nn.Module): """ SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;中的注意力…

C++进阶(while循环——函数应用)

知识点代码框架总结 输入n组数据 &#xff0c;对n组数据里面的每一组进行处理&#xff08;输出、求和 、运算、其他&#xff09; int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例&#xff0c;肌肉型反映出上面的框架//2// 1 2 3// 4 5 6若…

虚拟机:VMware功能,安装与使用

目录 一、虚拟机介绍 二、VMware 1.介绍 2.安装 &#xff08;1&#xff09;根据提示按步骤安装​编辑 &#xff08;2&#xff09;更改软件的安装地址​编辑 &#xff08;3&#xff09;根据自己的需求选择是否需要软件更新​编辑 &#xff08;4&#xff09;根据需求选择…