FFmpeg-channel rematrix

channel rematrix

Channel rematrix 是一种音频处理技术,用于将多声道音频转换为不同的多声道格式。它可以将一个多声道音频信号从一种布局转换为另一种布局,例如从 5.1 到 7.1 或从立体声到环绕声。

ffmpeg中的rematrix可以通过fixter完成,swresample也支持auto-rematrix。

ffmpeg -y -v 56 -i 1ch-16k.wav -filter_complex "\
[0:a]pan=mono|c0=c0[a0]; \
[0:a]pan=mono|c0=c0[a1]; \
[0:a]pan=mono|c0=c0[a2]; \
[0:a]pan=mono|c0=c0[a3]; \
[0:a]pan=mono|c0=c0[a4]; \
[0:a]pan=mono|c0=c0[a5]; \
[0:a]pan=mono|c0=c0[a6]; \
[0:a]pan=mono|c0=c0[a7]; \
[0:a]pan=mono|c0=c0[a8]; \
[0:a]pan=mono|c0=c0[a9]; \
[0:a]pan=mono|c0=c0[a10]; \
[0:a]pan=mono|c0=c0[a11]; \
[a0][a1][a2][a3][a4][a5][a6][a7][a8][a9][a10][a11]amerge=inputs=12[aout]" \
-map "[aout]" 12ch-16k.wav

这个命令将一个1声道、16kHz采样率的wav文件转换为12声道音频文件,并且每个声道的内容都相同。下面是对命令的详细解释:

  • -y:覆盖输出文件,不询问。
  • -v 56:设置日志级别为verbose,输出更多详细信息。
  • -i 1ch-16k.wav:指定输入文件路径。
  • -filter_complex "...":使用复合滤镜进行处理。复合滤镜可以包含多个滤镜及其连接关系。
  • [0:a]pan=mono|c0=c0[a0]:使用pan滤镜将输入音频流(第0条流)从单声道变成12个单独的声道之一(第0号声道),并将输出流命名为a0
  • [0:a]pan=mono|c0=c0[a1]:同上,将输入流从单声道变成12个单独的声道之一(第1号声道),并将输出流命名为a1
  • …:依次类推,直到为所有12个声道都创建了一个新的输出流。
  • [a0][a1][a2]...[a11]amerge=inputs=12[aout]:使用amerge滤镜将12个单独的声道混合成一个12声道的音频流,并将输出流命名为aout。其中inputs=12表示输入流的数量为12。
  • -map "[aout]":指定复合滤镜的输出流作为输出文件的音频流。
  • 12ch-16k.wav:指定输出文件路径。

最终,这个命令会将单声道音频文件转换为12声道音频文件,每个声道的内容都相同。由于使用了pan滤镜,所以输出文件中的每一个声道都来自于原始音频文件的左声道。如果需要使用右声道,可以将c0=c0修改为c0=c1

因为ffmpeg不支持12 channel播放,所以这个播放的时候会报错,需要指定layout才行,比如12channel,实际只播放8channel,这个就先不尝试了。

因此,发现ffmpeg中定义了下面的channel layout,如果不是这里面的就需要指定channel layout:

