不使用GUP去水印處理
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來處理這個問題。
使用GUP去水印處理
前提是你必須先要有英偉達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