FFMPEG:根据时间进度根据实际进度填充/更改(部分)音频波形颜色

时间:2018-08-10 18:43:42

标签: ffmpeg

我正在尝试执行从mp3文件生成波形并显示在背景图像上并播放音频的命令。 为此,我想根据整个视频时间的流逝从左到右更改波形颜色(类似于进度条)。

我创建了以下命令,该命令使用绘制框显示进度条以根据当前时间位置填充框的颜色。

ffmpeg -y -loop 1-线程0 -i sample_background.png -i input.mp3 -filter_complex“ color=red@0.5:s = 1280x100 [Color]; [0:v] drawbox = 0:155:1280 :100:gray @ 1:t = fill [baserect]; [1:a] aformat = channel_layouts = mono,showwaves = s = 1280x100:rate = 7:mode = cline:scale = sqrt:colors = 0xffffff [waveform]; [baserect] [waveform] overlay = 0:155 [v1]; [v1] [Color] overlay = x ='if(gte(t,0),-W +(t)* 64,NAN)':y = 155 :format = yuv444 [v2]“ -map” [v2]“ -map 1:a -c:v libx264 -crf 35 -ss 0 -t 20 -c:a复制-最短-pix_fmt yuv420p -threads 0 output_withwave_and_progresbar.mp4

enter image description here

但是我想在生成的音频波形中显示进度,而不是使用绘制框制作/填充矩形。

因此,我尝试制作2种具有2种不同颜色并彼此重叠的波形,我想展示一种方式,使顶部波形仅显示x位置(左侧)相对于当前时间的一部分。

ffmpeg -y -loop 1-线程0 -i sample_background.png -i input.mp3 -filter_complex“ [0:v] drawbox = 0:155:1280:100:gray @ 1:t = fill [baserect] ; [1:a] aformat = channel_layouts = mono,showwaves = s = 1280x100:rate = 7:mode = cline:scale = sqrt:colors = 0xff0000 [waveform]; [1:a] aformat = channel_layouts = mono,showwaves = s = 1280x100:rate = 7:mode = cline:scale = sqrt:colors = 0xffffff [waveform2]; [baserect] [waveform] overlay = 0:155 [v1]; [v1] [waveform2] overlay = x ='if (gte(t,0),-W +(t)* 64,NAN)':y = 155:format = yuv444 [v2]“ -map” [v2]“ -map 1:a -c:v libx264 -crf 35 -ss 0 -t 20 -c:一个副本-最短-pix_fmt yuv420p-线程0 test.mp4

但是我无法找到从左到右执行“擦除”效果的方法,当前它正在滑动(因为我正在更改叠加层的x) 可以使用alpha合并并将所有其他像素设置为透明并仅显示小于x pos的像素来完成。 但我找不到执行该操作的方法。

背景图片: enter image description here

我们可以使用任何mp3文件,目前我已将其设置为20秒。

有人可以指导我们如何做到吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

即使用混合过滤器

ffmpeg -y -loop 1 -threads 0 -i sample_background.png -i input.mp3 -filter_complex "[0:v]drawbox=0:155:1280:100:gray@1:t=fill[baserect];[1:a]aformat=channel_layouts=mono,asplit[red][white];[red]showwaves=s=1280x100:rate=7:mode=cline:scale=sqrt:colors=0xff0000[red];[white]showwaves=s=1280x100:rate=7:mode=cline:scale=sqrt:colors=0xffffff[white];[red][white]blend=all_expr='if(lte(X/W,T/64),A,B)'[waveform];[baserect][waveform]overlay=0:155:format=yuv444[v]" -map "[v]" -map 1:a -c:v libx264 -crf 35 -ss 0 -t 20 -c:a copy -shortest -pix_fmt yuv420p -threads 0 test.mp4

其中64是音频的总持续时间。