#define AV_CHANNEL_LAYOUT_MONO              AV_CHANNEL_LAYOUT_MASK(1,  AV_CH_LAYOUT_MONO)
#define AV_CHANNEL_LAYOUT_STEREO            AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO)
#define AV_CHANNEL_LAYOUT_2POINT1           AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2POINT1)
#define AV_CHANNEL_LAYOUT_2_1               AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2_1)
#define AV_CHANNEL_LAYOUT_SURROUND          AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_SURROUND)
#define AV_CHANNEL_LAYOUT_3POINT1           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_3POINT1)
#define AV_CHANNEL_LAYOUT_4POINT0           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_4POINT0)
#define AV_CHANNEL_LAYOUT_4POINT1           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_4POINT1)
#define AV_CHANNEL_LAYOUT_2_2               AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_2_2)
#define AV_CHANNEL_LAYOUT_QUAD              AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_QUAD)
#define AV_CHANNEL_LAYOUT_5POINT0           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0)
#define AV_CHANNEL_LAYOUT_5POINT1           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1)
#define AV_CHANNEL_LAYOUT_5POINT0_BACK      AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0_BACK)
#define AV_CHANNEL_LAYOUT_5POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1_BACK)
#define AV_CHANNEL_LAYOUT_6POINT0           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0)
#define AV_CHANNEL_LAYOUT_6POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0_FRONT)
#define AV_CHANNEL_LAYOUT_HEXAGONAL         AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_HEXAGONAL)
#define AV_CHANNEL_LAYOUT_6POINT1           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1)
#define AV_CHANNEL_LAYOUT_6POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_BACK)
#define AV_CHANNEL_LAYOUT_6POINT1_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_FRONT)
#define AV_CHANNEL_LAYOUT_7POINT0           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0)
#define AV_CHANNEL_LAYOUT_7POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0_FRONT)
#define AV_CHANNEL_LAYOUT_7POINT1           AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1)
#define AV_CHANNEL_LAYOUT_7POINT1_WIDE      AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE)
#define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE_BACK)
#define AV_CHANNEL_LAYOUT_OCTAGONAL         AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_OCTAGONAL)
#define AV_CHANNEL_LAYOUT_HEXADECAGONAL     AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
#define AV_CHANNEL_LAYOUT_STEREO_DOWNMIX    AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO_DOWNMIX)
#define AV_CHANNEL_LAYOUT_22POINT2          AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)

这里面有16channel,那么用这个复杂的graph可以生成16 channel的wav文件,播放也正常:

ffmpeg -y -v 56 -i 1ch-16k.wav -filter_complex "\
[0:a]pan=mono|c0=c0[a0]; \
[0:a]pan=mono|c0=c0[a1]; \
[0:a]pan=mono|c0=c0[a2]; \
[0:a]pan=mono|c0=c0[a3]; \
[0:a]pan=mono|c0=c0[a4]; \
[0:a]pan=mono|c0=c0[a5]; \
[0:a]pan=mono|c0=c0[a6]; \
[0:a]pan=mono|c0=c0[a7]; \
[0:a]pan=mono|c0=c0[a8]; \
[0:a]pan=mono|c0=c0[a9]; \
[0:a]pan=mono|c0=c0[a10]; \
[0:a]pan=mono|c0=c0[a11]; \
[0:a]pan=mono|c0=c0[a12]; \
[0:a]pan=mono|c0=c0[a13]; \
[0:a]pan=mono|c0=c0[a14]; \
[0:a]pan=mono|c0=c0[a15]; \
[a0][a1][a2][a3][a4][a5][a6][a7][a8][a9][a10][a11][a12][a13][a14][a15]amerge=inputs=16[aout]" \
-map "[aout]" 16ch-16k.wav

这个实际上用最简单的-ac参数也可以:

ffmpeg -y -v 56 -i 1ch-16k.wav -ac 16 out.wav

pan filter的用法

混合具有特定增益水平的通道。filter接受输出通道布局,后跟一组通道定义。

此filter还旨在有效地重新remap音频流的channels。

混合示例,从立体声缩混到单声道,但左声道的系数更大:

pan=1c|c0=0.9*c0+0.1*c1

自定义缩混至立体声,自动适用于 3、4、5 和 7 声道环绕声:

pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR

给定相同的来源,您还可以切换左前和右前声道并保持输入声道布局:

pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5"

如果输入是立体声音频流,您可以将左前声道静音(并仍然保持立体声声道布局):

pan="stereo|c1=c1"

仍然使用立体声音频流输入,您可以在左前和右前复制右声道:

pan="stereo| c0=FR | c1=FR"

学习完pan的用法之后,前面的这个1声道转16声道,命令可以简化为:

ffmpeg -y -v 56 -i 1ch-16k.wav -af "\
pan=hexadecagonal | c0=c0 | c1=c0 | c2=c0 | c3=c0 | c4=c0 \| c5=c0 | c6=c0 | c7=c0 | c8=c0 | c9=c0 \| c10=c0 | c11=c0 | c12=c0 | c13=c0 | c14=c0 | c15=c0" \
12ch-16k.wav

其中hexadecagonal来自ffmpeg中layout的定义,通过-layouts可以看到:

