基于windows環境安裝好必要的ffmpeg後,對ffmpeg基礎指令進行一些了解:
1:ffmpeg檢視版本:
ffmpeg -version
2:ffmpeg查詢指令:
基本資訊:ffmpeg -h
進階資訊:ffmpeg -h long
所有資訊:ffmpeg -h full
ffplay檢視幫助: ffplay -h
ffprobe檢視幫助: ffprobe -h
ffmpeg具體分類支援的參數檢視幫助: ffmepg -h type=name
比如:
ffmpeg -h muxer=flv
ffmpeg -h filter=atempo (atempo調整音頻播放速率)
ffmpeg -h encoder=libx264
3:ffmpeg分類查詢指令:
-version 顯示版本
-buildconf 顯示編譯配置
-protocols 顯示可用的協定
-formats 顯示可用格式 (muxers+demuxers)
-filters 顯示可用的過濾器
-muxers 顯示可用複用器
-demuxers 顯示可用解複用器
-codecs 顯示可用編解碼器 (decoders+encoders)
-decoders 顯示可用解碼器
-encoders 顯示可用編碼器
-layouts 顯示标準聲道名稱
-pix_fmts 顯示可用的像素格式
-sample_fmts 顯示可用的音頻采樣 格式
-bsfs 顯示可用比特流filter
-colors 顯示可用的顔色名稱
4:ffmpeg基礎指令:
主要參數:
◼ -i 設定輸入流
◼ -f 設定輸出格式(format)
◼ -ss 開始時間
◼ -t 時間長度
音頻參數:
◼ -aframes 設定要輸出的音頻幀數
◼ -b:a 音頻碼率
◼ -ar 設定采樣率
◼ -ac 設定聲音的Channel數
◼ -acodec 設定聲音編解碼器,如果用copy表示原始編解碼資料必須被拷貝。
◼ -an 不處理音頻
◼ -af 音頻過濾器
ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3
視訊參數:
◼ -vframes 設定要輸出的視訊幀數
◼ -b 設定視訊碼率
◼ -b:v 視訊碼率
◼ -r 設定幀速率
◼ -s 設定畫面的寬與高
◼ -vn 不處理視訊
◼ -aspect aspect 設定橫縱比 4:3 16:9 或 1.3333 1.7777
◼ -vcodec 設定視訊編解碼器,如果用copy表示原始編解碼資料必須被拷貝。
◼ -vf 視訊過濾器
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 -s 640x480 -aspect 16:9 -vcodec libx265
相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】
【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~
5:ffmepg使用指令提取音頻或視訊:
提取音視訊資料:
◼ 保留封裝格式
ffmpeg -i test.mp4 -acodec copy -vn audio.mp4
ffmpeg -i test.mp4 -vcodec copy -an video.mp4
◼ 提取視訊
保留編碼格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264
強制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264
◼ 提取音頻
保留編碼格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac
強制格式:ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3
提取像素格式和PCM資料:
◼ 提取YUV
◼ 提取3秒資料,分辨率和源視訊一緻
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv
◼ 提取3秒資料,分辨率轉為320x240
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
◼ 提取RGB
◼ 提取3秒資料,分辨率轉為320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
◼ RGB和YUV之間的轉換
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb
◼ 提取PCM
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i test.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_2_f32le_2.pcm
6:ffmpeg指令轉封裝:
◼ 保持編碼格式:
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts
◼ 改變編碼格式:
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
◼ 修改幀率:
ffmpeg -i test.mp4 -r 15 -codec copy output.mp4 (錯誤指令)
ffmpeg -i test.mp4 -r 15 output2.mp4
◼ 修改視訊碼率:
ffmpeg -i test.mp4 -b 400k output_b.mkv (此時音頻也被重新編碼)
◼ 修改視訊碼率:
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv
◼ 修改音頻碼率:
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
如果不想重新編碼video,需要加上-vcodec copy
◼ 修改音視訊碼率:
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
◼ 修改視訊分辨率:
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
◼ 修改音頻采樣率:
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
7:ffmpeg過濾器指令:
1:生成測試檔案
◼ 找三個不同的視訊每個視訊截取10秒内容
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i 複仇者聯盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i 紅海行動.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
如果音視訊格式不統一則強制統一為 -vcodec libx264 -acodec aac
◼ 将上述1.mp4/2.mp4/3.mp4轉成ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
◼ 轉成flv格式
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv
分離某些封裝格式(例如MP4/FLV/MKV等)中的H.264的時候,需要首先寫入SPS和PPS,否則會導緻分離出來的資料沒有SPS、PPS而無法播放。
H.264碼流的SPS和PPS資訊存儲在AVCodecContext結構體的extradata中。
需要使用ffmpeg中名稱為“h264_mp4toannexb”的bitstream filter處理
2:開始拼接檔案:
◼ 以MP4格式進行拼接
方法1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4
方法2:ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4
自己建立 mp4list.txt,在其中實作 file '1.mp4'
◼ 以TS格式進行拼接
方法1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
方法2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
自己建立 tslist.txt,在其中實作 file '1.ts'
◼ 以FLV格式進行拼接
方法1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4
方法2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4
需要驗證最後結果是否正常:
◼ 方法1隻适用部分封裝格式,比如TS
◼ 建議:
(1)使用方法2進行拼接
(2)轉成TS格式再進行拼接
3:測試不同編碼拼接:
◼ 修改音頻編碼
ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4 結果第二段沒有聲音
◼ 修改音頻采樣率
ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4 第二段播放異常
◼ 修改視訊編碼格式
ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4
◼ 修改視訊分辨率
ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsf h264_mp4toannexb 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4
◼ 注意:
把每個視訊封裝格式也統一為ts,拼接輸出的時候再輸出你需要的封裝格式,比如MP4
視訊分辨率可以不同,但是編碼格式需要統一
音頻編碼格式需要統一,音頻參數(采樣率/聲道等)也需要統一
8:ffmpeg 圖檔與視訊互轉:
◼ 截取一張圖檔
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp
-i 輸入
-y 覆寫
-f 格式
image2 一種格式
-ss 起始值
-vframes 幀 如果大于1 那麼 輸出加%03d test%03d.jpg
-s 格式大小size
◼ 轉換視訊為圖檔(每幀一張圖):
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
◼ 圖檔轉換為視訊:
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
◼ 從視訊中生成GIF圖檔
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
◼ 将 GIF 轉化為 視訊
ffmpeg -f gif -i image2.gif image2.mp4
9:ffmpeg 視訊錄制指令:
有時候寫入MP4檔案會不成功,改成flv就好
◼ 先安裝dshow軟體 Screen Capturer Recorder,
項目位址:https://sourceforge.net/projects/screencapturer/files/
然後檢視可用裝置名字:
ffmpeg -list_devices true -f dshow -i dummy
◼ 錄制視訊(預設參數)
桌面: ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4
攝像頭: ffmpeg -f dshow -i video="Integrated Webcam" -y v-out2.flv (要根據自己攝像頭名稱)
◼ 錄制聲音(預設參數)
系統聲音: ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac
系統+麥克風聲音: ffmpeg -f dshow -i audio="麥克風 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
◼ 檢視視訊錄制的可選參數
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
◼ 檢視音頻錄制的可選參數
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capturer"
ffmpeg -f dshow -list_options true -i audio="麥克風 (Realtek(R) Audio)"
指定參數錄制音視訊:
◼ ffmpeg -f dshow -i audio="麥克風 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1920x1080 -framerate 15 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -y av-out.flv
◼ ffmpeg -f dshow -i audio="麥克風 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -r 15 -y av-out2.mp4
◼ ffmpeg -f dshow -i audio="麥克風 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -framerate 15 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -r 15 -y av-out3.mp4
10:ffmpeg直播推流/拉流指令:
◼ 直播拉流
ffplay rtmp://server/live/streamName
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
對于不是rtmp的協定 -c copy要謹慎使用
◼ 可用位址
HKS:rtmp://live.hkstv.hk.lxdns.com/live/hks2
大熊兔(點播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy cctv1.ts
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 cctv1.flv
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -acodec aac -vcodec libx264 cctv1-2.flv
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
◼ 直播推流
ffmpeg -re -i out.mp4 -c copy flv rtmp://server/live/streamName
-re,表示按時間戳讀取檔案
11:ffmpeg filter過濾器應用:
1:視訊裁剪:
變量 用于 ow 和 oh 參數的表達式中的可用變量
x, y 對 x 的計算值(從左上角水準方向的像素個數)和 y(垂直像素的數量),對每個幀進行評估,x的預設值為(iw - ow)/2, y 的預設值為(ih - oh)/2
in_w, iw 輸入的寬度
in_h, ih 輸入的高度
out_w,ow 輸出(裁剪)寬度,預設值= iw
out_h,oh 輸出(裁剪)高度,預設值= ih
a 縱橫比,與 iw/ih 相同
sar 輸入樣本比例
dar 輸入顯示寬比,等于表達式 a*sar
hsub, vsub 水準和垂直的色度子樣本值,對于像素格式 yuv422p, hsub 的值為 2,vsub 為 1
n 輸入幀的數目,從 0 開始
pos 位置在輸入框的檔案中,如果不知道 NAN
t 時間戳以秒表示,如果輸入時間戳未知
ow 的值可以從 oh 得到,反之亦然,但不能從 x 和 y 中得到,因為這些值是在 ow 和 oh 之後進行的。
x 的值可以從 y 的值中得到,反之亦然。
例如,在輸入框的左三、中三和右三,我們可以使用指令(iw/3*2)是開始裁剪的位置:
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
(1)裁剪 100x100 的區域,起點為(12,34).
crop=100:100:12:34
相同效果:
crop=w=100:h=100:x=12:y=34
(2)裁剪中心區域,大小為 100x100
crop=100:100
(3)裁剪中心區域,大小為輸入視訊的 2/3
crop=2/3*in_w:2/3*in_h
(4)裁剪中心區域的正方形,高度為輸入視訊的高
crop=out_w=in_h
crop=in_h
(5)裁剪偏移左上角 100 像素
crop=in_w-100:in_h-100:100:100
(6)裁剪掉左右 10 像素,上下 20 像素
crop=in_w-2*10:in_h-2*20
(7)裁剪右下角區域
crop=in_w/2:in_h/2:in_w/2:in_h/2
2:文字水印:
編譯的時候需要支援 FreeType、FontConfig、iconv,系統中需要有相關的子庫,
在 FFmpeg 中增加純字母水印可以使用 drawtext 濾鏡進行支援:
drawtext 參數相關:
text 字元串 文字
textfile 字元串 文字檔案
box 布爾 文字區域背景框(預設 false)
boxcolor 色彩 展示字型區域塊的顔色
font 字元串 字型名稱(預設為 Sans 字型)
fontsize 整數 顯示字型的大小
x 字元串 預設為 0
y 字元串 預設為 0
alpha 浮點數 透明度(預設為 1),值從 0~1
相關使用執行個體:
(1)将文字的水印加在視訊的左上角:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"
将字型的顔色設定為綠色:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"
如果想調整文字水印顯示的位置,調整 x 與 y 參數的數值即可。
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200"
修改透明度
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':fontcolor=green:x=400:y=200:alpha=0.5"
(2)文字水印還可以增加一個框,然後給框加上背景顔色:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
(3)有些時候文字水印希望以本地時間作為水印内容,可以在 drawtext 濾鏡中配合一些特殊用法來完成,在 text 中顯示本地目前時間,格式為年月日時分秒的方式,
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=gree
n:box=1:boxcolor=yellow"
在使用 ffmpeg 轉碼存儲到檔案時需要加上-re,否則時間不對。
ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=gree n:box=1:boxcolor=yellow" out.mp4
(4)在個别場景中,需要定時顯示水印,定時不顯示水印,這種方式同樣可以配合 drawtext 濾鏡進行處理,使用 drawtext 與 enable 配合即可,
例如每 3 秒鐘顯示一次文字水印:
ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"
在使用 ffmpeg 轉碼存儲到檔案時需要加上-re,否則時間不對。
表達式參考:http://www.ffmpeg.org/ffmpeg-utils.html 3 Expression Evaluation
lt(x, y) Return 1 if x is lesser than y, 0 otherwise.
mod(x, y) Compute the remainder of division of x by y.
(5)跑馬燈效果
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"
修改字型透明度,修改字型顔色
ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"
3:圖檔水印:
為視訊添加圖檔水印可以使用 movie 濾鏡,相關參數:
filename 字元串 輸入的檔案名,可以是檔案,協定,裝置
format_name, f 字元串 輸入的封裝格式
stream_index, si 整數 輸入的流索引編号
seek_point, sp 浮點數 Seek 輸入流的時間位置
streams, s 字元串 輸入的多個流的流資訊
loop 整數 循環次數
discontinuity 時間內插補點 支援跳動的時間戳內插補點
例如:
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4
➢ 原始視訊檔案路徑:input.mp4
➢ 水印圖檔路徑:logo.png
➢ 水印位置:(x,y)=(10,10)<=(left,top)距離左側、頂部各 10 像素;
➢ 輸出檔案路徑:output.mp4
main_w 視訊單幀圖像寬度
main_h 視訊單幀圖像高度
overlay_w 水印圖檔的寬度
overlay_h 水印圖檔的高度
對應地可以将 overlay 參數設定成如下值來改變水印圖檔的位置:
左上角 10:10
右上角 main_w-overlay_w-10:10
左下角 10:main_h-overlay_h-10
右下角 main_w-overlay_w-10:main_h-overlay_h-10
使用執行個體:
在 FFmpeg 中加入圖檔水印有兩種方式:
一種是通過 movie 指定水印檔案路徑,
另外一種方式是通過filter 讀取輸入檔案的流并指定為水印。
讀取 movie 圖檔檔案作為水印:
(1)圖檔 logo.png 将會打入到 input.mp4 視訊中,顯示在 x 坐标 50、y 坐标 20 的位置
ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"
由于 logo.png 圖檔的背景色是白色,是以顯示起來比較生硬,如果水印圖檔是透明背景的,效果會更好,
下面找一張透明背景色的圖檔試一下:
ffplay -i input.mp4 -vf "movie=logo2.png[watermark];[in][watermark]overlay=50:10[out]"
(2)顯示位置
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]"
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]"
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]"
(3)跑馬燈效果
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
4:生成畫中畫:
可以通過 overlay 将 多個視訊流、多個多媒體采集裝置、多個視訊檔案合并到一個界面中,生成畫中畫的效果。
相關參數介紹:
x 字元串 X 坐标
y 字元串 Y 坐标
eof_action 整數 遇到 eof 表示時的處理方式,預設為重複
➢ repeat(值為 0):重複前一幀
➢ endcall(值為 1):停止所有的流
➢ pass(值為 2):保留主圖層
shortest 布爾 終止最短的視訊時全部終止(預設 false)
format 整數 設定 output 的像素格式,預設為 yuv420
➢ yuv420 (值為 0)
➢ yuv422 (值為 1)
➢ yuv444 (值為 2)
➢ rgb (值為 3)
(1)顯示畫中畫效果
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"
縮放子畫面尺寸
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"
(2)跑馬燈
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
5:多宮格處理:
從前文中可以看出進行視訊圖像處理時,overlay 濾鏡為關鍵畫布,可以通過 FFmpeg建立一個畫布,也可以使用預設的畫布。如果想以多宮格的方式展現,則可以自己建立一個足夠大的畫布, 下面就來看一下多宮格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4
1.2.3.4.mp4 為檔案路徑,out.MP4 為輸出檔案路徑,通過 nullsrc 建立 overlay 畫布,畫布大小 640:480,使用[0:v][1:v][2:v][3:v]将輸入的 4 個視訊流去除,分别進行縮放處理,然後基于 nullsrc 生成的畫布進行視訊平鋪,指令中自定義 upperleft,upperright,lowerleft,lowerright 進行不同位置平鋪。
隻疊加左上右上的指令(輸出到tmp1中,可以最後加[out]):
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4
6:視訊倒放相關控制:
通過ffmpeg指令行進行音視訊倒放,android平台同樣可以以将ffmpeg內建進去實作音視訊的相關編輯
1.視訊倒放,無音頻
ffmpeg.exe -i inputfile.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
2.視訊倒放,音頻不變
ffmpeg.exe -i inputfile.mp4 -vf reverse reversed.mp4
3.音頻倒放,視訊不變
ffmpeg.exe -i inputfile.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
4.音視訊同時倒放
ffmpeg.exe -i test.mp4 -vf reverse -af areverse -preset superfast outtest.mp4
6、檢視音視訊實際時長
ffprobe.exe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
ffprobe.exe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
7、檢視NV21
ffplay.exe -i input.nv21 -pix_fmt nv21 -s 4624x3472
8、nv21轉jpg
ffmpeg -y -s 1920x1080 -pix_fmt nv21 -i image.nv21.yuv image.jpg
9.jpg轉nv21
ffmpeg -i input.jpg -pix_fmt nv21 output_1080x1920.yuv
10、rgba轉png
ffmpeg -f rawvideo -pixel_format rgba -video_size 1080x1920 -i input.raw output.png
11、jpg轉rgba
ffmpeg -i input.jpg -vcodec rawvideo -pix_fmt rgba raw1.rgb
12、剔除mp4中音頻或視訊(-map 0:0 -map 0:1)
ffmpeg.exe -i input.mp4 -map 0:0 -vcodec copy -acodec copy output.mp4
-map 0:0: 第1個輸入檔案的第一個流,也就是主要的視訊流。
-map 0:1: 第1個輸入檔案的第二個流,是視訊的聲音。
-vcodec copy: 拷貝選擇的視訊流。
-acodec copy: 拷貝選擇的聲音流
12:分離H264或mpeg2video視訊格式資料指令:
#提取H264:
ffmpeg -i source.200kbps.768x320_10s.flv -vcodec libx264 -an -f h264 source.200kbps.768x320_10s.h264
#提取MPEG2:
ffmpeg -i source.200kbps.768x320_10s.flv -vcodec mpeg2video -an -f mpeg2video source.200kbps.768x320_10s.mpeg2v
#播放YUV
ffplay -pixel_format yuv420p -video_size 768x320 -framerate 25 source.200kbps.768x320_10s.yuv
13:ffmpeg 指令查找重定向(-f fmt 對應的參數)
⽐如我們在-f fmt打算指定格式時,怎麼知道什麼樣的格式才是适合的format?
可以通過ffmpeg -formats | findstr xx的⽅式去查找。
對于findstr,/i是忽略⼤⼩寫
⽐如:
查找Audio的裸流解複⽤器:ffmpeg -formats | findstr /i audio
查找Video的裸流解複⽤器:ffmpeg -formats | findstr /i video
14:ffmpeg其他基礎指令:
#檢視視訊元資訊 比如 編碼格式和比特率
$ ffmpeg -i input.mp4
#隻檢視元資訊
$ ffmpeg -i input.mp4 -hide_banner
#将音頻和視訊合并到一個檔案:
$ ffmpeg -i input.aac -i input.mp4 output.mp4
#截取一張圖檔:
$ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
#為音頻添加封面:
$ ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4
# 有兩個輸入檔案,一個是封面圖檔cover.jpg,另一個是音頻檔案input.mp3。
# -loop 1參數表示圖檔無限循環,-shortest參數表示音頻檔案結束,輸出視訊就結束。
15:花屏 綠屏
綠屏的主要是: 無法渲染的畫面有些用黑色填充,有些用綠色填充,有些用上一幀畫面填充。
===> 視訊參數改變, 而解碼端的SPS&PPS資訊未及時重新擷取更新,會導緻畫面無法正常渲染,繼而導緻綠屏的現象出現。
15.1:全屏花屏:
正常花屏:
==>碼率特别低的時候出現的大面積馬賽克,編碼器每秒産生的視訊資料太少。
==>視訊參數問題:
======>視訊源修改過視訊參數(如從720P修改1080P),此時用戶端用于解碼的SPS&PPS如果沒有重新擷取的話,就會出現整個畫面花屏的現象。
======>不會恢複。
15.2:局部花屏:
SO_SNDBUF的Buffer太小,丢失P幀
P幀丢失。
總結:視訊播放時,相關SPS和PPS參數不比對/丢幀
16.ffplay基礎指令整理
1:ffplay基礎指令:
ffplay -version
ffplay -h
2:ffplay播放控制:
'q, ESC' 退出
'f' 全屏
'p, SPC' 暫停
'w' 切換顯示模式(視訊/音頻波形/音頻頻帶)
's' 步進到下一幀
'left/right' 快退/快進 10 秒
'down/up' 快退/快進 1 分鐘
'page down/page up' 跳轉到前一章/下一章(如果沒有章節,快退/快進 10 分鐘)
'mouse click' 跳轉到滑鼠點選的位置(根據滑鼠在顯示視窗點選的位置計算百分比)
3:ffplay指令選項:
基本格式: ffplay [選項] [‘輸入檔案’]
相關主要選項:
1:主要操作基礎指令:
-x width 強制顯示寬帶
-y height 強制顯示高度
-video_size size 設定幀尺寸 設定幀尺寸大小。
适用于類似原始YUV等沒有包含幀大小(WxH)的視訊。
例如:ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
-pixel_format format 設定像素格式。
-volume vol 設定起始音量。音量範圍[0 ~100]
-window_title title 設定視窗标題(預設為輸入檔案名)
-loop number 設定播放循環次數
-showmode mode 設定顯示模式,可用的模式值:0 顯示視訊,1 顯示音頻波形,2 顯示音頻頻譜。預設為0,如果視訊不存在則自動選擇2
-vf filtergraph 設定視訊濾鏡
-af filtergraph 設定音頻濾鏡
-f fmt 強制使用設定的格式進行解析。比如-f s16le
-fs 以全屏模式啟動
-an 禁用音頻(不播放聲音)
-vn 禁用視訊(不播放視訊)
-sn 禁用字幕(不顯示字幕)
-nodisp 關閉圖形化顯示視窗,視訊将不顯示
-noborder 無邊框視窗
-t duration 設定播放視訊/音頻長度,時間機關如 -ss選項
-ss pos 跳轉到指定的位置,注意時間機關:
比如:'55' 55 seconds,
'12:03:45' ,12 hours, 03 minutes and 45 seconds,
'23.189' 23.189 second
-bytes 按位元組進行跳轉(0=off 1=on -1=auto)。
-seek_interval interval 自定義左/右鍵定位拖動間隔(以秒為機關),預設值為10秒(代碼沒有看到實作)
2:較進階的指令:
-stats 列印多個回放統計資訊,包括顯示流持續時間,編解碼器參數,流中的目前位置,以及音頻/視訊同步內插補點。
預設情況下處于啟用狀态,要顯式禁用它則需要指定-nostats。。
-fast 非标準化規範的多媒體相容優化。
-genpts 生成pts。
-sync type 同步類型 将主時鐘設定為audio(type=audio),video(type=video)或external(type=ext),預設是audio為主時鐘。
-ast audio_stream_specifier 指定音頻流索引,比如-ast 3,播放流索引為3的音頻流
-vst video_stream_specifier 指定視訊流索引,比如-vst 4,播放流索引為4的視訊流
-sst subtitle_stream_specifier 指定字幕流索引,比如-sst 5,播放流索引為5的字幕流
-autoexit 視訊播放完畢後退出
-exitonkeydown 鍵盤按下任何鍵退出播放
-exitonmousedown 滑鼠按下任何鍵退出播放
◼ -codec:media_specifier codec_name 強制使用設定的多媒體解碼器,media_specifier可用值為a(音頻), v(視訊)和s字幕。
比如:codec:v h264_qsv 強制視訊采用h264_qsv解碼
◼ -acodec codec_name 強制使用設定的音頻解碼器進行音頻解碼
◼ -vcodec codec_name 強制使用設定的視訊解碼器進行視訊解碼
◼ -scodec codec_name 強制使用設定的字幕解碼器進行字幕解碼
◼ -autorotate 根據檔案中繼資料自動旋轉視訊。值為0或1 ,預設為1。
◼ -framedrop 如果視訊不同步則丢棄視訊幀。當主時鐘非視訊時鐘時預設開啟。
若需禁用則使用 -noframedrop
◼ -infbuf 不限制輸入緩沖區大小。盡可能快地從輸入中讀取盡可能多的資料。
播放實時流時預設啟用,如果未及時讀取資料,則可能會丢棄資料。
此選項将不限制緩沖區的大小。若需禁用則使用 -noinfbuf
3:ffplay 播放視訊樣例:
◼ 播放本地檔案
ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4
ffplay buweishui.mp3
◼ 播放網絡流
ffplay -window_title "rtmp stream" rtmp://202.69.69.180:443/webcast/bshdlive-pc
◼ 強制解碼器
mpeg4解碼器:ffplay -vcodec mpeg4 test.mp4
h264解碼器:ffplay -vcodec h264 test.mp4
◼ 禁用音頻或視訊
禁用音頻:ffplay test.mp4 -an
禁用視訊:ffplay test.mp4 -vn
◼ 播放YUV資料
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
◼ 播放RGB資料
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb
◼ 播放PCM資料
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)
-ac set number of audio channels (from 0 to INT_MAX) (default 0)
4:ffplay簡單過濾器:
◼ 視訊旋轉
ffplay -i test.mp4 -vf transpose=1
◼ 視訊反轉
ffplay test.mp4 -vf hflip
ffplay test.mp4 -vf vflip
◼ 視訊旋轉和反轉
ffplay test.mp4 -vf hflip,transpose=1
◼ 音頻變速播放
ffplay -i test.mp4 -af atempo=2
◼ 視訊變速播放
ffplay -i test.mp4 -vf setpts=PTS/2
◼ 音視訊同時變速
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2
◼ 更多參考
http://www.ffmpeg.org/ffmpeg-filters.html