ffmpeg-利用ffmpeg获取音频波形图

利用ffmpeg获取音频波形图

音频数据通常用波形图像表示。

目录

利用ffmpeg获取音频波形图

波形图像

1.所有通道

2.模拟立体声

3.分离通道

4.变化的范围

5.添加一个背景

6.波形的视频

使用Gnuplot

1.单通道


波形图像

showwavespic是创建波形图像的最简单方法。

 

1.所有通道

ffmpeg -i PRC.mp3 -filter_complex "showwavespic=s=640x120" -frames:v 1 output1.png

 

所有通道将由波形中的各种阴影表示。

 

2.模拟立体声

 

ffmpeg -i PRC.mp3 -filter_complex "aformat=channel_layouts=mono,showwavespic=s=640x120" -frames:v 1 output2.png

如果你想要一个更简单的表现,即所有的通道都是由一个波形表示,你可以先用aformat把你的音频混音成mono:

3.分离通道

ffmpeg -i PRC.mp3  -filter_complex "showwavespic=s=640x240:split_channels=1" -frames:v 1 output3.png

 

4.变化的范围

如果波形看起来有点平,你可以使用compand过滤器来扩展或压缩动态范围:

ffmpeg -i PRC.mp3 -filter_complex "compand,showwavespic=s=640x120" -frames:v 1 output4.png

请注意,这将不像没有compand时那样精确,但对于美学而言,它可能是首选的。

5.添加一个背景

使用覆盖:

ffmpeg -i input -i background.png -filter_complex "[0:a]showwavespic=s=640x240[fg];[1:v][top]overlay=format=auto" -frames:v 1 output5.png

本例假设背景的宽度和高度与波形相同。如果不是,你可以先缩放、裁剪或填充背景。

波形颜色可以通过showwavespic中的颜色选项进行修改。

 

6.波形的视频

ffmpeg -i PRC.mp3 -filter_complex "[0:a]showwaves=s=1280x720:mode=line,format=yuv420p[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy output.mkv

我这里只截取了三张波形图

使用Gnuplot

1.单通道

绘制单个通道波形比较容易,因为数据可以直接传递给Gnuplot。这里的基本思想是为音频数据生成特定的二进制格式,然后可以使用Gnuplot自动读取和解释这些数据。

 

下面的命令将生成一个原始二进制数据流,其中两个字节表示每个示例。只要有音频流,输入格式并不重要。如果是一个多声道的音频流,这些声道将被混合成一个。

ffmpeg -i in.mkv -ac 1 -map 0:a -c:a pcm_s16le -f data -

由于音频通常伴随着每秒大量的采样(例如CD音频每秒44100个采样),因此减少数据量以提高速度和减少内存消耗通常是一个好主意。注意,减少采样太多可能会扭曲生成的波形。一个好的值通常是每秒8000个样本。修改后的命令行如下:

ffmpeg -i "$1" -ac 1 -filter:a aresample=8000 -map 0:a -c:a pcm_s16le -f data -

现在剩下的是让Gnuplot根据这些数据创建波形图像。为此,我们需要一个plot命令来处理FFmpeg的输出。

 plot '<cat' binary filetype=bin format='%int16' endian=little array=1:0 with lines;

这个plot命令从stdin中读取,它期望一个包含两个字节的一维数组,小端带符号的整数表示pcm vales。然后用线条把它们画出来。

我们已经可以通过组合这些命令来进行尝试。注意,使用Gnuplot的图形用户界面进行实时呈现非常慢,因此不希望向它抛出太多数据。使用一个简短的音频文件或限制使用'-t'选项的时间只绘制文件的一部分。

ffmpeg -i 123.mp4 -ac 1 -filter:a aresample=8000 -map 0:a -c:a pcm_s16le -f data - | \
    gnuplot -p -e "plot '<cat' binary filetype=bin format='%int16' endian=little array=1:0 with lines;"

结果应该是这样的:

如果上述图输出不了,可能是缺少

 * gnuplot-nox
 * gnuplot-qt
 * gnuplot-x11
 * gnuplot5-nox
 * gnuplot5-qt
 * gnuplot5-x11
请尝试:sudo apt install <选定的软件包>
 

未完

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GLL_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值