ffmpeg调整音频音量踩坑

news2024/12/24 9:05:16

前一阵用Flutter结合ffmpeg做了一个音视频合并功能,记录一下遇到的问题。

合并方法

首先是音视频合并命令:

ffmpeg -i input.mp4 -i input.mp3 -filter_complex "[1:a]adelay=0s:all=1[a1];[a1]amix=inputs=1[amixout]" -map 0:v:0 -map "[amixout]" -c:v copy -c:a aac output.mp4

说明:

  • -i input.mp4:指定输入视频文件。
  • -i input.mp3:指定输入音频文件。
  • -filter_complex "[1:a]adelay=0s:all=1[a1];[a1]amix=inputs=1[amixout]":使用filter_complex选项进行音频处理。首先,将输入音频文件的音频流([1:a])延迟0秒(adelay=0s),并将所有通道(all=1)保存为一个新的音频流([a1])。然后,使用amix滤镜将该新的音频流与输入视频文件的音频流混合为一个新的音频流([amixout])。
  • -map 0:v:0:指定将输入视频文件的第一个视频流映射到输出文件。
  • -map "[amixout]":指定将音频处理后的音频流映射到输出文件。
  • -c:v copy:指定视频流使用原始编码方式进行复制,即不进行重新编码。
  • -c:a aac:指定音频流使用AAC编码进行重新编码。
  • output.mp4:指定输出文件。

音量问题

因为音频文件音量大小不固定,所以同时提供了音量修改的功能。先修改音量,后合并。这块也是遇到问题的地方。一开始使用的命令是:

ffmpeg -i input.mp3 -af loudnorm=i=-16 output.mp3
  • -af loudnorm=:使用af选项应用loudnorm音频滤镜。loudnorm滤镜用于对音频进行自动增益调整,以使其达到指定的目标音量。
  • i=-16:表示目标音量为-16 LUFS。-16是音乐类的推荐值。

LUFS是一种绝对单位,用于表示音频的整体响度或音量感知。它是根据人耳对不同频率范围内的声音感知的平均响度进行计算的。LUFS的值表示音频相对于标准参考音量的增益或衰减。

查看响度的命令参考:

ffmpeg -nostats -i test.mp3 -af "ebur128=peak=true:framelog=verbose" -f null -

结果如下:

[Parsed_ebur128_0 @ 0000021ebcf9a880] Summary:

  Integrated loudness:
    I:         -33.1 LUFS
    Threshold: -43.5 LUFS

  Loudness range:
    LRA:         5.4 LU
    Threshold: -55.1 LUFS
    LRA low:   -38.1 LUFS
    LRA high:  -32.7 LUFS

  True peak:
    Peak:      -14.2 dBFS
  • I :整体响度。
  • LRA :响度范围。
  • True peak:真峰值,简称TP。

但是调整后,发现有些音频处理会出现杂音,或是有些地方声音小了,整体被平均的感觉。其实是这个调节响度的方式比较复杂,只是简单指定响度不能达到良好效果。

响度标准化

首先获取音频数值:

 ffmpeg -i test.mp3 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -f null -

输出结果:

{
        "input_i" : "-33.13",
        "input_tp" : "-14.19",
        "input_lra" : "5.20",
        "input_thresh" : "-43.60",
        "output_i" : "-16.42",
        "output_tp" : "-2.00",
        "output_lra" : "4.90",
        "output_thresh" : "-28.41",
        "normalization_type" : "dynamic",
        "target_offset" : "0.42"
}

然后把上面的参数重新填入loudnorm中:

ffmpeg -i input.mp3 -af "loudnorm=I=-16:measured_I=-33.13:measured_TP=-14.19:measured_LRA=5.20:measured_thresh=-43.6:offset=0.42:print_format=summary" output.mp3

输出结果:

Input Integrated:    -33.1 LUFS
Input True Peak:     -14.2 dBTP
Input LRA:             5.2 LU
Input Threshold:     -43.6 LUFS

