FFmpeg筆記(二)-- 命令行工具

ffprobe

主要用于查看文件的格式和詳細信息。

1.查看音頻文件:
ffprobe ~/Desktop/32037.mp3

可得到結(jié)果:

#時長、開始播放時間、波特率
Duration:00:05:14.83,start:0.000000,bitrate:64kb/s

#第一個流是音頻流,編碼格式是MP3格式,采樣率是24kHz,聲道是立體聲,
#采樣表示格式是SInt16(short)的 planner(平鋪格式),這路流的比特率是64Kbit/s。
Stream#0:0 Audio:mp3,24000Hz,stereo,s16p,64kb/s
2.查看視頻文件:

可以顯示format_name、時間長度duration、文件 大小size、比特率bit_rate、流的數(shù)目nb_streams等:

ffprobe -show_format 32037.mp4

以JSON格式的形式輸出具體每一個流最詳細的信息,視頻中會有視頻的寬高信息、是否有b幀、視頻幀的總數(shù)目、視頻的編碼格式、顯示比例、比特率等信息,音頻中會有音頻的編碼格式、 表示格式、聲道數(shù)、時間長度、比特率、幀的總數(shù)目等信息:

ffprobe -print_format json -show_streams 32037.mp4
3.顯示幀信息:
ffprobe -show_frames sample.mp4
4.查看包信息:
ffprobe -show_packets sample.mp4

ffplay

ffplay是以FFmpeg框架為基礎(chǔ),外加渲染音視頻的庫libSDL來構(gòu)建的媒體文件播放器。

1.播放音頻:
ffplay 32037.mp3
2.播放視頻:

一些特殊格式需要指定參數(shù)播放,如yuv的播放方式見【7.】。

ffplay 32037.mp4
3.視頻結(jié)束之后會從頭再次播放,共循環(huán)播放10 次:
ffplay 32037.mp4 -loop 10
4.播放音頻中第一路流。

一個視頻中可能有多路音頻、視頻流。如一部電影有英文和中文的不同音頻流選擇。播放視頻中的第一路音頻流,如果參數(shù)ast后面跟的是 2,那么就播放第二路音頻流,如果沒有第二路音頻流的話,就會靜音:

ffplay 大話西游.mkv -ast 1
5.播放視頻中的第一路視頻流。

如果參數(shù)vst后面跟的是 2,那么就播放第二路視頻流,但是如果沒有第二路視頻流,就會是黑屏即什么都不顯示:

ffplay 大話西游.mkv -vst 1
6.播放pcm文件:

格式(-f)、聲道數(shù)(-channels)、采樣率(-ar)必須設(shè)置正確,如果其中任何一項參數(shù)設(shè)置不正確,都不會得到正常的播放結(jié)果。

ffplay song.pcm -f s16le -channels 2 -ar 44100
7.播放一幀視頻幀、RGB:

格式(-f rawvideo代表原始格式)、表示格式(-pixel_format yuv420p)、寬高(-s 480*480),寬高要設(shè)置正常不然不能正常播放,寬高可以使用ffprobe工具查看。

ffplay -f rawvideo -pixel_format yuv420p -s 480*480 texture.yuv
或
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 texture.rgb
8.音視頻對齊方式:

播放器接收到的視頻幀或者音頻幀,內(nèi)部都會有時間戳(PTS時鐘)來標識它實際應(yīng)該在什么時刻進行展示。實際的對齊策略如下:
比較視頻當前的播放時間和音頻當前的播放時間,如果視頻播放過快,則通過加大延遲或者重復播放來降低視頻播放速度;如果視頻播放慢了,則通過減小延遲或者丟幀來追趕音頻播放的時間點。關(guān)鍵就在于音視頻時間的比較以及延遲的計算,當然在比較的過程中會設(shè)置一個閾值(Threshold),若超過預設(shè)的閾值就應(yīng)該做調(diào)整(丟幀渲染 或者重復渲染),這就是整個對齊策略。

#顯式地指定了ffplay使用音頻為基準進行音視頻同步,用來播放文件32037.mp4,當然這也是ffplay的默認設(shè)置
ffplay 32037.mp4 -sync audio

