[音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

Totem,mplayer,sopcast,realplayer,bmp
回复
ghome9
帖子: 50
注册时间: 2023-01-11 11:12
系统: ubuntu22.04

[音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#1

帖子 ghome9 » 2024-05-04 21:28

要使用 ffmpeg 自动执行规范化过程,而无需手动执行两次传递,并对多个文件(包括视频)运行规范化,您还可以通过 pip install ffmpeg-normalize 使用 ffmpeg-normalize Python 程序。
上述是FFMPEG官方的说明.有PY程序能自动化对影音文件的音量进行重整,统一大小,不至于一首歌大一首歌小.
至于本人: 手动测试了,ffmpeg手动,对音量小的视频进行了放大.
ffmpeg -nostats -i ****.mp4 -filter_complex ebur128 -f null - (过滤器可选为 ebur128 volumedetect任一一种)
得到音频大小. 下述进行更改.
ffmpeg -i ***.mp4 -af volume=32dB -y Rust01.mp4 正向增加 负向减少.
ffmpeg -i input.wav -filter:a "volume=0.5" output.wav 更改为原来的多少倍
上述两方案分贝听说比倍数的好. 但还是不够好,用响度的方案会更好.
响度方案 拿数据

代码: 全选

ffmpeg -i input.wav -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json  -vn -dn -sn -f null - 
主要拿到如下数据:
"input_i" : "-45.31", 所需参数
"input_tp" : "-12.92", 所需参数
"input_lra" : "12.80", 所需参数
"input_thresh" : "-56.28", 所需参数
"output_i" : "-16.71",
"output_tp" : "-1.50",
"output_lra" : "9.40",
"output_thresh" : "-27.80",
"normalization_type" : "dynamic",
"target_offset" : "0.71" 所需参数
然后再传递参数进行重新编码音频

代码: 全选

ffmpeg -y -i rust更改音量/Rust02.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-13.00:measured_TP=9.10:measured_LRA=14.50:measured_thresh=-25.15:offset=0.80:print_format=summary  -c:v copy rust更改音量/Rust02t2.mp4
ffmpeg -y -i <输入文件> -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=<input_i数据>:measured_TP=<input_tp数据>:measured_LRA=<input_lra数据>:measured_thresh=<input_thresh数据>:offset=<target_offset数据>:print_format=summary -c:v copy <输出文件名>
命令太长,搞成多段式脚本

代码: 全选

#! /bin/bash
#一号参数为要分析的文件名
ffmpeg -i $1 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -vn -sn -dn -f null -
 
将得到的数据存进文本文件,用sed进行修改(可把命令做成脚本使用)

代码: 全选

sed '11,$d' loud.txt| sed '5,9d' loud.txt >louddel.txt

代码: 全选

sed -i 's/.*" : "//g' louddel.txt; sed -i 's/",//g' louddel.txt; sed -i 's/"//g' louddel.txt
分成两段命令,主要是方便中间 cat 看一下有没有问题
-45.31
-12.92
12.80
-56.28
0.71

转码脚本

代码: 全选

#! /bin/bash
#1号参数为输入文件名,2号参数为输出文件名
str1=`sed -n '1p' louddel.txt`;
str2=`sed -n '2p' louddel.txt`;
str3=`sed -n '3p' louddel.txt`;
str4=`sed -n '4p' louddel.txt`;
str5=`sed -n '5p' louddel.txt`;
# echo $str1,$str2,$str3,$str4,$str5
num1=$(date +%s%N);ffmpeg -y -i $1 -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=$str1:measured_TP=$str2:measured_LRA=$str3:measured_thresh=$str4:offset=$str5:print_format=summary  -c:v copy  $2 ;num2=$(date +%s%N); echo $(($num2-$num1));
手动方案很烦.要方便请用 官方的自动脚本,看开头!
我大声地说:"我是小白,我是普通网民";所以我的发贴内容会有漏洞,不会是最新技术.请自行判断!
叠甲!最后,看个乐子就好!
头像
astolia
论坛版主
帖子: 6516
注册时间: 2008-09-18 13:11

Re: [音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#2

帖子 astolia » 2024-05-05 12:58

ghome9 写了: 2024-05-04 21:28

代码: 全选

sed '11,$d' loud.txt| sed '5,9d' loud.txt >louddel.txt

代码: 全选

sed -i 's/.*" : "//g' louddel.txt; sed -i 's/",//g' louddel.txt; sed -i 's/"//g' louddel.txt
sed支持将多条命令放在一起,比如第一个的可以写成 sed '11,$d;5,9d' loud.txt >louddel.txt,或者用p命令 sed -n '1,4p;10p' loud.txt >louddel.txt
ghome9 写了: 2024-05-04 21:28

代码: 全选

#! /bin/bash
#1号参数为输入文件名,2号参数为输出文件名
str1=`sed -n '1p' louddel.txt`;
str2=`sed -n '2p' louddel.txt`;
str3=`sed -n '3p' louddel.txt`;
str4=`sed -n '4p' louddel.txt`;
str5=`sed -n '5p' louddel.txt`;
这种情况下用read比较简单 read -d "" str1 str2 str3 str4 str5 < louddel.txt
ghome9
帖子: 50
注册时间: 2023-01-11 11:12
系统: ubuntu22.04

Re: [音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#3

帖子 ghome9 » 2024-05-05 16:05

谢谢大佬,又学到了几招.
:Haha
我大声地说:"我是小白,我是普通网民";所以我的发贴内容会有漏洞,不会是最新技术.请自行判断!
叠甲!最后,看个乐子就好!
ghome9
帖子: 50
注册时间: 2023-01-11 11:12
系统: ubuntu22.04

Re: [音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#4

帖子 ghome9 » 2024-05-05 16:14

从上面中学到了几招.补充完善一下:
手动确认信息的单次转码脚本

代码: 全选

#! /bin/bash
#一号参数为要分析的文件名,二号参数为输出重命名的顺序号
#
nameout=$(echo "rust更改音量/Rust$2.mp4");
#上面提取准备好输出路径与名字提前字符串,方便输入.
ffmpeg -nostats -i $1 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -vn -sn -dn -f null - >tmp.txt 2>&1;
# 上面使用重定向,将调试信息也输出给tmp.txt;这样才会有数据,不然没有.
tail -n11 tmp.txt > loud.txt;echo "clear" >tmp.txt;
# 上面用tail拿取最后的数据输出存给loud.txt
sed '11,$d;5,9d' loud.txt > louddel.txt;
sed -i 's/.*" : "//g;s/"[,]*//g' louddel.txt;
# 上面用sed命令修整数据,只保留需要的
cat louddel.txt;
echo "$1 参数如上,是否进行音频修正";
echo "输出文件为: $nameout, [y/n]";
if [ "$3" != "-y" ]
then
        read swith1;
         if [ "$swith1" != "y" ]
         then
         echo "不进行更改输出";
         exit;
         fi
fi
read -d "" str1 str2 str3 str4 str5 <louddel.txt;
# 上面使用read命令从louddel.txt读取5个参数;
num1=$(date +%s%N);ffmpeg -nostats  -i $1 -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=$str1:measured_TP=$str2:measured_LRA=$str3:measured_thresh=$str4:offset=$str5:print_format=summary  -c:v copy  $nameout ;num2=$(date +%s%N); echo "修改耗时(纳秒):"$(($num2-$num1));
# 上面对音频进行修改,-c:v copy对视频进行无修改拷贝动作,减少耗时
echo $1;
echo 输出文件为:$nameout;
使用方法 ./*.sh $1 $2 $3
./change.sh test56.mp4 56 -y (-y参数为自动确认参数正确,不加-y需手动确认).
文件名不能使用空格,

代码: 全选

ls|grep ' '

使用上面的查看. 要自动文件夹下全部转码.先确认好文件名.
使用类下面的方法,重命名

代码: 全选

#! /bin/bash
for file in `ls ./|grep .mp4`;
do
        echo $file;     
        num=$(echo $file|sed 's/编程小项目:编写简单的//g;s/用Rust编程写区块链,//g;s/用Rust编写区块链,//g');
        echo $num;
        mv $file $num;
done
自行更改参数,字符串.
自动全修改脚本如下():

代码: 全选

#! /bin/bash
for file in `ls ./|grep .mp4`;
do
	echo $file;	
	newfile=$(echo $file|sed 's/编程小项目:编写简单的//g;s/用Rust编程写区块链,//g;s/用Rust编写区块链,//g');
	echo $newfile;
	nameout=$(echo "rust更改音量/$newfile");
#上面提取准备好输出路径与名字提前字符串,方便输入.
ffmpeg -nostats -i $file -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -vn -sn -dn -f null - >tmp.txt 2>&1;
# 上面使用重定向,将调试信息也输出给tmp.txt;这样才会有数据,不然没有.
tail -n11 tmp.txt > loud.txt;echo "clear" >tmp.txt;
# 上面用tail拿取最后的数据输出存给loud.txt
sed '11,$d;5,9d' loud.txt > louddel.txt;
sed -i 's/.*" : "//g;s/"[,]*//g' louddel.txt;
# 上面用sed命令修整数据,只保留需要的
cat louddel.txt;
####自动读取更改时,下面的不使用####
#echo "$file 参数如上,是否进行音频修正";
#echo "输出文件为: $nameout, [y/n]";
#if [ "$3" != "-y" ]
#then
 #       read swith1;
 #       if [ "$swith1" != "y" ]
 #       then
 #       echo "不进行更改输出";
 #       exit;
 #       fi
#fi
#####自动读取修改时,上面的不使用#####
read -d "" str1 str2 str3 str4 str5 <louddel.txt;
# 上面使用read命令从louddel.txt读取5个参数;
num1=$(date +%s%N);ffmpeg -nostats  -i $file -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=$str1:measured_TP=$str2:measured_LRA=$str3:measured_thresh=$str4:offset=$str5:print_format=summary  -c:v copy  $nameout ;num2=$(date +%s%N); echo "修改耗时(纳秒):"$(($num2-$num1));
# 上面对音频进行修改,-c:v copy对视频进行无修改拷贝动作,减少耗时
echo $1;
echo 输出文件为:$nameout;
done
05-15,运行发现错误.偷偷改掉.
[[ "$swith1" = "y" ]]||[[ "$swith1" = "Y" ]] 判断条件可运行;
但是
[[ "$swith1" != "y" ]]||[[ "$swith1" != "Y" ]] 判断条件不起作用.
上次由 ghome9 在 2024-05-15 22:23,总共编辑 1 次。
我大声地说:"我是小白,我是普通网民";所以我的发贴内容会有漏洞,不会是最新技术.请自行判断!
叠甲!最后,看个乐子就好!
头像
aerowolf
帖子: 1781
注册时间: 2006-02-25 17:09
来自: 西安

Re: [音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#5

帖子 aerowolf » 2024-05-07 9:27

推荐一下,mp3gain, — mp3 音量标准化无损调整工具。没度过能不能调整视频。另,相应的,还有Windows版本。
早起的鸟儿有虫吃
早起的虫儿被鸟吃

http://aerowolf.blog.sohu.com/
亲,点一下免费获得Dropbox空间!
ghome9
帖子: 50
注册时间: 2023-01-11 11:12
系统: ubuntu22.04

Re: [音频]ffmpeg 可以对音频的分贝/响度进行最大值的初步统一!

#6

帖子 ghome9 » 2024-05-15 22:26

aerowolf 写了: 2024-05-07 9:27 推荐一下,mp3gain, — mp3 音量标准化无损调整工具。没度过能不能调整视频。另,相应的,还有Windows版本。
感谢推荐.
搜索引擎 首页其本都是windows; 还好apt install mp3gain 测了下,官方库里有.
我大声地说:"我是小白,我是普通网民";所以我的发贴内容会有漏洞,不会是最新技术.请自行判断!
叠甲!最后,看个乐子就好!
回复