当前位置: 首页 > news >正文

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项较多,请自行参考此文件。

相关文章:

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

libswresample Audio合成和重采样 libswresample库用来进行audio数据的合成和重采样操作。调用流程: 调用 swr_alloc 创建SwrContext结构体。设置SwrContext参数,有两种方法: 调用av_opt_set_xx函数逐项设置参数;swr_alloc_set_…...

车载视频监控管理方案:无人驾驶出租车安全出行的保障

近日,无人驾驶出租车“萝卜快跑”在武汉开放载人测试成为热门话题。随着科技的飞速发展,无人驾驶技术已逐渐从概念走向现实,特别是在出租车行业中,无人驾驶出租车的推出将为公众提供更为安全、便捷、高效的出行服务。 视频监控技…...

05STM32EXIT外部中断中断系统

STM32EXIT外部中断&中断系统 中断系统中断触发条件:中断处理流程和用途: STM32中断NVIC嵌套中断向量控制器基本结构NVIC基本结构NVIC优先级分组EXTI简介EXTI基本结构AFIO复用IO口EXTI内部框图旋转编码器简介硬件电路外设手册里的介绍NVIC中断使能寄存…...

MetaGPT和LangGraph对比

MetaGPT和LangGraph是两个不同的AI Agent框架,各有其特点和优势:MetaGPT: MetaGPT是一个多Agent协作框架,模拟软件公司的运作方式。它包含多个角色如产品经理、架构师、项目经理和工程师,每个角色都有特定的职责。MetaGPT采用对话模式&#…...

基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)

基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合,是一种必然的发展趋势。以互联网为基础,以服务于广大用户为目的,发展整体优势,扩…...

关于 RK3588刷镜像升级镜像”没有发现设备“ 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140287339 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub,你需要按照以下步骤操作: 登录 Docker Hub 首先,你需要登录到 Docker Hub。打开终端并运行以下命令:docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…...

查询(q_proj)、键(k_proj)和值(v_proj)投影具体含义

查询(q_proj)、键(k_proj)和值(v_proj)投影,这些投影是自注意力机制的核心组件,特别是在Transformer架构中。 让我们通过一个简化的例子来说明: import numpy as np# 假设输入维度是4,注意力头数是2 input_dim 4 num_heads 2 …...

超详细版阿里云控制台环境配置+数据库配置

目录 一、登录阿里云控制台二、xshell建立远程连接1.安装xshell2.查看公网IP3.新建会话重置密码 三、搭建环境1.安装宝塔面板2.打开宝塔面板 四、安装配置MySQL1.安装2.放行端口号3.新建数据库4.测试连接数据库 一、登录阿里云控制台 登录阿里云控制台,找到实例&am…...

Linux:Linux网络总结(附下载链接)

文章目录 下载链接网络问题综合问题访问一个网页的全过程?WebSocket HTTPHTTP基本概念GET与POSTHTTP特性HTTP缓存技术HTTP的演变HTTP1.1 优化 HTTPSHTTP与HTTPS有哪些区别?HTTPS解决了HTTP的哪些问题?HTTPS如何解决的?HTTPS是如何…...

Cxx Primer-CP-2

开篇第一句话足见作者的高屋建瓴:类型决定程序中数据和操作的意义。随后列举了简单语句i i j;的意义取决于i和j的类型。若它们都是整形,则为通常的算术意义。若它们都为字符串型,则为进行拼接操作。若为用户自定义的class类型,则…...