#顯式地指定了使用以視頻為基準進行音視頻同步的方式播 放視頻文件。
ffplay 32037.mp4 -sync video

#顯式地指定了使用外部時鐘作為基準進行音視頻同步的方 式,用來播放視頻文件。
ffplay 32037.mp4 -sync ext

ffmpeg

媒體文件轉(zhuǎn)換工具。

1.參數(shù):
1)通用參數(shù)

·-f fmt:指定格式(音頻或者視頻格式)。
·-i filename:指定輸入文件名,在Linux下當然也能指定:0.0(屏 幕錄制)或攝像頭。
·-y:覆蓋已有文件。
·-t duration:指定時長。
·-fs limit_size:設(shè)置文件大小的上限。
·-ss time_off:從指定的時間(單位為秒)開始,也支持[-]hh: mm:ss[.xxx]的格式。
·-re:代表按照幀率發(fā)送,尤其在作為推流工具的時候一定要加入 該參數(shù),否則ffmpeg會按照最高速率向流媒體服務(wù)器不停地發(fā)送數(shù)據(jù)。
·-map:指定輸出文件的流映射關(guān)系。例如:“-map 1:0-map 1: 1”要求將第二個輸入文件的第一個流和第二個流寫入輸出文件。如果沒 有-map選項,則ffmpeg采用默認的映射關(guān)系。

2)視頻參數(shù)

·-b:指定比特率(bit/s),ffmpeg是自動使用VBR的,若指定了該參數(shù)則使用平均比特率。
·-bitexact:使用標準比特率。
·-vb:指定視頻比特率(bits/s)。
·-r rate:幀速率(fps)。
·-s size:指定分辨率(320×240)。
·-aspect aspect:設(shè)置視頻長寬比(4:3,16:9或1.3333, 1.7777)。
·-croptop size:設(shè)置頂部切除尺寸(in pixels)。
·-cropbottom size:設(shè)置底部切除尺寸(in pixels)。
·-cropleft size:設(shè)置左切除尺寸(in pixels)。
·-cropright size:設(shè)置右切除尺寸(in pixels)。
·-padtop size:設(shè)置頂部補齊尺寸(in pixels)。
·-padbottom size:底補齊(in pixels)。
·-padleft size:左補齊(in pixels)。
·-padright size:右補齊(in pixels)。
·-padcolor color:補齊帶顏色(000000-FFFFFF)。
·-vn:取消視頻的輸出。
·-vcodec codec:強制使用codec編解碼方式('copy'代表不進行重新 編碼)。

3)音頻參數(shù)

·-ab:設(shè)置比特率(單位為bit/s,老版的單位可能是Kbit/s),對于 MP3格式,若要聽到較高品質(zhì)的聲音則建議設(shè)置為160Kbit/s(單聲道則 設(shè)置為80Kbit/s)以上。
·-aq quality:設(shè)置音頻質(zhì)量(指定編碼)。
·-ar rate:設(shè)置音頻采樣率(單位為Hz)。
·-ac channels:設(shè)置聲道數(shù),1就是單聲道,2就是立體聲。 ·-an:取消音頻軌。
·-acodec codec:指定音頻編碼('copy'代表不做音頻轉(zhuǎn)碼,直接復 制)。
·-vol volume:設(shè)置錄制音量大小(默認為256)<百分比>。