Standard channel layouts:
NAME           DECOMPOSITION
mono           FC
stereo         FL+FR
2.1            FL+FR+LFE
3.0            FL+FR+FC
3.0(back)      FL+FR+BC
4.0            FL+FR+FC+BC
quad           FL+FR+BL+BR
quad(side)     FL+FR+SL+SR
3.1            FL+FR+FC+LFE
5.0            FL+FR+FC+BL+BR
5.0(side)      FL+FR+FC+SL+SR
4.1            FL+FR+FC+LFE+BC
5.1            FL+FR+FC+LFE+BL+BR
5.1(side)      FL+FR+FC+LFE+SL+SR
6.0            FL+FR+FC+BC+SL+SR
6.0(front)     FL+FR+FLC+FRC+SL+SR
hexagonal      FL+FR+FC+BL+BR+BC
6.1            FL+FR+FC+LFE+BC+SL+SR
6.1(back)      FL+FR+FC+LFE+BL+BR+BC
6.1(front)     FL+FR+LFE+FLC+FRC+SL+SR
7.0            FL+FR+FC+BL+BR+SL+SR
7.0(front)     FL+FR+FC+FLC+FRC+SL+SR
7.1            FL+FR+FC+LFE+BL+BR+SL+SR
7.1(wide)      FL+FR+FC+LFE+BL+BR+FLC+FRC
7.1(wide-side) FL+FR+FC+LFE+FLC+FRC+SL+SR
octagonal      FL+FR+FC+BL+BR+BC+SL+SR
hexadecagonal  FL+FR+FC+BL+BR+BC+SL+SR+TFL+TFC+TFR+TBL+TBC+TBR+WL+WR
downmix        DL+DR
22.2           FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL+SR+TC+TFL+TFC+TFR+TBL+TBC+TBR+LFE2+TSL+TSR+BFC+BFL+BFR

参考

AudioChannelManipulation

Convert Multiple audio tracks into a Single Track with 12 channels using ffmpeg

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

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

相关文章

IP 工具

什么是IP 工具 IP 工具是用于轻松扫描和排除网络 IP 地址空间故障的网络工程工具。IP 工具使网络管理员能够审核、跟踪和监视 IP 地址、子网以及使用 IP 的设备和主机的性能。这个全面的网络工程工具集包括高级 IP 工具&#xff0c;如 Ping、系统资源管理器、MAC 地址解析器和…

[SQL挖掘机] - 存储过程

介绍: 当你在sql中需要多次执行相同的一组sql语句时&#xff0c;存储过程是一个非常有用的工具。它是一段预先定义好的sql代码块&#xff0c;可以被命名并保存在数据库中&#xff0c;以便重复使用。 存储过程可以包含多个sql语句、逻辑流程、条件判断和循环等&#xff0c;可以…

近7000万美元被盗:Curve被攻击事件分析

7 月 31 日&#xff0c;以太坊编程语言Vyper发布公告称&#xff0c;Vyper 0.2.15、0.2.16 和 0.3.0 版本的递归锁失效。随后Curve Finance等相关协议出现了漏洞攻击事件。 漏洞的根源都是某些版本的 Vyper 中出现故障的递归锁。攻击者通过反复重新签署合约&#xff0c;导致未经…

设计模式行为型——解释器模式

目录 什么是解释器模式 解释器模式的实现 解释器模式角色 解释器模式类图 解释器模式举例 解释器模式代码实现 解释器模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;属于行为型模式&…

​小程序 WxValidate.js ​再次封装

util.js // 合并验证规则和提示信息 const filterRules (objectItem) > {let rules {}, messages {};for (let key in objectItem) {rules[key] objectItem[key].rulesmessages[key] objectItem[key].message}return { rules, messages } }module.exports {filterRule…

html中非插件实现pdf预览【PC+H5】

这里只考虑非插件以外的方法&#xff0c;插件可以参考pdf.js 1. iframe标签 <iframe src"/file/read?fileaaa&typeupload" width"100%" height"800px"></iframe>经测试&#xff0c;chrome正常显示&#xff0c;firefox不能显示…

为什么要开源?

什么是开源&#xff1f; 开源软件是其源代码已由其版权所有者公开的软件。在真正的开源许可证下&#xff0c;软件是协作开发的&#xff0c;其他程序员可以查看、修改或使用自己的代码。这种“纯”开源模式通常被称为FOSS&#xff08;自由和开源软件&#xff09;。 开源的一个…

《零基础入门学习Python》第075讲:GUI的终极选择:Tkinter12