Output Integrated:   -15.6 LUFS
Output True Peak:     -2.0 dBTP
Output LRA:            5.5 LU
Output Threshold:    -27.9 LUFS

Normalization Type:   Dynamic
Target Offset:        -0.4 LU

查看音量:

[Parsed_volumedetect_0 @ 00000198003cfe00] n_samples: 2734011
[Parsed_volumedetect_0 @ 00000198003cfe00] mean_volume: -17.9 dB
[Parsed_volumedetect_0 @ 00000198003cfe00] max_volume: -1.5 dB
[Parsed_volumedetect_0 @ 00000198003cfe00] histogram_1db: 6
[Parsed_volumedetect_0 @ 00000198003cfe00] histogram_2db: 512
[Parsed_volumedetect_0 @ 00000198003cfe00] histogram_3db: 1871
[Parsed_volumedetect_0 @ 00000198003cfe00] histogram_4db: 4690

这样处理后,问题音频正常。因为上面用到的是Loudness normalization(响度标准化),就是将各个音频的音量统一调整均衡,如下图右侧。
在这里插入图片描述

峰值标准化

下面说一下Peak (level) normalization(峰值标准化)方法(上图左侧)。它就是将音频最大(Peak)的地方,调整到特定大小,然后其他音频做相对应的增/减调整。

首先是获取音频的最大音量:

ffmpeg -i input.mp3 -filter_complex volumedetect -c:v copy -f null /dev/null

结果如下:

[Parsed_volumedetect_0 @ 000002422f31d580] n_samples: 2511872
[Parsed_volumedetect_0 @ 000002422f31d580] mean_volume: -35.2 dB
[Parsed_volumedetect_0 @ 000002422f31d580] max_volume: -14.2 dB
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_14db: 3
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_15db: 10
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_16db: 15
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_17db: 67
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_18db: 161
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_19db: 421
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_20db: 1147
[Parsed_volumedetect_0 @ 000002422f31d580] histogram_21db: 3595

最大音量-14.2dB,然后调整dB:

ffmpeg -i input.mp3 -af volume=14dB output.mp3
  • -af volume=14dB:volume滤镜用于对音频进行增益调整,以增加或减少音频的音量。这里表示增加14dB的音量。

dB是一种相对单位,用于表示音频信号的相对强度或功率。在音频领域中,通常使用dB来表示音量的增益或衰减

调整后音量:

[Parsed_volumedetect_0 @ 0000027108d9f240] n_samples: 2511872
[Parsed_volumedetect_0 @ 0000027108d9f240] mean_volume: -21.6 dB
[Parsed_volumedetect_0 @ 0000027108d9f240] max_volume: -1.0 dB
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_1db: 9
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_2db: 14
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_3db: 35
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_4db: 122
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_5db: 253
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_6db: 693
[Parsed_volumedetect_0 @ 0000027108d9f240] histogram_7db: 2260

这种方法比较简单,根据最大音量数值调整音量。但是音频音量相对小的地方还是小,大的还是大。相当于手机音量调大了。

这种方法比较适合单纯调整音量大小。也比较适合我们的素材文件调整。所以最后选用了这种方式。

优化

如果调整音量过大,音频会失真。所以第一步获取最大音量很重要。或者使用动态范围的方式调整音量。

ffmpeg -i input.mp3 -af "compand=0|0:1|1:-90/-90|-80/-80|-70/-70|-60/-60|-50/-50|-40/-30|-30/-20|-20/-10|-10/-1:6:0:-90:0.2" output.mp3
  • compand:音频过滤器,用于动态范围压缩和扩展。
  • 其他参数我也不好解释。。。重点说一下-90/-90|-80/-80|-70/-70|-60/-60|-50/-50|-40/-30|-30/-20|-20/-10|-10/-1部分。

