天天看點

音視訊學習之ffmpeg常用基礎指令整理

作者:音視訊流媒體技術

基于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分類查詢指令:

音視訊學習之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 等等)有需要的可以點選加群免費領取~

音視訊學習之ffmpeg常用基礎指令整理

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:視訊裁剪:

音視訊學習之ffmpeg常用基礎指令整理
變量 			   用于 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播放控制:

音視訊學習之ffmpeg常用基礎指令整理
'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