ffmpeg命令的一般結構如下,需要注意的是全局選項影響所有輸入和輸出:
常用命令選項
-y 覆蓋視頻
-n 不覆蓋視頻
-i 輸入
-t 時間
-vf 音頻濾鏡
-af 視頻濾鏡
-r 指定幀率(幀速率是編碼成視頻文件的每秒幀數)
-f 指定格式
1.視頻格式轉換
ffmpeg -i video.flv video.mp4
指定編碼器轉換格式
ffmpeg -i video.flv -c:v libx264 -c:a libfaac video.mp4
2.音視頻的提取和合並
從視頻中提取aac
ffmpeg -i video.mp4 -vn -acodec copy output.aac
從視頻中提取h264
ffmpeg -i video.mp4 -vcodec copy -an output.h264
提取視頻
ffmpeg -i test.mp4 -vcodec copy -an test2.mp4(使用流拷貝速度很快)
ffmpeg -i test.mp4 -an test2.mp4(效果同上,但是需要編碼解碼速度比較慢)
-an 禁用音頻
-vcodec copy 拷貝視頻流
提取音頻爲mp3
ffmpeg -i test.mp4 -vn -acodec copy testaac
ffmpeg -i test.mp4 -vn test.mp3
-vn 禁用視頻流
關掉視頻原聲與mp3音樂合成新的視頻
ffmpeg -i scenery.mp4 -i music.mp3 -map 0:v -vcodec copy -map 1:a -acodec copy video_music.mp4
3.截取視頻
截取視頻的 5-25秒
-ss 開始時間
-t截取時間
ffmpeg -i test.mp4 -ss 5 -t 20 t.mp4
4.視頻分片
把視頻切爲每10秒一段
ffmpeg -i test.mp4 -c copy -map 0 -f segment -segment_time 10 video/part-%d.mp4
5.調整視頻分辨率
1.通過 –s改變視頻寬高
ffmpeg -i video3.mp4 -s 320*240 s.mp4
2.通過scale濾鏡進行縮放
ffmpeg -i video3.mp4 -vf scale=320:240 scale.mp4
6.視頻裁剪
Crop = w:h:x:y 寬度:高度:x:y(x,y如果不寫則從中心裁剪)
ffmpeg -i video.mp4 -vf crop=iw/2:ih:0:0 crop.mp4
7.視頻填充
填充視頻意味着向視頻幀添加額外的區域以包含額外的內容。當輸入應在具有不同寬高比的顯示器上播放時, 通常需要填充視頻
ffmpeg -i test.jpg -vf pad=2*iw:2*ih:30:30 framed_photo.jpg
8.視頻與圖片的轉換
視頻轉爲圖片
img2爲圖片的存儲目錄,img-%3d.jpg命名規則
-r幀率 -f格式
ffmpeg -i scenery.mp4 -r 2 -f image2 img2/img-%3d.jpg
將圖片轉換爲視頻
ffmpeg -f image2 -i img/img2%4d.jpg -r 25 video_img.mp4
視頻生成GIFffmpeg -i video.mp4 -pix_fmt rgb24 video.gif
定時截圖
ffmpeg -i video.mp4 -ss 00:00:7.43 -vframes 1 out.png
每秒生成一個張圖片
ffmpeg -i scenery.mp4 -vf fps=1 out%03d.png
每分鐘生成一張圖片
ffmpeg -i scenery.mp4 -vf fps=1/60 out%03d.png
每個I幀生成一張圖片
ffmpeg -i scenery.mp4 -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr thumb%04d.png
9.水印處理 添加水印一般使用 overlay
文字水印
x:離左上角的橫座標
y: 離左上角的縱座標
x=0:y=0 左上角
x=0:y=h-th 左下角
x=w-tw:y=0 右上角
x=w-tw:y=h-th 右下角
生成滾動文字例子
ffmpeg -y -i video.mp4 -vf drawtext=“fontfile=fonts/Medium.ttf:text=‘hello’:x=90+t*20:y=55:fontcolor=#ffffff:fontsize=25” drawtext.mp4
橫向滾動 x+t*n 從左往右滾動,n越大滾動越快
x-t*n 從右邊到左邊滾動
垂直滾動 y+t*n
在視頻右上角添加一個gif圖片
http://ffmpeg.org/ffmpeg-all.html#toc-gif-1
//-ignore_loop 0 使gif循環播放
//=shortest=1使視頻結束播放
ffmpeg -i tc.mp4 -ignore_loop 0 -i cat.gif -filter_complex "overlay=x=W-w:y=0:shortest=1” test.mp4
跑馬燈效果
分析:如果時間大於0,那麼就開始從子內容的寬度的x-w位置開始,然後每一幀n計數,幀數n除以(背景W+子內容背景w)求餘數+1設置為x坐標,即可循環
ffmpeg -i video2.mp4 -i logo.png -filter_complex "[1:v]scale=50*50[logo];[0:v]scale=200*200[bg];[bg][logo]overlay=x='if(gte(t,0),-w+(mod(n,W+w))+5,NAN)':y=0” output.mp4
//問題,調節不了水印移動速度
添加彈幕效果
在視頻中同時加入多個文字和多個圖片,使用到多個濾鏡就需要使用濾鏡鏈,而指定輸入輸出標籤就形成濾鏡鏈圖
ffmpeg -i video.mp4 -i logo.png -i logo1.png -filter_complex "[1:v]scale=30:30[img1];[2:v]scale=30:30[img2];[0:v][img1]overlay=(main_w-overlay_w)/2+t*100:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0",drawtext="fontfile=fonts/Medium.ttf:text='hello':fontcolor=white:fontsize=50:x='if(between(t,2,10),150,NAN)':y=120" -y output.mp4
解析:
1.[0:v]指定流 ,0表示第0個文件,v表示操作對象裏的視頻信息。
2.[img1]是對scale濾鏡的處理結果命名標記標籤,[0:v][img1]表示將scale縮略處理後的圖片覆蓋到第0個文件即視頻上,類似這個包含鏈接輸入輸出標記如[img1]的就組成濾鏡鏈圖filtergraphs
3.由於使用overlay添加圖片水印,使用drawtext添加文字水印,這個兩個濾鏡間使用逗號,分割開來,組成一個濾鏡鏈
4.overlay中t*100,表示從x軸以100的速度移動
5.x='if(between(t,2,10),150,NAN)’表示在2,10秒的區間顯示字幕。if(條件,條件爲true時的值,條件爲false時的值)
11.視頻圖片的旋轉
把圖片旋轉45度放到視頻中心
ffmpeg -i scenery.mp4 -i logo.png -filter_complex "[1:v]rotate='45*PI/180:ow=hypot(iw,ih):oh=ow:c=none'[rotate];[0:v][rotate]overlay=(W-w)/2:(H-h)/2" rotate.mp4 -y
解析
c=none這樣就不會出現黑色背景
ow=hypot(iw,ih):hypot(x, y) 計算斜邊(直角三角形最長邊)等效於sqrt(xx + yy),如果不設置ow,oh則旋轉之後溢出邊框部分之間被裁剪掉了
在旋轉角度中加入t參數即可實現隨着時間而旋轉 rotate='2*PI*t
ffmpeg -i scenery.mp4 -filter_complex "rotate='2*PI*t:ow=min(iw,ih)/sqrt(2):oh=ow:c=none’” test.mp4