每对值表示一个映射点(竖线分隔),第一个值是输入音量,第二个值是输出电量。在这个例子中,有9个映射点,分别是(-90dB,-90dB),(-80dB,-80dB),(-70dB,-70dB),(-60dB,-60dB),(-50dB,-50dB),(-40dB,-30dB),(-30dB,-20dB),(-20dB,-10dB),(-10dB,-1dB)。

例如,如果你想让所有-40dB以上的音频信号都被压缩到-30dB,你就可以设置-40/-30。这样,所有-40dB以上的音频信号在经过compand过滤器处理后,都会被压缩到-30dB。同时-50dB以上这种细小的声音不做处理,所以没有增加音量。这样操作下来,实际上加了大约10dB。


最后放一张最终工具运行截图:

请添加图片描述

参考

  • 对视频声音,音频进行音量标准化和响度均化,归一化的标准,原理以及具体操作

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

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

相关文章

Ts系列之条件类型

Ts系列之条件类型 Ts系列之条件类型前言一、初遇二、条件判断三、待补充 Ts系列之条件类型 前言 本片文章主要对ts条件类型的用法做一个讲解。 一、初遇 1、首先我们来看看一个小例子: interface Person {name: string;age: number; } interface Son extends P…

神经网络:梯度计算

在计算机视觉中,梯度计算是一项关键任务,它在优化算法中扮演着重要的角色。梯度表示函数在某一点上的变化率,可以指导模型参数的更新,使得模型逐步接近最优解。下面我将详细解释梯度计算的作用、原理和意义。 作用: 梯…

C++ 新的类型转换

文章目录 前言一、静态转换(static_cast)二、动态转换(dynamic_cast):三、常量转换(const_cast):四、重新解释转换(reinterpret_cast):总结 前言 …

基于Java+Swing实现记事本-完美版

基于JavaSwing实现记事本-完美版 一、系统介绍二、功能展示1.主页2.文件功能3.编辑功能4.格式--功能5.查看功能 三、系统实现1. Fontv.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 1.主页 2.文件功能 3.编辑功能 4.格式–功能 5.查看功能 二、功能展示 1.主页 2.文…

一文带你弄清Map集合及其实现类(适合小白秋招篇)

前言: 本篇文章主要讲解Java中的Map集合接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了😁 以…

【Linux】冯诺依曼体系结构 操作系统 进程概念

目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、设计OS的目的 三、进程 1、基本概念 2、描述进程-PCB 3、组织进程 4、查看进程和终止 5、通过系统调用获取进程标识符 6、通过系统调用创建进程-fork 7、进程状态 8、特殊进程 8.1 僵尸进程 8.2 孤儿进程 一、冯诺依曼体…

【从零开始学习JAVA | 第八篇】String类

目录 前言: String类: 常见的认识误区: 创建String类: 注意点: 总结: 前言: String类是Java中最常见的一个类,本篇将对Stirng类的各种功能进行详细的介绍,各位小伙伴…

js:使用vue-codemirror实现一个语法高亮的网页代码编辑器

codemirror code editor component for vuejs 译文:vuejs的codemirror代码编辑器组件 文档 https://github.com/surmon-china/vue-codemirror 安装 # 依赖 pnpm install codemirror vue-codemirror --save# 语言 pnpm install codemirror/lang-json --save pnpm …

【VulnHub系列】MyFileServer

因为是从PDF转换过来偶尔可能会出现内容缺少,可以看原版PDF:有道云笔记 实验环境 Kali:192.168.10.102 MyFileServer:192.168.10.106 实验过程 通过arp-scan来发现靶机的IP地址 sudo arp-scan --interface eth0 192.168.10.1…

mediapipe 谷歌高效ML框架-图像识别、人脸检测、关键点检测

参考: https://github.com/google/mediapipe https://developers.google.com/mediapipe/solutions/guide 框架也支持cv、nlp、audio等项目,速度很快: 1、图形识别 参考:https://developers.google.com/mediapipe/solutions/vi…

【从零开始学习JAVA | 第九篇】字符串综合练习