2.實例
1)列出ffmpeg支持的所有格式:
ffmpeg -formats
2)剪切一段媒體文件,可以是音頻或者視頻文件:
#將文件input.mp4從第50s開始剪切20s的時間,輸出到文件 output.mp4中,
#其中-ss指定偏移時間(time Offset),-t指定的時長 (duration)。
ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
3)將視頻文件切割為多個文件:
ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
4)提取一個視頻文件中的音頻文件:
ffmpeg -i input.mp4 -vn -acodec copy output.m4a
5)使一個視頻中的音頻靜音,即只保留視頻:
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
6)從MP4文件中抽取視頻流導出為裸H264數(shù)據(jù):
ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
7)使用AAC音頻數(shù)據(jù)和H264的視頻生成MP4文件:
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f
mp4 output.mp4
8)對音頻文件的編碼格式做轉(zhuǎn)換:
ffmpeg -i input.wav -acodec libfdk_aac output.aac
9)從WAV音頻文件中導出PCM裸數(shù)據(jù):
ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
10)重新編碼視頻文件,復制音頻流,同時封裝到MP4格式的文件 中:
ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
11)將一個MP4格式的視頻轉(zhuǎn)換成為gif格式的動圖:
#按照分辨比例不動寬度改為100(使用VideoFilter的 scaleFilter),幀率改為10(-r),只處理前5秒鐘(-t)的視頻,生成 gif。
ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
12)將一個視頻的畫面部分生成圖片,比如要分析一個視頻里面的每一幀都是什么內(nèi)容的時候,可能就需要用到這個命令了:
#每4秒鐘截取一幀視頻畫面生成一張圖片,生成的圖片從 frames_0001.png開始一直遞增下去。
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
13)使用一組圖片可以組成一個gif,如果你連拍了一組照片,就可 以用下面這行命令生成一個gif:
ffmpeg -i frames_%04d.png -r 5 output.gif
14)使用音量效果器,可以改變一個音頻媒體文件中的音量:
#音量減小一半
ffmpeg -i input.wav -af ‘volume=0.5’ output.wav
15)淡入效果器的使用:
//將input.wav文件中的前5s做一個淡入效果,輸出到output.wav中
ffmpeg -i input.wav -filter_complex afade=t=in:ss=0:d=5 output.wav
16)淡出效果器的使用:
ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
17)將兩路聲音進行合并,比如要給一段聲音加上背景音樂:
ffmpeg -i vocal.wav -i accompany.wav -filter_complex
amix=inputs=2:duration=shortest output.wav
18)對聲音進行變速但不變調(diào)效果器的使用:
#將vocal.wav按照0.5倍的速度進行處理生成output.wav,
#時間長度將會變?yōu)檩斎氲?倍。但是音高是不變的,這就是大家常說的 變速不變調(diào)。
ffmpeg -i vocal.wav -filter_complex atempo=0.5 output.wav
19)為視頻增加水印效果:
#main_w代表主視頻寬度, overlay_w代表水印寬度,main_h代表主視頻高度,overlay_h代表水印
ffmpeg -i input.mp4 -i changba_icon.png -filter_complex
'[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
20)視頻提亮效果器的使用:
#參數(shù)是brightness,取值范圍是從-1.0到1.0,默認值是0。
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25 -f mp4 output.mp4
21)為視頻增加對比度效果:
#參數(shù)是contrast,取值范圍是從-2.0到2.0,默認值是1.0。
ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
22)視頻旋轉(zhuǎn)效果器的使用:
ffmpeg -i input.mp4 -vf "transpose=1" -b:v 600k output.mp4
23)視頻裁剪效果器的使用:
ffmpeg -i input.mp4 -an -vf "crop=240:480:120:0" -vcodec libx264 -b:v 600k output.mp4
24)將一張RGBA格式表示的數(shù)據(jù)轉(zhuǎn)換為JPEG格式的圖片:
ffmpeg -f rawvideo -pix_fmt rgba -s 480*480 -i texture.rgb -f image2 -vcodec mjpeg
output.jpg
25)將一個YUV格式表示的數(shù)據(jù)轉(zhuǎn)換為JPEG格式的圖片:
ffmpeg -f rawvideo -pix_fmt yuv420p -s 480*480 -i texture.yuv -f image2 -vcodec mjpeg output.jpg
26)將一段視頻推送到流媒體服務(wù)器上:
#rtmp://xxx代表流媒體服務(wù)器的地址,加上-re參數(shù)代 表將實際媒體文件的播放速度作為推流速度進行推送。
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
27)將流媒體服務(wù)器上的流dump到本地:
ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
28)將兩個音頻文件以兩路流的形式封裝到一個文件中,比如在K 歌的應(yīng)用場景中,原伴唱實時切換的場景下,可以使用一個文件包含兩 路流,一路是伴奏流,另外一路是原唱流:
ffmpeg -i 131.mp3 -i 134.mp3 -map 0:a -c:a:0 libfdk_aac -b:a:0 96k -map 1:a -c:a:1 libfdk_aac -b:a:1 64k -vn -f mp4 output.m4a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容