基于windows環(huán)境安裝好必要的ffmpeg后,對(duì)ffmpeg基礎(chǔ)命令進(jìn)行一些了解:
1:ffmpeg查看版本
ffmpeg -version
2:ffmpeg查詢命令:
基本信息:ffmpeg -h
高級(jí)信息:ffmpeg -h long
所有信息:ffmpeg -h full
ffplay查看幫助: ffplay -h
ffprobe查看幫助: ffprobe -h
ffmpeg具體分類支持的參數(shù)查看幫助: ffmepg -h type=name
比如:
ffmpeg -h muxer=flv
ffmpeg -h filter=atempo (atempo調(diào)整音頻播放速率)
ffmpeg -h encoder=libx264
3:ffmpeg分類查詢命令:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-660354.html
-version 顯示版本
-buildconf 顯示編譯配置
-protocols 顯示可用的協(xié)議
-formats 顯示可用格式 (muxers+demuxers)
-filters 顯示可用的過濾器
-muxers 顯示可用復(fù)用器
-demuxers 顯示可用解復(fù)用器
-codecs 顯示可用編解碼器 (decoders+encoders)
-decoders 顯示可用解碼器
-encoders 顯示可用編碼器
-layouts 顯示標(biāo)準(zhǔn)聲道名稱
-pix_fmts 顯示可用的像素格式
-sample_fmts 顯示可用的音頻采樣 格式
-bsfs 顯示可用比特流filter
-colors 顯示可用的顏色名稱
4:ffmpeg基礎(chǔ)命令:
主要參數(shù):
? -i 設(shè)定輸入流
? -f 設(shè)定輸出格式(format)
? -ss 開始時(shí)間
? -t 時(shí)間長(zhǎng)度
音頻參數(shù):
? -aframes 設(shè)置要輸出的音頻幀數(shù)
? -b:a 音頻碼率
? -ar 設(shè)定采樣率
? -ac 設(shè)定聲音的Channel數(shù)
? -acodec 設(shè)定聲音編解碼器,如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝。
? -an 不處理音頻
? -af 音頻過濾器
ffmpeg -i test.mp4 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame -aframes 200 out2.mp3
視頻參數(shù):
? -vframes 設(shè)置要輸出的視頻幀數(shù)
? -b 設(shè)定視頻碼率
? -b:v 視頻碼率
? -r 設(shè)定幀速率
? -s 設(shè)定畫面的寬與高
? -vn 不處理視頻
? -aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777
? -vcodec 設(shè)定視頻編解碼器,如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝。
? -vf 視頻過濾器
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 -s 640x480 -aspect 16:9 -vcodec libx265
5:ffmepg使用命令提取音頻或視頻:
提取音視頻數(shù)據(jù):
? 保留封裝格式
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
強(qiáng)制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264
? 提取音頻
保留編碼格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac
強(qiáng)制格式:ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3
提取像素格式和PCM數(shù)據(jù):
? 提取YUV
? 提取3秒數(shù)據(jù),分辨率和源視頻一致
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv
? 提取3秒數(shù)據(jù),分辨率轉(zhuǎn)為320x240
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
? 提取RGB
? 提取3秒數(shù)據(jù),分辨率轉(zhuǎn)為320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
? RGB和YUV之間的轉(zhuǎn)換
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命令轉(zhuǎn)封裝:
? 保持編碼格式:
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 (錯(cuò)誤命令)
ffmpeg -i test.mp4 -r 15 output2.mp4
? 修改視頻碼率:
ffmpeg -i test.mp4 -b 400k output_b.mkv (此時(shí)音頻也被重新編碼)
? 修改視頻碼率:
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:生成測(cè)試文件
? 找三個(gè)不同的視頻每個(gè)視頻截取10秒內(nèi)容
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i 復(fù)仇者聯(lián)盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i 紅海行動(dòng).mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
如果音視頻格式不統(tǒng)一則強(qiáng)制統(tǒng)一為 -vcodec libx264 -acodec aac
? 將上述1.mp4/2.mp4/3.mp4轉(zhuǎn)成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
? 轉(zhuǎn)成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的時(shí)候,需要首先寫入SPS和PPS,否則會(huì)導(dǎo)致分離出來的數(shù)據(jù)沒有SPS、PPS而無法播放。
H.264碼流的SPS和PPS信息存儲(chǔ)在AVCodecContext結(jié)構(gòu)體的extradata中。
需要使用ffmpeg中名稱為“h264_mp4toannexb”的bitstream filter處理
2:開始拼接文件:
? 以MP4格式進(jìn)行拼接
方法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,在其中實(shí)現(xiàn) file '1.mp4'
? 以TS格式進(jìn)行拼接
方法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,在其中實(shí)現(xiàn) file '1.ts'
? 以FLV格式進(jìn)行拼接
方法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
需要驗(yàn)證最后結(jié)果是否正常:
? 方法1只適用部分封裝格式,比如TS
? 建議:
(1)使用方法2進(jìn)行拼接
(2)轉(zhuǎn)成TS格式再進(jìn)行拼接
3:測(cè)試不同編碼拼接:
? 修改音頻編碼
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 結(jié)果第二段沒有聲音
? 修改音頻采樣率
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
? 注意:
把每個(gè)視頻封裝格式也統(tǒng)一為ts,拼接輸出的時(shí)候再輸出你需要的封裝格式,比如MP4
視頻分辨率可以不同,但是編碼格式需要統(tǒng)一
音頻編碼格式需要統(tǒng)一,音頻參數(shù)(采樣率/聲道等)也需要統(tǒng)一
8:ffmpeg 圖片與視頻互轉(zhuǎn):
? 截取一張圖片
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
? 轉(zhuǎn)換視頻為圖片(每幀一張圖):
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
? 圖片轉(zhuǎn)換為視頻:
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 轉(zhuǎn)化為 視頻
ffmpeg -f gif -i image2.gif image2.mp4
9:ffmpeg 視頻錄制命令:
有時(shí)候?qū)懭隡P4文件會(huì)不成功,改成flv就好
? 先安裝dshow軟件 Screen Capturer Recorder,
項(xiàng)目地址:https://sourceforge.net/projects/screencapturer/files/
然后查看可用設(shè)備名字:
ffmpeg -list_devices true -f dshow -i dummy
? 錄制視頻(默認(rèn)參數(shù))
桌面: ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4
攝像頭: ffmpeg -f dshow -i video="Integrated Webcam" -y v-out2.flv (要根據(jù)自己攝像頭名稱)
? 錄制聲音(默認(rèn)參數(shù))
系統(tǒng)聲音: ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac
系統(tǒng)+麥克風(fēng)聲音: ffmpeg -f dshow -i audio="麥克風(fēng) (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
? 查看視頻錄制的可選參數(shù)
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
? 查看音頻錄制的可選參數(shù)
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capturer"
ffmpeg -f dshow -list_options true -i audio="麥克風(fēng) (Realtek(R) Audio)"
指定參數(shù)錄制音視頻:
? ffmpeg -f dshow -i audio="麥克風(fēng) (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="麥克風(fēng) (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="麥克風(fēng) (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
對(duì)于不是rtmp的協(xié)議 -c copy要謹(jǐn)慎使用
? 可用地址
HKS:rtmp://live.hkstv.hk.lxdns.com/live/hks2
大熊兔(點(diǎn)播):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,表示按時(shí)間戳讀取文件
11:ffmpeg filter過濾器應(yīng)用:
1:視頻裁剪:
?
變量 用于 ow 和 oh 參數(shù)的表達(dá)式中的可用變量
x, y 對(duì) x 的計(jì)算值(從左上角水平方向的像素個(gè)數(shù))和 y(垂直像素的數(shù)量),對(duì)每個(gè)幀進(jìn)行評(píng)估,x的默認(rèn)值為(iw - ow)/2, y 的默認(rèn)值為(ih - oh)/2
in_w, iw 輸入的寬度
in_h, ih 輸入的高度
out_w,ow 輸出(裁剪)寬度,默認(rèn)值= iw
out_h,oh 輸出(裁剪)高度,默認(rèn)值= ih
a 縱橫比,與 iw/ih 相同
sar 輸入樣本比例
dar 輸入顯示寬比,等于表達(dá)式 a*sar
hsub, vsub 水平和垂直的色度子樣本值,對(duì)于像素格式 yuv422p, hsub 的值為 2,vsub 為 1
n 輸入幀的數(shù)目,從 0 開始
pos 位置在輸入框的文件中,如果不知道 NAN
t 時(shí)間戳以秒表示,如果輸入時(shí)間戳未知
ow 的值可以從 oh 得到,反之亦然,但不能從 x 和 y 中得到,因?yàn)檫@些值是在 ow 和 oh 之后進(jìn)行的。
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 的區(qū)域,起點(diǎn)為(12,34).
crop=100:100:12:34
相同效果:
crop=w=100:h=100:x=12:y=34
(2)裁剪中心區(qū)域,大小為 100x100
crop=100:100
(3)裁剪中心區(qū)域,大小為輸入視頻的 2/3
crop=2/3*in_w:2/3*in_h
(4)裁剪中心區(qū)域的正方形,高度為輸入視頻的高
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)裁剪右下角區(qū)域
crop=in_w/2:in_h/2:in_w/2:in_h/2
2:文字水印:
編譯的時(shí)候需要支持 FreeType、FontConfig、iconv,系統(tǒng)中需要有相關(guān)的子庫(kù),
在 FFmpeg 中增加純字母水印可以使用 drawtext 濾鏡進(jìn)行支持:
drawtext 參數(shù)相關(guān):
text 字符串 文字
textfile 字符串 文字文件
box 布爾 文字區(qū)域背景框(缺省 false)
boxcolor 色彩 展示字體區(qū)域塊的顏色
font 字符串 字體名稱(默認(rèn)為 Sans 字體)
fontsize 整數(shù) 顯示字體的大小
x 字符串 缺省為 0
y 字符串 缺省為 0
alpha 浮點(diǎn)數(shù) 透明度(默認(rèn)為 1),值從 0~1
相關(guān)使用實(shí)例:
(1)將文字的水印加在視頻的左上角:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20"
將字體的顏色設(shè)置為綠色:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green"
如果想調(diào)整文字水印顯示的位置,調(diào)整 x 與 y 參數(shù)的數(shù)值即可。
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)文字水印還可以增加一個(gè)框,然后給框加上背景顏色:
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
(3)有些時(shí)候文字水印希望以本地時(shí)間作為水印內(nèi)容,可以在 drawtext 濾鏡中配合一些特殊用法來完成,在 text 中顯示本地當(dāng)前時(shí)間,格式為年月日時(shí)分秒的方式,
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 轉(zhuǎn)碼存儲(chǔ)到文件時(shí)需要加上-re,否則時(shí)間不對(duì)。
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)在個(gè)別場(chǎng)景中,需要定時(shí)顯示水印,定時(shí)不顯示水印,這種方式同樣可以配合 drawtext 濾鏡進(jìn)行處理,使用 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 轉(zhuǎn)碼存儲(chǔ)到文件時(shí)需要加上-re,否則時(shí)間不對(duì)。
表達(dá)式參考: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?濾鏡,相關(guān)參數(shù):
filename 字符串 輸入的文件名,可以是文件,協(xié)議,設(shè)備
format_name, f 字符串 輸入的封裝格式
stream_index, si 整數(shù) 輸入的流索引編號(hào)
seek_point, sp 浮點(diǎn)數(shù) Seek 輸入流的時(shí)間位置
streams, s 字符串 輸入的多個(gè)流的流信息
loop 整數(shù) 循環(huán)次數(shù)
discontinuity 時(shí)間差值 支持跳動(dòng)的時(shí)間戳差值
例如:
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)距離左側(cè)、頂部各 10 像素;
? 輸出文件路徑:output.mp4
main_w 視頻單幀圖像寬度
main_h 視頻單幀圖像高度
overlay_w 水印圖片的寬度
overlay_h 水印圖片的高度
對(duì)應(yīng)地可以將 overlay 參數(shù)設(shè)置成如下值來改變水印圖片的位置:
左上角 10:10
右上角 main_w-overlay_w-10:10
左下角 10:main_h-overlay_h-10
右下角 main_w-overlay_w-10:main_h-overlay_h-10
使用實(shí)例:
在 FFmpeg 中加入圖片水印有兩種方式:
一種是通過 movie 指定水印文件路徑,
另外一種方式是通過filter 讀取輸入文件的流并指定為水印。
讀取 movie 圖片文件作為水?。?
(1)圖片 logo.png 將會(huì)打入到 input.mp4 視頻中,顯示在 x 坐標(biāo) 50、y 坐標(biāo) 20 的位置
ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"
由于 logo.png 圖片的背景色是白色,所以顯示起來比較生硬,如果水印圖片是透明背景的,效果會(huì)更好,
下面找一張透明背景色的圖片試一下:
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?將 多個(gè)視頻流、多個(gè)多媒體采集設(shè)備、多個(gè)視頻文件合并到一個(gè)界面中,生成畫中畫的效果。
相關(guān)參數(shù)介紹:
x 字符串 X 坐標(biāo)
y 字符串 Y 坐標(biāo)
eof_action 整數(shù) 遇到 eof 表示時(shí)的處理方式,默認(rèn)為重復(fù)
? repeat(值為 0):重復(fù)前一幀
? endcall(值為 1):停止所有的流
? pass(值為 2):保留主圖層
shortest 布爾 終止最短的視頻時(shí)全部終止(默認(rèn) false)
format 整數(shù) 設(shè)置 output 的像素格式,默認(rèn)為 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:多宮格處理:
從前文中可以看出進(jìn)行視頻圖像處理時(shí),overlay 濾鏡為關(guān)鍵畫布,可以通過 FFmpeg建立一個(gè)畫布,也可以使用默認(rèn)的畫布。如果想以多宮格的方式展現(xiàn),則可以自己建立一個(gè)足夠大的畫布, 下面就來看一下多宮格展示的例子:
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 創(chuàng)建 overlay 畫布,畫布大小 640:480,使用[0:v][1:v][2:v][3:v]將輸入的 4 個(gè)視頻流去除,分別進(jìn)行縮放處理,然后基于 nullsrc 生成的畫布進(jìn)行視頻平鋪,命令中自定義 upperleft,upperright,lowerleft,lowerright 進(jìn)行不同位置平鋪。
只疊加左上右上的命令(輸出到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:視頻倒放相關(guān)控制:
通過ffmpeg命令行進(jìn)行音視頻倒放,android平臺(tái)同樣可以以將ffmpeg集成進(jìn)去實(shí)現(xiàn)音視頻的相關(guān)編輯
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.音視頻同時(shí)倒放
ffmpeg.exe -i test.mp4 -vf reverse -af areverse -preset superfast outtest.mp4
6、查看音視頻實(shí)際時(shí)長(zhǎng)
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轉(zhuǎn)jpg
ffmpeg -y -s 1920x1080 -pix_fmt nv21 -i image.nv21.yuv image.jpg
9.jpg轉(zhuǎn)nv21
ffmpeg -i input.jpg -pix_fmt nv21 output_1080x1920.yuv
10、rgba轉(zhuǎn)png
ffmpeg -f rawvideo -pixel_format rgba -video_size 1080x1920 -i input.raw output.png
11、jpg轉(zhuǎn)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個(gè)輸入文件的第一個(gè)流,也就是主要的視頻流。
-map 0:1: 第1個(gè)輸入文件的第二個(gè)流,是視頻的聲音。
-vcodec copy: 拷貝選擇的視頻流。
-acodec copy: 拷貝選擇的聲音流
12:分離H264或mpeg2video視頻格式數(shù)據(jù)命令:
#提取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 對(duì)應(yīng)的參數(shù))
?如我們?cè)?f fmt打算指定格式時(shí),怎么知道什么樣的格式才是適合的format?
可以通過ffmpeg -formats | findstr xx的?式去查找。
對(duì)于findstr,/i是忽略??寫
?如:
查找Audio的裸流解復(fù)?器:ffmpeg -formats | findstr /i audio
查找Video的裸流解復(fù)?器:ffmpeg -formats | findstr /i video
14:ffmpeg其他基礎(chǔ)命令:
#查看視頻元信息 比如 編碼格式和比特率
$ ffmpeg -i input.mp4
#只查看元信息
$ ffmpeg -i input.mp4 -hide_banner
#將音頻和視頻合并到一個(gè)文件:
$ 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
# 有兩個(gè)輸入文件,一個(gè)是封面圖片cover.jpg,另一個(gè)是音頻文件input.mp3。
# -loop 1參數(shù)表示圖片無限循環(huán),-shortest參數(shù)表示音頻文件結(jié)束,輸出視頻就結(jié)束。
15:花屏 綠屏
綠屏的主要是:?無法渲染的畫面有些用黑色填充,有些用綠色填充,有些用上一幀畫面填充。
===> 視頻參數(shù)改變, 而解碼端的SPS&PPS信息未及時(shí)重新獲取更新,會(huì)導(dǎo)致畫面無法正常渲染,繼而導(dǎo)致綠屏的現(xiàn)象出現(xiàn)。
15.1:全屏花屏:
? 正?;ㄆ粒?/p>
==>碼率特別低的時(shí)候出現(xiàn)的大面積馬賽克,編碼器每秒產(chǎn)生的視頻數(shù)據(jù)太少。
==>視頻參數(shù)問題:
======>視頻源修改過視頻參數(shù)(如從720P修改1080P),此時(shí)客戶端用于解碼的SPS&PPS如果沒有重新獲取的話,就會(huì)出現(xiàn)整個(gè)畫面花屏的現(xiàn)象。
======>不會(huì)恢復(fù)。
15.2:局部花屏:
? SO_SNDBUF的Buffer太小,丟失P幀
? P幀丟失。
總結(jié):視頻播放時(shí),相關(guān)SPS和PPS參數(shù)不匹配/丟幀
原文鏈接:https://blog.csdn.net/yun6853992/article/details/121870328
?
★文末名片可以免費(fèi)領(lǐng)取音視頻開發(fā)學(xué)習(xí)資料,內(nèi)容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音視頻學(xué)習(xí)路線圖等等。
見下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓文章來源:http://www.zghlxwxcb.cn/news/detail-660354.html
?
到了這里,關(guān)于音視頻學(xué)習(xí)之ffmpeg常用基礎(chǔ)命令整理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!