Tkinter 的基本组件我们已经介绍得七七八八了&#xff0c;剩下的一些我们在这节课全部都会讲解完毕。 &#xff08;一&#xff09;Message组件 Message&#xff08;消息&#xff09;组件是 Label 组件的变体&#xff0c;用于显示多行文本消息。众所周知&#xff0c;我们的Lab…

sqlalchemy flask长时间未使用 导致数据库连接失效

临时解决方案&#xff1a;在正式运行定时任务之前&#xff0c;先跑一个session.query()&#xff0c;相当于唤醒连接。 参考 https://blog.csdn.net/sinat_42483341/article/details/103723691

【腾讯云 Cloud Studio 实战训练营】Redisgo_task 分布式锁实现

文章目录 前言问题场景腾讯云 Cloud Studio Redisgo_task长短类型分布式场景介绍Redisgo_task实现原理SetNx(valueexpire)原子性子协程Done()时间点子协程中的Ticker Redisgo_task唯一外部依赖Redisgo_task Lock结构Redisgo_task架构健壮性设计Redisgo_task可扩展性Redisgo_tas…

MyBatis-Plus 和达梦数据库实现高效数据持久化

一、添加依赖 首先&#xff0c;我们需要在项目的 pom.xml 文件中添加 MyBatis-Plus 和达梦数据库的依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifac…

Docker 命令没有提示信息

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; linux安装docker后发现使用docker命令没有提示功能&#xff0c;使用 Tab 键的时候只是提示已有的文件 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; Bash命令补全 Docke…

驱动开发 day8 (设备树驱动,按键中断实现led亮灭)

//编译驱动 (注意Makefile的编译到移植到开发板的内核) make archarm //清除编译生成文件 make clean ****************************************** //安装驱动 insmod mycdev.ko //卸载驱动 rmmod mycdev 需要在<内核路径>/arch/arm/boot/dts/ 修改 stm32mp157a-fsm…

微信小程序使用 canvas 2d 实现签字板组件

本文是在微信小程序中使用 canvas 2d 来实现签字板功能&#xff1b; 效果图&#xff1a; 代码&#xff1a; 1、wxml <view><canvas id"canvas"type"2d"bindtouchstart"start"bindtouchmove"move"bindtouchend"end&qu…

Scratch Blocks自定义组件之「下拉图标」

一、背景 由于自带的下拉图标是给水平布局的block使用&#xff0c;放在垂直布局下显得别扭&#xff0c;而且下拉选择后回修改image字段的图片&#xff0c;这让我很不爽&#xff0c;所以在原来的基础上稍作修改&#xff0c;效果如下&#xff1a; 二、使用说明 &#xff08;1&am…

【图论】差分约束

一.情景导入 x1-x0<9 ; x2-x0<14 ; x3-x0<15 ; x2-x1<10 ; x3-x2<9; 求x3-x0的最大值&#xff1b; 二.数学解法 联立式子2和5&#xff0c;可得x3-x0<23;但式子3可得x3-x0<15。所以最大值为15&#xff1b; 三.图论 但式子多了我们就不好解了&#xff0…

开源的跨平台的音视频处理工具FFmpeg

文章目录 FFmpeg概述FFmpeg使用场景go语言中使用FFmpeg FFmpeg概述 FFmpeg是一个开源的跨平台的音视频处理工具&#xff0c;可以对音频、视频进行转码、裁剪、调节音量、添加水印等操作。 广泛的格式支持。 FFmpeg能够解码、编码、转码、复用、分离、流式传输、过滤和播放几乎…

【MySQL】视图与用户管理

【MySQL】视图 视图视图概念使用基表与视图的相互影响 用户管理新增用户删除修改密码 用户权限授予权限回收权限 视图 视图概念 视图就是一张虚拟表&#xff0c;其内容由查询定义。与真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&…

SpringBoot内嵌的Tomcat:

SpringBoot内嵌Tomcat源码&#xff1a; 1、调用启动类SpringbootdemoApplication中的SpringApplication.run()方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplicat…

异常统一处理实现

异常处理 4.6.1 异常问题分析 在service方法中有很多的参数合法性校验&#xff0c;当参数不合法则抛出异常&#xff0c;下边我们测试下异常处理。 请求创建课程基本信息&#xff0c;故意将必填项设置为空。 测试发现报500异常&#xff0c;如下&#xff1a; http://localho…