OpenCV距离变换函数distanceTransform的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 distanceTransform是OpenCV库中的一个非常有用的函数,主要用于计算图像中每个像素到最近的背景(通常是非零像素到零像素&…...

Service Mesh 是一种用于处理服务间通信的基础设施层

Service Mesh 是一种用于处理服务间通信的基础设施层,它通常与微服务架构一起使用,以提供诸如服务发现、负载均衡、熔断、监控、追踪和安全性等功能。Service Mesh 的一个流行实现是 Istio,它基于 Envoy 代理和 Kubernetes。 然而&#xff0…...

QML界面控件加载与显示顺序

一、QML界面控件加载顺序 QML在界面加载时的顺序和我们认知的有很大的不同,有时候会对我们获取参数以及界面实现造成很大的困扰 1、加载顺序 import QtQuick 2.12 import QtQml 2.12 import QtQuick.Window 2.12 import QtQuick.VirtualKeyboard 2.4Window {id: …...

C++从入门到起飞之——缺省参数/函数重载/引用全方位剖析!

目录 1.缺省参数 2. 函数重载 3.引⽤ 3.1 引⽤的概念和定义 3.2 引⽤的特性 3.3 引⽤的使⽤ 3.4 const引⽤ 3.5 指针和引⽤的关系 4.完结散花 个人主页:秋风起,再归来~ C从入门到起飞 个人格言:悟已往之不谏…...

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。 当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的pip可视化管理器。…...

Java中标识符和关键字

1.标识符 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }上述代码中在public class 后面的HelloWorld称为类名,main称为方法名,也可以将其称为标识符,即:在程…...

电子版pdf格式标书怎么加盖公章?

电子版PDF格式标书加盖公章的方法有多种,以下是一些常用的步骤和技巧: 一、手动插入图片法 打开PDF文档:首先,确保你已经安装了支持PDF编辑的软件,如Adobe Acrobat Reader DC、Foxit PDF Editor等。选择插入图片&…...

【开放集目标检测】Grounding DINO

一、引言 论文: Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 作者: IDEA 代码: Grounding DINO 注意: 该算法是在Swin Transformer、Deformable DETR、DINO基础上…...

东莞酷得 PMS134应广8位OTP单片机

1、特性 通用 OTP 系列 不建议使用于 AC 阻容降压供电或有高 EFT 要求的应用。应广不对使用于此类应用而不达安规要求负责 工作温度范围:-20C~70C 1.2.系统特性 一个硬件 16位计数器 两个8位硬件 PWM生成器 三个11 位硬件 PWM生成器(PWMG0,PWMG1…...

[终端安全]-7 后量子密码算法

本文参考资料来源:NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…...

uniapp 支付宝小程序 芝麻免押 免押金

orderStr参数如下: my.tradePay({orderStr:res, // 完整的支付参数拼接成的字符串,从 alipay.fund.auth.order.app.freeze 接口获取success: (res) > {console.log(免押成功);console.log(JSON.stringify(res),不是JOSN);console.log(JSON.stringify…...

Python爬虫教程第一篇

一、爬虫基础概念 1. 什么是爬虫 爬虫(Spider,又称网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。从技术层面来说,爬虫通过程序模拟浏览器请求站点的行为,把站点返…...

AI时代:探索个人潜能的新视角

文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二:Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…...

【Python学习笔记】Optuna + Transformer B站视频实践

【Python学习笔记】Optuna Transformer 实践 背景前摇(省流可不看): 之前以泰坦尼克号数据集为案例,学习了Optuna的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。 ————…...

【自动驾驶/机器人面试C++八股精选】专栏介绍

目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步,自动驾驶和机器人的技术水平不断提升,使得它们更加智能、可…...

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中,如何让虚拟人物的动作更加自然、真实,已经成为一个重要课题。AI4Animation项目,一个由 Sebastian Starke 主导的开源框架,为Unity开发者提供了强大的工具集,以实现这一目标。本文…...

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一,拆分配置集二,配置文件中配置多配置集1,引用多配置集2,验证 三,多配置集总结1,使用场景2,优先级 这一节介绍如何加载多个配置集。 大多数情况下,我们把配置全部放在一个…...

UART编程

Q:为什么使用串口前要先在电脑上安装CH340驱动? 中断的作用? 环形buffer的作用? static和valitate的作用 三种编程方式简介 也可以通过DMA方式减小CPU资源的消耗 直接把数据在SRAM内存和UART模块进行传输 ,流程: …...

C++:右值引用

右值与左值 在讲解右值引用之前,我们就需要先辨析一下左值与右值的区别。 左值 左值是一个表示数据的表达式,我们可以获取它的地址并且对其赋值,左值可以出现在赋值操作符的左边,但是右值不能。 int i 0; int* p &i; do…...