ffmpeg最常用的去水印的命令:
ffmpeg -y -i demo.mp4 -vf delogo=x=0:y=0:w=100:h=100:show=0 demo_nowatermark.mp4
视频的信息如下:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
comment : Content Adaptive Encoding 3.0
Duration: 00:03:43.36, start: 0.000000, bitrate: 1284 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1213 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
分辨率: 1280*720
码率:1284 kb/s
时长:03:43秒 = 223秒
执行常用命令,并记录花费时间如下:
当前时间: 16:46:55.58
输入新时间:D:\>ffmpeg -y -i demo.mp4 -vf delogo=x=10:y=10:w=100:h=100:show=0 demo_nowatermark.mp4
......此处省略一些信息
[libx264 @ 0000016277176040] mb P I16..4: 7.6% 19.7% 0.8% P16..4: 40.5% 8.1% 2.4% 0.0% 0.0% skip:21.0%
[libx264 @ 0000016277176040] mb B I16..4: 0.7% 1.5% 0.0% B16..8: 34.5% 1.6% 0.2% direct: 1.3% skip:60.2% L0:42.5% L1:53.8% BI: 3.7%
[libx264 @ 0000016277176040] 8x8 transform intra:70.0% inter:87.8%
[libx264 @ 0000016277176040] coded y,uvDC,uvAC intra: 35.9% 57.9% 10.8% inter: 7.8% 15.0% 0.8%
[libx264 @ 0000016277176040] i16 v,h,dc,p: 21% 28% 10% 41%
[libx264 @ 0000016277176040] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 23% 21% 4% 6% 5% 7% 5% 5%
[libx264 @ 0000016277176040] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 24% 13% 5% 9% 7% 8% 5% 4%
[libx264 @ 0000016277176040] i8c dc,h,v,p: 53% 24% 17% 6%
[libx264 @ 0000016277176040] Weighted P-Frames: Y:4.1% UV:1.2%
[libx264 @ 0000016277176040] ref P L0: 66.9% 15.7% 12.1% 5.1% 0.1%
[libx264 @ 0000016277176040] ref B L0: 92.2% 6.1% 1.7%
[libx264 @ 0000016277176040] ref B L1: 98.2% 1.8%
[libx264 @ 0000016277176040] kb/s:1475.57
[aac @ 0000016276efe6c0] Qavg: 835.078D:\>time
当前时间: 16:48:06.22
输入新时间:D:\>
用时大概是 70秒,在看一下CPU(i7)的利用率一直在100%
去水印的效果这里不展示了,因为是某个平台的视频,大家可自行测试。
这样的结果来说,如果只处理单个视频,所用时间长点,应该还OK;如果视频多,而且每个视频的时间很长,那么效率会特别的低,所以考虑使用GPU来处理这个问题。
前提是你必须先要有英伟达Nivida的显卡,而且驱动都安装完毕,也可以直接到英伟达官网下载,我这个是windows10的版本的地址,下面是使用GPU去水印的命令:
ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i demo.mp4 -c:v h264_nvenc -vf "delogo=x=976:y=26:w=280:h=80" demo_nowatermark.mp4
测试如下:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
comment : Content Adaptive Encoding 3.0
Duration: 00:03:43.36, start: 0.000000, bitrate: 1284 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1213 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> h264 (h264_nvenc))
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
[aac @ 000002419730bac0] Qavg: 36685.109
[aac @ 000002419730bac0] 2 frames left in the queue on closing
发现这样的错误,graph 0 input from stream 0:0,网上搜了一下没有发现可以解决的办法,但有人说了问题的原因可能是解码器解析的结果不支持直接去去水印操作,所以我大胆的猜想了一下,仅仅使用GPU的编码功能,不用解码功能看是否可以,就有了下面的命令,解码使用默认,编码使用gpu的编码(毕竟编码更消耗时间)
ffmpeg -y -i demo.mp4 -c:v h264_nvenc -vf "delogo=x=976:y=26:w=280:h=80" demo_nowatermark.mp4
我这里还去掉了 -hwaccel cuvid 你还可以加上,有的机器会报一个小错误,也不影响,不报错的写法就是我上面的写法
那么我们再来看下测试的性能结果:
D:\>time
当前时间: 17:08:09.85
输入新时间:D:\>ffmpeg -y -i demo.mp4 -c:v h264_nvenc -vf "delogo=x=976:y=26:w=280:h=80" demo_nowatermark.mp4
ffmpeg version 4.2 Copyright (c) 2000-2019 the FFmpeg developers
---此次省略不重要信息-----
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: -1
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
encoder : Lavc58.54.100 aac
frame= 5585 fps=451 q=16.0 Lsize= 58537kB time=00:03:43.36 bitrate=2146.9kbits/s dup=1 drop=0 speed=18.1x
video:54952kB audio:3446kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.238407%
[aac @ 00000186af1c7740] Qavg: 835.078D:\>time
当前时间: 17:08:25.86
输入新时间:
哇喔,只用时16s,再看下cpu与gpu的利用率
70S的时间减少到16秒,只用了原来 22%的时间,而且cpu 利率用也可以接受,如果这个机器做双并发,那么用时可以减少到11%(当然不能这么粗略估计,我测试了一个并发两个的效果,虽然不能到这个值,但是还是有很高的提升,当然cpu利用率就100%,gpu的利用率还是在50%左右)
这里仅仅是列举了一个去水印使用gpu的处理办法,如果你用来转码等同样可以使用gpu,命令也是很简单的。
再后来我发现命令改成解码也用gpu也是可以的,但是用时上并没有缩短,可能解码本身就不会花费太多时间吧,命令如下:
ffmpeg -y -c:v h264_cuvid -i demo.mp4 -c:v h264_nvenc -vf "delogo=x=976:y=26:w=280:h=80" demo_nowatermark.mp4