前言: 在前一篇我们学习了String类以及两个接口函数,今天我们将利用昨天的知识以及讲解新的方法进行几个实战操作,以此来巩固我们的所学内容。 1.实现用户登录,对用户输入的密码进行验证 需求:已知正确的用户名和密码…

31 linux 中 用户栈帧 -> 内核栈帧

前言 比如 我们之前调试的 glibc 相关的库函数 glibc 相关是属于用户程序, 调用 操作系统的系统调用的时候, 会是 怎么样的一个情况呢? 系统调用 会有对应的系统栈帧来处理 系统调用的相关函数调用的堆栈支持 测试用例 我们这里主要是以 printf 中会分配缓冲区调用 ma…

NVIDIA Thrust教程

NVIDIA Thrust教程 Thrust 的 API 参考指南,CUDA C 模板库。 1.简介 Thrust 是基于标准模板库 (STL) 的 CUDA 的 C 模板库。 Thrust 允许您通过与 CUDA C 完全互操作的高级接口,以最少的编程工作实现高性能并行应用程序。 Thrust 提供了丰富的数据并…

windows自带的linux系统,从C盘迁移到D盘

1. 查看当前wsl版本和 运行状态 wsl -l -v wsl --list, -l 用于列出分发 本人电脑装的是Ubuntu-18.04&#xff0c;正在运行&#xff0c;版本1 2. 在D盘建linux目录&#xff0c;打包Ubuntu-18.04&#xff0c;导入到D盘的linux目录 wsl --export <DistributionName> &l…

9个最实用的PS插件盘点!

因为个人原因&#xff0c;对PS的插件用了不下 100 款&#xff0c;其中有好有坏&#xff0c;有优有劣&#xff0c;大浪淘沙&#xff0c;优胜劣汰&#xff0c;现在整理了自己觉得不错的 PS 插件。 1、Alien Skin Blow Up 3 for mac Blow Up 3 mac 版是 Macos 上一款 PS 图像无损放…

Apache Zeppelin系列教程第十篇——SQL Debug In Zeppelin

SQL Debug介绍 首先介绍下什么是SQL Debug&#xff1f; 但是经常有这样一个需求&#xff0c;一大段sql 跑出来之后&#xff0c;发现不是自己想要的结果&#xff1f;比如&#xff1a; demo 1: select id,name from ( select id,name from table1 union all select id,name fr…

web漏洞之文件上传漏洞

文章目录 一、漏洞原因二、漏洞危害三、漏洞利用1.三个条件2.利用方式3.绕过方式a.绕过JS验证① BP绕过② F12绕过③ 菜刀上传实操 b.绕过MIME-Type验证c.绕过黑名单验证① 直接修改后缀名绕过② htaccess绕过(有拦截)③ 大小写绕过(有拦截)④ 空格绕过⑤ .号绕过⑥ 特…

技术改变生活,开发者必须掌握这些技能

技术改变生活&#xff0c;开发者必须掌握这些技能 一、前言二、背景三、开发者必须掌握这些技能1. 语言与编程2. 数据结构与算法3. 开发框架与工具4. 应用开发与测试5. 团队协作与沟通 一、前言 随着科技的不断进步和发展&#xff0c;我们的生活方式也在不断地变化。互联网、智…

Session覆盖测试-业务安全测试实操(19)

弱Token设计缺陷测试,Session覆盖测试 Session覆盖测试 测试原理和方法 找回密码逻辑漏洞测试中也会遇到参数不可控的情况,比如要修改的用户名或者绑定的手机号无法在提交参数时修改,服务端通过读取当前session会话来判断要修改密码的账号,这种情况下能否对Session中的内容做…

【架构】洋葱架构

文章目录 前言一、为什么要用洋葱架构&#xff1f;二、原则2.1、依赖性2.2、数据封装2.3、关注点的分离2.4、耦合性 三、洋葱架构层四、领域模型/实体五、领域服务六、应用服务七、基础设施服务八、可观察性服务九、测试策略十、微服务十一、模块化与打包十二、框架、客户端和驱…