【原創】ffmepg視訊切割、合併、視訊去水印、視訊打碼、m3u8技術
最近做視訊上傳,去水印,打水印,切割,分發趟了不少坑這裡分享一下心得,所有的都是我親自己躺過,歡迎一起交流!
我的開發環境: Mac
我的線上環境:
Centos7.2
ffmpeg version N-91330-ga990184 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-28) configuration: --prefix=/root/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --extra-libs=-lpthread --extra-libs=-lm --bindir=/root/bin --enable-gpl --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree libavutil 56. 18.102 / 56. 18.102 libavcodec 58. 20.103 / 58. 20.103 libavformat 58. 17.100 / 58. 17.100 libavdevice 58. 4.101 / 58. 4.101 libavfilter 7. 25.100 / 7. 25.100 libswscale 5. 2.100 / 5. 2.100 libswresample 3. 2.100 / 3. 2.100 libpostproc 55. 2.100 / 55. 2.100
1.首先肯定需要準備工具了 ffmpeg 終極神器!
再次申明不要使用yum來安裝,版本太低,很多特性用不了!
按照編譯一步步來就可以了。
如果中途編譯出錯,可以參看下面這篇文章
2.安裝完畢後就可以進行各種切割了
當然視訊是在本地,肯定會有各種奇葩的視訊,比如各個位置的水印,特別高清的視訊,都是要進行處理的。一般沒有問題的視訊我就直接上傳伺服器,進行自動上水印,分片m3u8,分發各個伺服器。這裡貼一下我使用的各種引數:
去水印:
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 25 -c:a copy -vf delogo=x=574:y=360:w=122:h=26 output.mp4
delogode的引數如下:
x=515 水印的橫向位置
y=19 水印的縱向位置
w=109 要去水印的蒙層寬度
h=42 要去水印的蒙層高度
其中能影響片子質量的就是 -preset fast 引數和 -crf 引數,關於這兩個引數的解讀有篇文章寫的很詳細,想了解的可以去這裡看
ffmpeg與x264編碼指南 我在伺服器上採用的是 veryslow -crf 25 基本上能壓縮之前的片源,而且非常保證質量,做不到無損基
本上能保證每分鐘4M的大小,也就是每秒鐘 70K/s 左右就可以很流暢的播放視訊了。
獲取位元率:
注意獲取出來的數字需要 x1000 也就是 後面需要加 Kffprobe input.mp4 2>&1| grep bitrate | sed 's/^.*bitrate: \(.*\) .*$/\1/g'
多圖圖片水印:
我下面的例子是打2個的,一個左上,一個右下,只打一個水印的,可以搜搜
ffmpeg -y -i input.mp4 -i tl.png -i br.png -filter_complex "[1:v]scale=3/5*in_w:3/5*in_h[logo1];[2:v]scale=4/5*in_w:4/5*in_h[logo2];[0:v][logo1]overlay=x=10:y=10[bkg];[bkg][logo2]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)" -codec:a copy output.mp4
中間的輸入源 [1:v] 這種寫法沒有再比這個噁心的了,上面的例子
[0:v] 是第一個輸入源也就是原始視訊
[1:v] 第二個輸入源為左上水印 tl.png
[2:v] 第三個輸入源為右下水印 br.png
ffmpeg -y -i input.mp4 -c:a copy -c:v copy -hls_time $HLS_TIME -hls_list_size 0 iav6.com.m3u8
文字水印:
ffmpeg -y -i output.mp4 -vf \"drawtext=fontfile=字型檔案的絕對路徑:text='iav6.com':x=10:y=10:fontsize=22:fontcolor=yellow:shadowx=1:shadowy=1,drawtext=fontfile=字型檔案絕對路徑:text='愛AV激情小視訊':x=10:y=40:fontsize=16:fontcolor=yellow:shadowx=1:shadowy=1\" -codec:a copy -c:v libx264 -preset fast -crf 30 xxx.mp4
命令中可以根據位置來模擬換行,字型大小,投影都是可以定製的,具體引數可以搜其他文章。不過我不建議打文字水印,因為視覺效果比圖片要差很遠...
視訊切割(ts+m3m8):
ffmpeg -y -i input.mp4 -c:a copy -c:v copy -hls_time 10 -hls_list_size 0 ouput.m3u8
切割成m3u8+ts的 資料,直接按照源視訊的音源、視訊源 copy,每個 ts檔案 按照 10s 切割
視訊旋轉:
一般用於直播的時候橫屏錄製的,需要順時針90度旋轉
ffmpeg -i intput.mp4 -metadata:s:v rotate="-90" -codec copy output.mp4
其他的數值自己可以填寫視訊剪下:
一般只想選擇一個場視訊的片段,這個時候下面的命令就可以使用了
ffmpeg -i input.mp4 -ss 00:00:30.0 -c copy -t 00:00:10.0 output.mp4
達成相同效果,也可以用 -ss 和 -to 選項, 從第 30 秒擷取到第 40 秒:
ffmpeg -i input.mp4 -ss 30 -c copy -to 40 output.mp4
視訊合併:
這個和視訊剪下剛好相反,比如只想要視訊的片段A和C,捨棄B的話,可以用下面的命令
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
在 i 之前增加引數 -safe 0 為了避免出現 Operation not permitted 的錯誤調整播放速度:
這個我用於做視訊的預覽,比如一個40min的視訊,我做一個10s的預覽,實際上我剪下了4個5s中的片段,然後快放兩倍
#加速2倍
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
#慢放就是2*PTS
基本上就是這麼多了,可以把打 水印 + 切片m3u8+ts 同時進行,只要拼接好引數就行!
基本上就這麼多,引數除錯需要耐心,希望能幫助做視訊直播轉碼的朋友少走彎路!
也可以加我QQ:116680766 進行交流!