当前位置: 首页 > 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…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...