① ffmpeg 命令大全
前言
FFMPEG是特別強大的專門用於處理音視頻的開源庫。你既可以使用它的API對音視頻進行處理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,來編輯你的音視頻文件。
本文將簡要介紹一下 FFMPEG 庫的基本目錄結構及其功能,然後詳細介紹一下我們在日常工作中,如何使用 ffmpeg 提供的工具來處理音視頻文件。
在講解 FFMPEG 命令之前,我們先要介紹一些音視頻格式的基要概念。
我們按使用目的可以將 FFMPEG 命令分成以下幾類:
除了 FFMPEG 的基本信息查詢命令外,其它命令都按下圖所示的流程處理音視頻
先是解復用獲取到編碼的數據包,然後將編碼的數據包傳送給解碼器(除非為數據流選擇了流拷貝,請參閱進一步描述)。 解碼器產生未壓縮的幀(原始視頻/ PCM音頻/ ...),可以通過濾波進一步處理(見下一節)。 在過濾之後,幀被傳遞到編碼器,編碼器並輸出編碼的數據包。 最後,這些傳遞給復用器,將編碼的數據包寫入輸出文件。
默認情況下,ffmpeg只包含輸入文件中每種類型(視頻,音頻,字幕)的一個流,並將其添加到每個輸出文件中。 它根據以下標准挑選每一個的「最佳」:對於視頻,它是具有最高解析度的流,對於音頻,它是具有最多channel的流,對於字幕,是第一個字幕流。 在相同類型的幾個流相等的情況下,選擇具有最低索引的流。
您可以通過使用-vn / -an / -sn / -dn選項來禁用某些默認設置。 要進行全面的手動控制,請使用-map選項,該選項禁用剛描述的默認設置。
FFMPEG 可以使用下面的參數進行基本信息查詢。例如,想查詢一下現在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 來查詢。詳細參數說明如下:
查詢編譯器libfdk_aac的信息
FFMPEG 處理音視頻時使用的命令格式與參數
ffmpeg 通過 -i 選項讀取輸任意數量的輸入「文件」(可以是常規文件,管道,網路流,抓取設備等,並寫入任意數量的輸出「文件」。
原則上,每個輸入/輸出「文件」都可以包含任意數量的不同類型的視頻流(視頻/音頻/字幕/附件/數據)。 流的數量和/或類型是由容器格式來限制。 選擇從哪個輸入進入到哪個輸出將自動完成或使用 -map 選項。
要引用選項中的輸入文件,您必須使用它們的索引(從0開始)。 例如。 第一個輸入文件是0,第二個輸入文件是1,等等。類似地,文件內的流被它們的索引引用。 例如。 2:3是指第三個輸入文件中的第四個流
上面就是 FFMPEG 處理音視頻的常用命令,下面是一些常用參數
首先通過下面的命令查看一下 mac 上都有哪些設備。
注意,桌面的輸入對幀率沒有要求,所以不用限制桌面的幀率。其實限制了也沒用。
由於沒有解碼或編碼,速度非常快,沒有質量損失。 但是,由於許多因素,在某些情況下可能無法正常工作。 應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據
上面的命令表式的是音頻、視頻都直接 ,只是將 mp4 的封裝格式轉成了flv。
在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。 幾個鏈式過濾器形成一個過濾器圖形。 ffmpeg區分兩種類型的過濾器圖形:簡單和復雜。
請注意,某些濾鏡會更改幀屬性,但不會改變幀內容。 例如。 上例中的fps過濾器會改變幀數,但不會觸及幀內容。 另一個例子是setpts過濾器。
復雜的過濾器圖使用-filter_complex選項進行配置。 請注意,此選項是全局性的,因為復雜的過濾器圖形本質上不能與單個流或文件明確關聯。
-lavfi選項等同於-filter_complex。
一個復雜的過濾器圖的一個簡單的例子是覆蓋過濾器,它有兩個視頻輸入和一個視頻輸出,包含一個視頻疊加在另一個上面。 它的音頻對應是amix濾波器
添加文字水印
添加本地時間水印
https://www.jianshu.com/p/e4ad7e1e7ed5
先通過 ffplay 找到要刪除 LOGO 的位置
使用 delogo 濾鏡刪除 LOGO
crop 格式:crop=out_w:out_h:x:y
https://blog.csdn.net/matrix_laboratory/article/details/53158307
首先創建一個 inputs.txt 文件,文件內容如下:
然後執行下面的命令:
播放yuv數據,需要指定解析度
② FFmpeg功能命令匯總
前言
如此強大的FFmpeg,能夠實現視頻採集、視頻格式轉化、視頻截圖、視頻添加水印、視頻切片、視頻錄制、視頻推流、更改音視頻參數功能等。通過終端命令如何實現這些功能,Richy在本文做一記錄,以備之後查閱。
注意:下面一一列舉的命令,未歸類整理,命令參數供參考。
如果參數有誤,大家可對照文章- FFmpeg參數命令 ,進行修改。
第一組
1.分離視頻音頻流
ffmpeg -i input_file -vcodec -an output_file_video//分離視頻流ffmpeg -i input_file -acodec -vn output_file_audio//分離音頻流
2.視頻解復用
ffmpeg –i test.mp4 –vcodec –an –f m4v test.264
ffmpeg –i test.avi –vcodec –an –f m4v test.264
3.視頻轉碼
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264
//轉碼為碼流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝文件
說明: -bf B幀數目控制,-g 關鍵幀間隔控制,-s 解析度控制
4.視頻封裝
ffmpeg –i video_file –i audio_file –vcodec –acodec output_file
5.視頻剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi //剪切視頻//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間
6.視頻錄制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi
7、利用ffmpeg視頻切片
主要把視頻源切成若干個.ts格式的視頻片段然後生成一個.m3u8的切片文件索引提供給html5的video做hls直播源
命令如下:
ffmpeg -i 視頻源地址 -strict -2 -c:v libx264 -c:a aac -f hls m3u8文件輸出地址
8、ffmpeg縮放視頻
假設原始視頻尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以縮小到 480p:
命令如下:
ffmpeg -i 視頻源地址 -vf scale=853:480 -acodec aac -vcodec h264 視頻輸出地址(如:out.mp4)
各個參數的含義:-i a.mov 指定待處理視頻的文件名-vf scale=853:480 vf 參數用於指定視頻濾鏡,其中 scale 表示縮放,後面的數字表示縮放至 853×480 px,其中的 853px 是計算而得,因為原始視頻的寬高比為 16:9,所以為了讓目標視頻的高度為 480px,則寬度 = 480 x 9 / 16 = 853-acodec aac 指定音頻使用 aac 編碼。註:因為 ffmpeg 的內置 aac 編碼目前(寫這篇文章時)還是試驗階段,故會提示添加參數 「-strict -2」 才能繼續,盡管添加即可。又或者使用外部的 libfaac(需要重新編譯 ffmpeg)。-vcodec h264 指定視頻使用 h264 編碼。註:目前手機一般視頻拍攝的格式(封裝格式、文件格式)為 mov 或者 mp4,這兩者的音頻編碼都是 aac,視頻都是 h264。out.mp4 指定輸出文件名上面的參數 scale=853:480 當中的寬度和高度實際應用場景中通常只需指定一個,比如指定高度為 480 或者 720,至於寬度則可以傳入 「-1」 表示由原始視頻的寬高比自動計算而得。即參數可以寫為:scale=-1:480,當然也可以 scale=480:-1
9、ffmpeg裁剪
有時可能只需要視頻的正中一塊,而兩頭的內容不需要,這時可以對視頻進行裁剪(crop),比如有一個豎向的視頻 1080 x 1920,如果指向保留中間 1080×1080 部分命令如下:ffmpeg -i 視頻源地址 -strict -2 -vf crop=1080:1080:0:420 視頻輸出地址(如:out.mp4)
其中的 crop=1080:1080:0:420 才裁剪參數,具體含義是 crop=width:height:x:y,其中 width 和 height 表示裁剪後的尺寸,x:y 表示裁剪區域的左上角坐標。比如當前這個示例,我們只需要保留豎向視頻的中間部分,所以 x 不用偏移,故傳入0,而 y 則需要向下偏移:(1920 – 1080) / 2 = 420
10. 轉視頻格式
ffmpeng -i source.mp4 -c:v libx264 -crf 24 destination.flv
其中 -crf 很重要,是控制轉碼後視頻的質量,質量越高,文件也就越大。
此值的范圍是 0 到 51:0 表示高清無損;23 是默認值(如果沒有指定此參數);51 雖然文件最小,但效果是最差的。
值越小,質量越高,但文件也越大,建議的值范圍是 18 到 28。而值 18 是視覺上看起來無損或接近無損的,當然不代表是數據(技術上)的轉碼無損。
第二組
1.ffmpeg 把文件當做直播推送至伺服器 (RTMP + FLV)
ffmpeg - re -i demo.mp4 -c - f flv rtmp://w.gslb.letv/live/streamid
2.將直播的媒體保存到本地
ffmpeg -i rtmp://r.glsb.letv/live/streamid -c streamfile.flv
3.將一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另一個直播伺服器
ffmpeg -i rtmp://r.glsb.letv/live/streamidA -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://w.glsb.letv/live/streamb
4.提取視頻中的音頻,並保存為mp3 然後輸出
ffmpeg -i input.avi -b:a 128k output.mp3
第三組
1.獲取視頻的信息
ffmpeg -i video.avi
2.將圖片序列合成視頻
ffmpeg -f image2 -i image%d.jpg video.mpg
上面的命令會把當前目錄下的圖片(名字如:image1.jpg. image2.jpg. 等...)合並成video.mpg
3.將視頻分解成圖片序列
ffmpeg -i video.mpg image%d.jpg
上面的命令會生成image1.jpg. image2.jpg. ...
支持的圖片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI
4.為視頻重新編碼以適合在iPod/iPhone上播放
ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
5.為視頻重新編碼以適合在PSP上播放
ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4
6.從視頻抽出聲音.並存為Mp3
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
7.將wav文件轉成Mp3
ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3
8.將.avi視頻轉成.mpg
ffmpeg -i video_origine.avi video_finale.mpg
9.將.mpg轉成.avi
ffmpeg -i video_origine.mpg video_finale.avi
10.將.avi轉成gif動畫(未壓縮)
ffmpeg -i video_origine.avi gif_anime.gif
11.合成視頻和音頻
ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
12.將.avi轉成.flv
ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
13.將.avi轉成dv
ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv
或者:
ffmpeg -i video_origine.avi -target pal-dv video_finale.dv
14.將.avi壓縮成divx
ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi
15.將Ogg Theora壓縮成Mpeg dvd
ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg
16.將.avi壓縮成SVCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-dvcd video_finale.mpg
17.將.avi壓縮成VCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg
18.多通道編碼
ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
19.從flv提取mp3
ffmpeg -i source.flv -ab 128k dest.mp3
第四組
1、將文件當做直播送至live
ffmpeg -re -i localFile.mp4 -c -f flv rtmp://server/live/streamName
2、將直播媒體保存至本地文件
ffmpeg -i rtmp://server/live/streamName -c mp.flv
3、將其中一個直播流,視頻改用h264壓縮,音頻不變,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
4、將其中一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
5、將其中一個直播流,視頻不變,音頻改用faac壓縮,送至另外一個直播服務流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec -f flv rtmp://server/live/h264_AAC_Stream
6、將一個高清流,復制為幾個不同視頻清晰度的流重新發布,其中音頻不變
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
7、功能一樣,只是採用-x264opts選項
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k
8、將當前攝像頭及音頻通過DSSHOW採集,視頻h264、音頻faac壓縮後發布
ffmpeg -r 25 -f dshow -s 640×480 -i video=」video source name」:audio=」audio source name」 -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name
9、將一個JPG圖片經過h264壓縮循環輸出為mp4視頻
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4
10、將普通流視頻改用h264壓縮,音頻不變,送至高清流服務(新版本FMS live=1)
ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv 「rtmp://server/live/h264Stream live=1〃
文/騷之哈塞給(作者)
③ ffmpeg常用命令
參數 -i 後面跟輸入文件(可以是本地文件,也可以是網路文件)
參數 -vcodec 視頻編碼解碼 保持原來格式
參數 -re 指定發送頻率,實時發送,如果不指定-re,以20倍速發送
等待50秒,播放50秒開始的視頻(不符合業務要求)
不等待50秒,直接播放50秒開始的視頻(符合業務要求)
-ss 寫在ffmpeg後面 先跳過,再推流
-ss 寫在-i後面,循環一直等到 等待時間後,再推流
參數 -vframes 指定幀數
④ FFmpeg 工具切片命令
對視頻進行轉碼(轉為 mp4),將視頻文件轉為視頻編碼 h.264,音頻編碼 aac 格式的 mp4 文件,mp4 視頻文件不是 h.264 編碼到後面切片的時候可能會遇到很多莫名其妙的問題
# infile.mp4 是待轉碼的文件(可以是其他格式,比如 avi…… 之類的)
# outfile.mp4 是轉碼輸出文件
# libx264 轉為 h.264 編碼
ffmpeg -i infile.mp4 -c:v libx264 -strict -2 outfile.mp4
將 mp4 切片,並生成 m3u8 文件
# output.mp4 需要切片的視頻文件
# playlist.m3u8 待生成的 m3u8 文件名
# 5 切片時間,表示隔幾秒進行切一個文件
# output%03d.ts 生成切割ts文件名,output%03d.ts 代表生成 output001.ts、output002.ts 這樣的格式,03d 可以隨意修改,佔位符
ffmpeg -i output.mp4 -c -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts
⑤ ffmpeg轉碼及日誌輸出相關命令
1.轉碼
ffmpeg -re -i <source_url> -acodec aac -b:a 64k -vcodec h264 -b:v 1024k -loglevel level+verbose -hide_banner -level 31 -vprofile baseline -g 20 -r 20 -vsync 2 -strict -2 -f flv <target_url>
更多命令參考:
ffmpeg推送保存rtmp流命令
2.日誌重定向到文件
在命令輸完以後加入 > logfilename 2>&1 即可保存到自己指定的logfilename中
3.日誌中加入自定義標識
要關注的av_log中加入自己的標識,之後用這個標識過濾就行
⑥ FFmpeg-常用命令
1、brew安裝路徑:/usr/local/Cellar/
2、隱藏多餘信息
3、查看格式信息
1、從視頻里提取視頻(只留視頻不留聲音):-an 表示忽略聲音估計是 audio no 之類的縮寫。
2、從視頻里提取mp3:-vn 表示忽略視頻,估計是 video no 之類的縮寫。
3、從視頻里提取pcm\wav音頻:
4、截取:(-ss為開始時間 -t為持續時間)
5、格式轉換
6、將視頻分解成圖片序列
7、將圖片序列合成視頻(沒有音頻)
8、將視頻轉成gif動畫(未壓縮)
9、合成視頻和音頻
10、截取一張jpg圖片
11、截取指定時間的一張圖。
1、播放pcm:
⑦ FFmpeg 命令
1). 查看支持的設備
輸出:
2). 推流桌面 - 只有桌面內容
3). 推流攝像頭
4). 只推流麥克風
5). 攝像頭+麥克分
6). 推流視頻
1).分離視頻音頻流
2).視頻解復用
3).視頻轉碼
其中:
-bf B幀數目控制
-g 關鍵幀間隔控制
-s 解析度控制
4).視頻封裝
5).視頻剪切
其中:
-r 提取圖像的頻率
-ss 開始時間
-t 持續時間
6).視頻錄制
7.YUV序列播放
8.YUV序列轉AVI
9.常用參數說明:
⑧ FFmpeg 命令行工具ffmpeg
註:先cd到文件所在地文件夾也是可以的,直接使用文件名
1.列出ffmpeg支持的所有格式:
2.剪切一段媒體文件,可以使音頻或者視頻文件:
3.將一個媒體文件切割成多個媒體文件:
4.提取一個視頻文件中的音頻文件:
5.提取一個視頻文件中的視頻文件:
6.從MP4文件中抽取視頻流導出為裸H264數據:
7.使用AAC音頻數據和H264視頻數據生成MP4文件:
注意:使用上面生成的aac和h264文件生成新的mp4文件,視頻播放速度會變快,暫時不知道怎麼解決,終端的警告:
8.對音頻文件的編碼格式做轉換:
9_1.從WAV音頻文件中導出PCM裸數據:
9_2.PCM數據轉WAV:
9_3.PCM數據轉MP3:
10.重新編碼視頻文件,復制音頻流,同時封裝到MP4格式的文件中:
11.將一個MP4格式的視頻轉換成gif格式的動圖:
12.將一個視頻的畫面部分生成圖片,比如要分析一個視頻裡面的每一幀都是什麼內容的時候:
13.使用一組圖片生成一個gif:
14.使用音量效果器,改變一個音頻媒體文件中的音量:
15.淡入效果器的使用:
16:淡出效果器的使用:
17:混音(將多路聲音進行合並)
18:對聲音進行變速但不變調效果器的使用:
19_1:為視頻添加水印:
19_2:去掉視頻水印:
20:視頻提亮效果器的使用:
21:為視頻增加對比度效果:
22:視頻旋轉效果器的使用:
23:視頻裁剪效果器的使用:
24:將一張RGBA格式表示的數據轉換成JPEG格式圖片:
25:將一張YUV格式表示的數據轉換成JPEG格式圖片:
26:將一段視頻推送到流媒體伺服器上:
27:將流媒體伺服器上的流mp到本地:
28:將兩個音頻文件以兩路流到形式封裝到一個文件中,比如在k歌的應用場景中,原唱伴唱實時切換的場景下,可以使用一個文件包含兩路流,一路是伴奏流,一路是原唱流:
29:將輸入的視頻的解析度改成960*540
⑨ FFmpeg常用命令(3)--分解與復用命令
比如文件格式的轉換、將封裝格式文件中的音頻與視頻文件分別抽取出來等。
2.mp4文件轉成2-1.flv格式文件。
參數說明:
-i 2.mp4:輸入文件
2-1.flv:輸出文件
-vcodec :vcodec指定視頻編碼器, 指明只拷貝,不做編解碼。
-acodec :acodec指定音頻編碼器, 指明只拷貝,不做編解碼。
wav轉wma格式,直接轉有可能轉不成功,比如wav轉mp3就轉不成功。
將2.mp4文件中的音頻部分抽取出來存為2-2.aac(注意只能存為aac格式不能存為wav等格式)。
參數說明:
-vn:v 代表視頻,n 代表 no 也就是沒有視頻的意思。
-acodec :只拷貝音頻部分,不做編解碼。
將2.mp4文件中的視頻部分抽取出來存為2-3.h264
參數說明:
-vcodec :只拷貝視頻部分,不做編解碼。
-an:a 代表音頻,n 代表 no 也就是沒有音頻的意思。
將2-2.aac和2-3.h264文件合並生成2-4.mp4文件。
⑩ ffmpeg 基本用法
1、libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;
2、libavcodec:用於各種類型聲音/圖像編解碼;
3、libavutil:包含一些公共的工具函數;
4、libswscale:用於視頻場景比例縮放、色彩映射轉換;
5、libpostproc:用於後期效果處理;
6、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼;
7、ffsever:是一個HTTP多媒體實時廣播流伺服器,支持時光平移;
8、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
在這組成部分中,需要熟悉基礎概念有
容器(Container)
容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。
流(Stream)
是一種視頻數據信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據。
幀(Frame)
幀代表一幅靜止的圖像,分為I幀,P幀,B幀。
編解碼器(Codec)
是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
復用/解復用(mux/demux)
把不同的流按照某種容器的規則放入容器,這種行為叫做復用(mux)
把不同的流從某種容器中解析出來,這種行為叫做解復用(demux)
1、FFmpeg程序把-i參數指定的若干文件內容讀入到內存,按照輸入的參數或者程序默認的參數來處理並且把結果寫入到若乾的文件中。輸入和輸出文件可以是計算機文件、管道、網路流、捕獲設備等。
2、FFmpeg用libavformat包調用解復用器(demuxers)來讀取輸入文件中被編碼的數據包(packets),如果有多個輸入文件,FFmpeg以有效輸入流的最小時間戳來同步,
3、然後解碼器(decoder)從已編碼的數據包中產生未被壓縮的幀(frame),在那之後調用可選的過濾器。
4、這些幀被傳遞到編碼器,編碼器會產生新的編碼包
5、把新的編碼包傳遞給復用器(muxer)處理並且把結果寫入到輸出文件中。
在多媒體處理中,filter的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟體工具。如:視頻翻轉,旋轉,縮放等。
語法:[input_link_label1]… filter_name=parameters [output_link_label1]…
1、視頻過濾器 -vf
如input.mp4視頻按順時針方向旋轉90度
ffplay -i input.mp4 -vf transpose=1
如input.mp4視頻水平翻轉(左右翻轉)
ffplay -i input.mp4 -vf hflip
2、音頻過濾器 -af
實現慢速播放,聲音速度是原始速度的50%
offplay input.mp3 -af atempo=0.5
過濾器鏈(Filterchain)
Filterchain = 逗號分隔的一組filter
語法:「filter1,filter2,filter3,…filterN-2,filterN-1,filterN」
順時針旋轉90度並水平翻轉
ffplay -i input.mp4 -vf transpose=1,hflip
過濾器圖(Filtergraph)
第一步: 源視頻寬度擴大兩倍。
ffmpeg -i ji.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源視頻水平翻轉
ffmpeg -i ji.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻轉視頻覆蓋output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很復雜?
用帶有鏈接標記的過濾器圖(Filtergraph)只需一條命令
基本語法
Filtergraph = 分號分隔的一組filterchain
「filterchain1;filterchain2;…filterchainN-1;filterchainN」
Filtergraph的分類
1、簡單(simple) 一對一
2、復雜(complex)多對一, 多對多
簡單過濾器圖處理流程:
復雜過濾器圖處理流程:
對於剛才用三步處理的方式,用過濾器圖可以這樣做:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split過濾器創建兩個輸入文件的拷貝並標記為[a],[b]
F2: [a]作為pad過濾器的輸入,pad過濾器產生2倍寬度並輸出到[1].
F3: [b]作為hflip過濾器的輸入,vflip過濾器水平翻轉視頻並輸出到[2].
F4: 用overlay過濾器把 [2]覆蓋到[1]的旁邊.
一些多媒體容器比如AVI,mkv,mp4等,可以包含不同種類的多個流,如何從容器中抽取各種流呢?
語法:
-map file_number[:stream_type][:stream_number]
這有一些特別流符號的說明:
1、-map 0 選擇第一個文件的所有流
2、-map i:v 從文件序號i(index)中獲取所有視頻流, -map i:a 獲取所有音頻流,-map i:s 獲取所有字幕流等等。
3、特殊參數-an,-vn,-sn分別排除所有的音頻,視頻,字幕流
tip:對比上面的圖,可以知道,假設有兩個文件ffmpeg -i fist.mp4 -i second.mp4 ..output.mp4
如果想去兩個文件的音視頻流 ffmpeg -i fist.mp4 -i second.mp4 map:0 -map 1 output.mp4
如果想去第一個文件的視頻流,第二個文件的音頻流ffmpeg -i fist.mp4 -i second.mp4 -map:v:0 -map:a:0 output.mp4
可用的bit流 :ffmpeg –bsfs
可用的編解碼器:ffmpeg –codecs
可用的解碼器:ffmpeg –decoders
可用的編碼器:ffmpeg –encoders
可用的過濾器:ffmpeg –filters
可用的視頻格式:ffmpeg –formats
可用的聲道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的協議:ffmpeg -protocals
碼率和幀率是視頻文件的最重要的基本特徵,對於他們的特有設置會決定視頻質量。如果我們知道碼率和時長那麼可以很容易計算出輸出文件的大小。
幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數,肉眼想看到連續移動圖像至少需要15幀。
碼率:比特率(也叫碼率,數據率)是一個確定整體視頻/音頻質量的參數,秒為單位處理的位元組數,碼率和視頻質量成正比,在視頻文件中中比特率用bps來表達。
設置幀率
1、用 -r 參數設置幀率
ffmpeg –i input.mp4 –r fps output.mp4
2、用fps filter設置幀率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
設置碼率 –b 參數
-b
ffmpeg -i film.avi -b 1.5M film.mp4
音頻:-b:a 視頻: - b:v
設置視頻碼率為1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4
控制輸出文件大小
-fs (file size首字母縮寫)
ffmpeg -i input.avi -fs 1024K output.mp4
計算輸出文件大小
(視頻碼率+音頻碼率) * 時長 /8 = 文件大小K
用-s參數設置視頻解析度,參數值wxh,w寬度單位是像素,h高度單位是像素
ffmpeg -i input_file -s 320x240 output_file
2、預定義的視頻尺寸
下面兩條命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
下表列出了所有的預定義尺寸
Scale filter調整解析度
Scale filter的優點是可以使用一些額外的參數
語法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的額外參數
下面兩條命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
對輸入視頻成比例縮放
改變為源視頻一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改變為原視頻的90%大小:
ffmpeg -i input.mpg -vf scale=iw 0.9:ih 0.9 output.mp4
在未知視頻的解析度時,保證調整的解析度與源視頻有相同的橫縱比。
寬度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1
相反地,高度固定300,寬度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300
從輸入文件中選取你想要的矩形區域到輸出文件中,常見用來去視頻黑邊。
語法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]
裁剪輸入視頻的左三分之一,中間三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的默認值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中間一半區域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
比較裁剪後的視頻和源視頻比較
ffplay -i ji.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2 iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w 2.4:40
自動檢測裁剪區域�
cropdetect filter 自動檢測黑邊區域
ffplay ji.mp4 -vf cropdetect
填充視頻(pad)
在視頻幀上增加一快額外額區域,經常用在播放的時候顯示不同的橫縱比
語法:pad=width[:height:[:x[:y:[:color]]]]
創建一個30個像素的粉色寬度來包圍一個SVGA尺寸的圖片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
同理可以製作input.mp4視頻用30個像素粉色包圍視頻
ffplay -i input.mp4 -vf pad=iw+60:ih+60:30:30:pink
4:3到16:9
一些設備只能播放16:9的橫縱比,4:3的橫縱比必須在水平方向的兩邊填充成16:9,
高度被保持,寬度等於高度乘以16/9,x(輸入文件水平位移)值由表達式(output_width - input_width)/2來計算。
4:3到16:9的通用命令是:
ffmpeg -i input.mp4 -vf pad=ih 16/9:ih :(ow-iw)/2:0:color output.mp4
eg:ffplay -f input.mp4 -vf pad=ih 16/9:ih:(ow-iw)/2:0:pink
16:9到4:3
為了用4:3的橫縱比來顯示16:9的橫縱比,填充輸入文件的垂直兩邊,寬度保持不變,高度是寬度的3/4,y值(輸入文件的垂直偏移量)是由一個表達式(output_height-input_height)/2計算出來的。
16:9到4:3的通用命令:
ffmpeg -i input.mp4-vf pad=iw :iw 3/4:0:(oh-ih)/2:color output.mp4
eg:ffplay -i input.mp4 =size=320x180 -vf pad=iw:iw 3/4:0:(oh-ih)/2:pink
水平翻轉語法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
垂直翻轉語法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
語法:transpose={0,1,2,3}
0:逆時針旋轉90°然後垂直翻轉
1:順時針旋轉90°
2:逆時針旋轉90°
3:順時針旋轉90°然後水平翻轉
模糊
語法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
注意:luma_r和alpha_r半徑取值范圍是0~min(w,h)/2, chroma_r半徑的取值范圍是0~min(cw/ch)/2
銳化
語法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的參數是可選的,默認值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩陣,取值范圍3-13,默認值為5
l_msize_y:垂直亮度矩陣,取值范圍3-13,默認值為5
l_amount:亮度強度,取值范圍-2.0-5.0,負數為模糊效果,默認值1.0
c_msize_x:水平色彩矩陣,取值范圍3-13,默認值5
c_msize_y:垂直色彩矩陣,取值范圍3-13,默認值5
c_amount:色彩強度,取值范圍-2.0-5.0,負數為模糊效果,默認值0.0
eg:
使用默認值,亮度矩陣為5x5和亮度值為1.0
ffmpeg -i input.mp4 -vf unsharp output.mp4
高斯模糊效果(比較強的模糊):
ffplay -i input.mp4 -vf unsharp=13:13:-2
語法:overlay[=x[:y]
所有的參數都是可選,默認值都是0
Logo在左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
刪除logo
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的坐標
w:h logo的寬和高
t: 矩形邊緣的厚度默認值4
show:若設置為1有一個綠色的矩形,默認值0.
ffplay -i ji.mp4 -vf delogo=50:51:60:60:100:0
語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的參數值
x:離左上角的橫坐標
y: 離左上角的縱坐標
fontcolor:字體顏色
fontsize:字體大小
text:文本內容
textfile:文本文件
t:時間戳,單位秒
n:幀數開始位置為0
draw/enable:控制文件顯示,若值為0不顯示,1顯示,可以使用函數
1、在左上角添加Welcome文字
ffplay -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、設置字體顏色和大小
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"
動態文本
用 t (時間秒)變數實現動態文本
1、頂部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t 50:fontcolor=darkorange:fontsize=30"
2、底部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t 50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直從下往上滾動
ffplay ji.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30「
在右上角顯示當前時間 localtime
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}'「
每隔3秒顯示一次當前時間
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}':enable=lt(mod(t,3),1)"
FFmpeg支持絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
截取一張圖片使用 –ss(seek from start)參數.
ffmpeg -ss 01:23:45 -i ji.mp4 image.jpg
從視頻中生成GIF圖片
ffmpeg -i ji.mp4 -t 10 -pix_fmt rgb24 ji.gif
轉換視頻為圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
圖片轉換為視頻
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
和視頻一樣,圖片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
和視頻一樣圖片同樣能翻轉,旋轉和覆蓋
翻轉
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋轉
ffmpeg -i -vf transpose=1 image_rotated.png
覆蓋
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
屏幕錄像
顯示設備名稱
ffmpeg -list_devices 1 -f dshow -i mmy
調用攝像頭
ffplay -f dshow -i video="Integrated Camera"
保存為文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
添加字幕subtitles
語法 –vf subtitles=file
ffmpeg -i ji.mp4 -vf subtitles=rgb.srt output.mp4
視頻顫抖、色彩平衡
視頻顫抖
ffplay –i ji.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2) sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2) sin(n/7)
色彩平衡
ffplay -i ji.mp4 -vf curves=vintage
色彩變幻
ffplay -i ji.mp4 -vf hue="H=2 PI t: s=sin(2 PI t)+1「
彩色轉換黑白
ffplay -i ji.mp4 -vf lutyuv="u=128:v=128"
設置音頻視頻播放速度
3倍視頻播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/3
¾速度播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音頻
ffplay -i speech.mp3 -af atempo=2
截圖
每隔一秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一張圖。
多張截圖合並到一個文件里(2x3) 每隔一千幀(秒數=1000/fps25)即40s截一張圖
ffmpeg -i ji.mp4 -frames 3 -vf "select=not(mod(n,1000)),scale=320:240,tile=2x3" out.png
本篇文章主要記錄ffmpeg的一些基礎指令操作,該資料的來源是源於網上的一個ppt文檔,感謝文檔的總結。