前言
FFMPEG是特別強(qiáng)大的專門用于處理音視頻的開(kāi)源庫(kù)振亮。你既可以使用它的API對(duì)音視頻進(jìn)行處理,也可以使用它提供的工具如绸,如 ffmpeg, ffplay, ffprobe黍匾,來(lái)編輯你的音視頻文件。
本文將簡(jiǎn)要介紹一下 FFMPEG 庫(kù)的基本目錄結(jié)構(gòu)及其功能现喳,然后詳細(xì)介紹一下我們?cè)谌粘9ぷ髦锌粒绾问褂?ffmpeg 提供的工具來(lái)處理音視頻文件。
1. FFMPEG 目錄及作用
- libavcodec: 提供了一系列編碼器的實(shí)現(xiàn)嗦篱。
- libavformat: 實(shí)現(xiàn)在流協(xié)議冰单,容器格式及其本IO訪問(wèn)。
- libavutil: 包括了hash器灸促,解碼器和各利工具函數(shù)诫欠。
- libavfilter: 提供了各種音視頻過(guò)濾器涵卵。
- libavdevice: 提供了訪問(wèn)捕獲設(shè)備和回放設(shè)備的接口。
- libswresample: 實(shí)現(xiàn)了混音和重采樣荒叼。
- libswscale: 實(shí)現(xiàn)了色彩轉(zhuǎn)換和縮放工能轿偎。
2.FFMPEG基本概念
在講解 FFMPEG 命令之前,我們先要介紹一些音視頻格式的基要概念被廓。
- 音/視頻流
在音視頻領(lǐng)域坏晦,我們把一路音/視頻稱為一路流。如我們小時(shí)候經(jīng)常使用VCD看港片嫁乘,在里邊可以選擇粵語(yǔ)或國(guó)語(yǔ)聲音昆婿,其實(shí)就是CD視頻文件中存放了兩路音頻流,用戶可以選擇其中一路進(jìn)行播放亦渗。 - 容器
我們一般把 MP4? FLV挖诸、MOV等文件格式稱之為容器。也就是在這些常用格式文件中法精,可以存放多路音視頻文件多律。以 MP4 為例,就可以存放一路視頻流搂蜓,多路音頻流狼荞,多路字幕流。 - channel
channel是音頻中的概念帮碰,稱之為聲道相味。在一路音頻流中,可以有單聲道殉挽,雙聲道或立體聲丰涉。
3.FFMPEG 命令
我們按使用目的可以將 FFMPEG 命令分成以下幾類:
- 基本信息查詢命令
- 錄制
- 分解/復(fù)用
- 處理原始數(shù)據(jù)
- 濾鏡
- 切割與合并
- 圖/視互轉(zhuǎn)
- 直播相關(guān)
除了 FFMPEG 的基本信息查詢命令外,其它命令都按下圖所示的流程處理音視頻
先是解復(fù)用獲取到編碼的數(shù)據(jù)包斯碌,然后將編碼的數(shù)據(jù)包傳送給解碼器(除非為數(shù)據(jù)流選擇了流拷貝一死,請(qǐng)參閱進(jìn)一步描述)。 解碼器產(chǎn)生未壓縮的幀(原始視頻/ PCM音頻/ ...)傻唾,可以通過(guò)濾波進(jìn)一步處理(見(jiàn)下一節(jié))投慈。 在過(guò)濾之后,幀被傳遞到編碼器冠骄,編碼器并輸出編碼的數(shù)據(jù)包伪煤。 最后,這些傳遞給復(fù)用器凛辣,將編碼的數(shù)據(jù)包寫(xiě)入輸出文件抱既。
默認(rèn)情況下,ffmpeg只包含輸入文件中每種類型(視頻扁誓,音頻蝙砌,字幕)的一個(gè)流阳堕,并將其添加到每個(gè)輸出文件中跋理。 它根據(jù)以下標(biāo)準(zhǔn)挑選每一個(gè)的“最佳”:對(duì)于視頻择克,它是具有最高分辨率的流,對(duì)于音頻前普,它是具有最多channel的流肚邢,對(duì)于字幕,是第一個(gè)字幕流拭卿。 在相同類型的幾個(gè)流相等的情況下骡湖,選擇具有最低索引的流。
您可以通過(guò)使用-vn / -an / -sn / -dn選項(xiàng)來(lái)禁用某些默認(rèn)設(shè)置峻厚。 要進(jìn)行全面的手動(dòng)控制响蕴,請(qǐng)使用-map選項(xiàng),該選項(xiàng)禁用剛描述的默認(rèn)設(shè)置惠桃。
3.1 基本信息查詢命令
FFMPEG 可以使用下面的參數(shù)進(jìn)行基本信息查詢浦夷。例如,想查詢一下現(xiàn)在使用的 FFMPEG 都支持哪些 filter辜王,就可以用 ffmpeg -filters 來(lái)查詢劈狐。詳細(xì)參數(shù)說(shuō)明如下:
參數(shù) | 說(shuō)明 |
---|---|
-version | 顯示版本 |
-formats | 顯示可用的格式(包括設(shè)備)。 |
-demuxers | 顯示可用的demuxers呐馆。 |
-muxers | 顯示可用的muxers肥缔。 |
-devices | 顯示可用的設(shè)備。 |
-codecs | 顯示libavcodec已知的所有編解碼器汹来。 |
-decoders | 顯示可用的解碼器续膳。 |
-encoders | 顯示所有可用的編碼器。 |
-bsfs | 顯示可用的比特流filter收班。 |
-protocols | 顯示可用的協(xié)議坟岔。 |
-filters | 顯示可用的libavfilter過(guò)濾器。 |
-pix_fmts | 顯示可用的像素格式闺阱。 |
-sample_fmts | 顯示可用的采樣格式炮车。 |
-layouts | 顯示channel名稱和標(biāo)準(zhǔn)channel布局。 |
-colors | 顯示識(shí)別的顏色名稱酣溃。 |
ffmpeg -h encoder=libfdk_aac
查詢編譯器libfdk_aac的信息
3.2命令基本格式及參數(shù)
FFMPEG 處理音視頻時(shí)使用的命令格式與參數(shù)
ffmpeg [global_options] {[input_file_options] -i input_url} ...
{[output_file_options] output_url} ...
ffmpeg 通過(guò) -i 選項(xiàng)讀取輸任意數(shù)量的輸入“文件”(可以是常規(guī)文件瘦穆,管道,網(wǎng)絡(luò)流赊豌,抓取設(shè)備等扛或,并寫(xiě)入任意數(shù)量的輸出“文件”。
原則上碘饼,每個(gè)輸入/輸出“文件”都可以包含任意數(shù)量的不同類型的視頻流(視頻/音頻/字幕/附件/數(shù)據(jù))熙兔。 流的數(shù)量和/或類型是由容器格式來(lái)限制悲伶。 選擇從哪個(gè)輸入進(jìn)入到哪個(gè)輸出將自動(dòng)完成或使用 -map 選項(xiàng)。
要引用選項(xiàng)中的輸入文件住涉,您必須使用它們的索引(從0開(kāi)始)麸锉。 例如。 第一個(gè)輸入文件是0舆声,第二個(gè)輸入文件是1花沉,等等。類似地媳握,文件內(nèi)的流被它們的索引引用碱屁。 例如。 2:3是指第三個(gè)輸入文件中的第四個(gè)流
上面就是 FFMPEG 處理音視頻的常用命令蛾找,下面是一些常用參數(shù)
3.2.1 主要參數(shù)
參數(shù) | 說(shuō)明 |
---|---|
-f fmt(輸入/輸出) | 強(qiáng)制輸入或輸出文件格式娩脾。 格式通常是自動(dòng)檢測(cè)輸入文件,并從輸出文件的文件擴(kuò)展名中猜測(cè)出來(lái)打毛,所以在大多數(shù)情況下這個(gè)選項(xiàng)是不需要的柿赊。 |
-i url(輸入) | 輸入文件的網(wǎng)址 |
-y(全局參數(shù)) | 覆蓋輸出文件而不詢問(wèn)。 |
-n(全局參數(shù)) | 不要覆蓋輸出文件隘冲,如果指定的輸出文件已經(jīng)存在闹瞧,請(qǐng)立即退出。 |
-c [:stream_specifier] codec(輸入/輸出展辞,每個(gè)流) | 選擇一個(gè)編碼器(當(dāng)在輸出文件之前使用)或解碼器(當(dāng)在輸入文件之前使用時(shí))用于一個(gè)或多個(gè)流奥邮。codec 是解碼器/編碼器的名稱或 copy(僅輸出)以指示該流不被重新編碼饱搏。如:ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT |
-codec [:stream_specifier]編解碼器(輸入/輸出十兢,每個(gè)流) | 同 -c |
-t duration(輸入/輸出) | 當(dāng)用作輸入選項(xiàng)(在-i之前)時(shí),限制從輸入文件讀取的數(shù)據(jù)的持續(xù)時(shí)間淡诗。當(dāng)用作輸出選項(xiàng)時(shí)(在輸出url之前)覆旱,在持續(xù)時(shí)間到達(dá)持續(xù)時(shí)間之后停止輸出蘸朋。 |
-ss位置(輸入/輸出) | 當(dāng)用作輸入選項(xiàng)時(shí)(在-i之前),在這個(gè)輸入文件中尋找位置扣唱。 請(qǐng)注意藕坯,在大多數(shù)格式中,不可能精確搜索噪沙,因此ffmpeg將在位置之前尋找最近的搜索點(diǎn)炼彪。 當(dāng)轉(zhuǎn)碼和-accurate_seek被啟用時(shí)(默認(rèn)),搜索點(diǎn)和位置之間的這個(gè)額外的分段將被解碼和丟棄正歼。 當(dāng)進(jìn)行流式復(fù)制或使用-noaccurate_seek時(shí)辐马,它將被保留。當(dāng)用作輸出選項(xiàng)(在輸出url之前)時(shí)局义,解碼但丟棄輸入喜爷,直到時(shí)間戳到達(dá)位置冗疮。 |
-frames [:stream_specifier] framecount(output,per-stream) | 停止在幀計(jì)數(shù)幀之后寫(xiě)入流檩帐。 |
-filter [:stream_specifier] filtergraph(output术幔,per-stream) | 創(chuàng)建由filtergraph指定的過(guò)濾器圖,并使用它來(lái)過(guò)濾流轿塔。filtergraph是應(yīng)用于流的filtergraph的描述特愿,并且必須具有相同類型的流的單個(gè)輸入和單個(gè)輸出。在過(guò)濾器圖形中勾缭,輸入與標(biāo)簽中的標(biāo)簽相關(guān)聯(lián),標(biāo)簽中的輸出與標(biāo)簽相關(guān)聯(lián)目养。有關(guān)filtergraph語(yǔ)法的更多信息俩由,請(qǐng)參閱ffmpeg-filters手冊(cè)。 |
3.2.2 視頻參數(shù)
參數(shù) | 說(shuō)明 |
---|---|
-vframes num(輸出) | 設(shè)置要輸出的視頻幀的數(shù)量癌蚁。對(duì)于-frames:v幻梯,這是一個(gè)過(guò)時(shí)的別名,您應(yīng)該使用它努释。 |
-r [:stream_specifier] fps(輸入/輸出碘梢,每個(gè)流) | 設(shè)置幀率(Hz值,分?jǐn)?shù)或縮寫(xiě))伐蒂。作為輸入選項(xiàng)煞躬,忽略存儲(chǔ)在文件中的任何時(shí)間戳,根據(jù)速率生成新的時(shí)間戳逸邦。這與用于-framerate選項(xiàng)不同(它在FFmpeg的舊版本中使用的是相同的)恩沛。如果有疑問(wèn),請(qǐng)使用-framerate而不是輸入選項(xiàng)-r缕减。作為輸出選項(xiàng)雷客,復(fù)制或丟棄輸入幀以實(shí)現(xiàn)恒定輸出幀頻fps。 |
-s [:stream_specifier]大星沤啤(輸入/輸出搅裙,每個(gè)流) | 設(shè)置窗口大小。作為輸入選項(xiàng)裹芝,這是video_size專用選項(xiàng)的快捷方式部逮,由某些分幀器識(shí)別,其幀尺寸未被存儲(chǔ)在文件中局雄。作為輸出選項(xiàng)甥啄,這會(huì)將縮放視頻過(guò)濾器插入到相應(yīng)過(guò)濾器圖形的末尾。請(qǐng)直接使用比例過(guò)濾器將其插入到開(kāi)頭或其他地方炬搭。格式是'wxh'(默認(rèn) - 與源相同)蜈漓。 |
-aspect [:stream_specifier] 寬高比(輸出穆桂,每個(gè)流) | 設(shè)置方面指定的視頻顯示寬高比。aspect可以是浮點(diǎn)數(shù)字符串融虽,也可以是num:den形式的字符串享完,其中num和den是寬高比的分子和分母。例如“4:3”有额,“16:9”般又,“1.3333”和“1.7777”是有效的參數(shù)值。如果與-vcodec副本一起使用巍佑,則會(huì)影響存儲(chǔ)在容器級(jí)別的寬高比茴迁,但不會(huì)影響存儲(chǔ)在編碼幀中的寬高比(如果存在)。 |
-vn(輸出) | 禁用視頻錄制萤衰。 |
-vcodec編解碼器(輸出) | 設(shè)置視頻編解碼器堕义。這是-codec:v的別名。 |
-vf filtergraph(輸出) | 創(chuàng)建由filtergraph指定的過(guò)濾器圖脆栋,并使用它來(lái)過(guò)濾流倦卖。 |
3.2.3 音頻參數(shù)
參數(shù) | 說(shuō)明 |
---|---|
-aframes(輸出) | 設(shè)置要輸出的音頻幀的數(shù)量。這是-frames:a的一個(gè)過(guò)時(shí)的別名椿争。 |
-ar [:stream_specifier] freq(輸入/輸出怕膛,每個(gè)流) | 設(shè)置音頻采樣頻率。對(duì)于輸出流秦踪,它默認(rèn)設(shè)置為相應(yīng)輸入流的頻率褐捻。對(duì)于輸入流,此選項(xiàng)僅適用于音頻捕獲設(shè)備和原始分路器洋侨,并映射到相應(yīng)的分路器選件舍扰。 |
-ac [:stream_specifier]通道(輸入/輸出,每個(gè)流) | 設(shè)置音頻通道的數(shù)量希坚。對(duì)于輸出流边苹,它默認(rèn)設(shè)置為輸入音頻通道的數(shù)量。對(duì)于輸入流裁僧,此選項(xiàng)僅適用于音頻捕獲設(shè)備和原始分路器个束,并映射到相應(yīng)的分路器選件。 |
-an(輸出) | 禁用錄音聊疲。 |
-acodec編解碼器(輸入/輸出) | 設(shè)置音頻編解碼器茬底。這是-codec的別名:a。 |
-sample_fmt [:stream_specifier] sample_fmt(輸出获洲,每個(gè)流) | 設(shè)置音頻采樣格式阱表。使用-sample_fmts獲取支持的樣本格式列表。 |
-af filtergraph(輸出) | 創(chuàng)建由filtergraph指定的過(guò)濾器圖,并使用它來(lái)過(guò)濾流最爬。 |
3.3 錄制
首先通過(guò)下面的命令查看一下 mac 上都有哪些設(shè)備涉馁。
ffmpeg -f avfoundation -list_devices true -i ""
3.3.1 錄屏
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
- -f 指定使用 avfoundation 采集數(shù)據(jù)。
- -i 指定從哪兒采集數(shù)據(jù)爱致,它是一個(gè)文件索引號(hào)烤送。在我的MAC上,1代表桌面(可以通過(guò)上面的命令查詢?cè)O(shè)備索引號(hào))糠悯。
- -r 指定幀率帮坚。按ffmpeg官方文檔說(shuō)-r與-framerate作用相同,但實(shí)際測(cè)試時(shí)發(fā)現(xiàn)不同互艾。-framerate 用于限制輸入试和,而-r用于限制輸出。
注意忘朝,桌面的輸入對(duì)幀率沒(méi)有要求灰署,所以不用限制桌面的幀率。其實(shí)限制了也沒(méi)用局嘁。
3.3.2 錄屏+聲音
ffmpeg -f avfoundation -i 1:0 -r 29.97 -c:v libx264 -crf 0 -c:a libfdk_aac -b:a 32k out.flv
- -i 1:0 冒號(hào)前面的 "1" 代表的屏幕索引號(hào)。冒號(hào)后面的"0"代表的聲音索相號(hào)晦墙。
- -c:v 與參數(shù) -vcodec 一樣悦昵,表示視頻編碼器。c 是 codec 的縮寫(xiě)晌畅,v 是video的縮寫(xiě)但指。
- -crf 是 x264 的參數(shù)。 0 表式無(wú)損壓縮抗楔。
- -c:a 與參數(shù) -acodec 一樣棋凳,表示音頻編碼器。
- -b:a 指定音頻碼率连躏。 b 是 bitrate的縮寫(xiě), a是 audio的縮與剩岳。
3.3.3 錄視頻
ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4
- -framerate 限制視頻的采集幀率。這個(gè)必須要根據(jù)提示要求進(jìn)行設(shè)置入热,如果不設(shè)置就會(huì)報(bào)錯(cuò)拍棕。
- -f 指定使用 avfoundation 采集數(shù)據(jù)。
- -i 指定視頻設(shè)備的索引號(hào)勺良。
3.3.4 視頻+音頻
ffmpeg -framerate 30 -f avfoundation -i 0:0 out.mp4
3.3.5 錄音
ffmpeg -f avfoundation -i :0 out.wav
3.3.6 錄制音頻裸數(shù)據(jù)
ffmpeg -f avfoundation -i :0 -ar 44100 -f s16le out.pcm
3.4 分解與復(fù)用
流拷貝是通過(guò)將 copy 參數(shù)提供給-codec選項(xiàng)來(lái)選擇流的模式绰播。它使得ffmpeg省略了指定流的解碼和編碼步驟,所以它只能進(jìn)行多路分解和多路復(fù)用尚困。 這對(duì)于更改容器格式或修改容器級(jí)元數(shù)據(jù)很有用蠢箩。 在這種情況下,上圖將簡(jiǎn)化為:由于沒(méi)有解碼或編碼,速度非趁冢快滔韵,沒(méi)有質(zhì)量損失。 但是呵萨,由于許多因素奏属,在某些情況下可能無(wú)法正常工作。 應(yīng)用過(guò)濾器顯然也是不可能的潮峦,因?yàn)檫^(guò)濾器處理未壓縮的數(shù)據(jù)
3.4.1 抽取音頻流
ffmpeg -i input.mp4 -acodec copy -vn out.aac
- acodec: 指定音頻編碼器囱皿,copy 指明只拷貝,不做編解碼忱嘹。
- vn: v 代表視頻嘱腥,n 代表 no 也就是無(wú)視頻的意思。
3.4.2 抽取視頻流
ffmpeg -i input.mp4 -vcodec copy -an out.h264
- vcodec: 指定視頻編碼器拘悦,copy 指明只拷貝齿兔,不做編解碼。
- an: a 代表視頻础米,n 代表 no 也就是無(wú)音頻的意思分苇。
3.4.3 轉(zhuǎn)格式
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
上面的命令表式的是音頻、視頻都直接 copy屁桑,只是將 mp4 的封裝格式轉(zhuǎn)成了flv医寿。
3.4.4 音視頻合并
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
3.5 處理原始數(shù)據(jù)
3.5.1 提取YUV數(shù)據(jù)
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
ffplay -s wxh out.yuv
- -c:v rawvideo 指定將視頻轉(zhuǎn)成原始數(shù)據(jù)
- -pixel_format yuv420p 指定轉(zhuǎn)換格式為yuv420p
3.5.2 YUV轉(zhuǎn)H264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264
3.5.3 提取PCM數(shù)據(jù)
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
ffplay -ar 44100 -ac 2 -f s16le -i out.pcm
3.5.4 PCM轉(zhuǎn)WAV
ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.raw output.wav
ffplay -f s16le -ar 8000 -ac 2 -acodec pcm_s16be tt5.wav
3.6 濾鏡
在編碼之前,ffmpeg可以使用libavfilter庫(kù)中的過(guò)濾器處理原始音頻和視頻幀蘑斧。 幾個(gè)鏈?zhǔn)竭^(guò)濾器形成一個(gè)過(guò)濾器圖形靖秩。 ffmpeg區(qū)分兩種類型的過(guò)濾器圖形:簡(jiǎn)單和復(fù)雜。
3.6.1 簡(jiǎn)單濾鏡
簡(jiǎn)單的過(guò)濾器圖是那些只有一個(gè)輸入和輸出竖瘾,都是相同的類型沟突。 在上面的圖中,它們可以通過(guò)在解碼和編碼之間插入一個(gè)額外的步驟來(lái)表示:請(qǐng)注意惠拭,某些濾鏡會(huì)更改幀屬性,但不會(huì)改變幀內(nèi)容乐横。 例如求橄。 上例中的fps過(guò)濾器會(huì)改變幀數(shù),但不會(huì)觸及幀內(nèi)容葡公。 另一個(gè)例子是setpts過(guò)濾器罐农。
3.6.2 復(fù)雜濾鏡
復(fù)雜的過(guò)濾器圖是那些不能簡(jiǎn)單描述為應(yīng)用于一個(gè)流的線性處理鏈的過(guò)濾器圖。 例如催什,當(dāng)圖形有多個(gè)輸入和/或輸出涵亏,或者當(dāng)輸出流類型與輸入不同時(shí),就是這種情況。 他們可以用下圖來(lái)表示:復(fù)雜的過(guò)濾器圖使用-filter_complex選項(xiàng)進(jìn)行配置气筋。 請(qǐng)注意拆内,此選項(xiàng)是全局性的,因?yàn)閺?fù)雜的過(guò)濾器圖形本質(zhì)上不能與單個(gè)流或文件明確關(guān)聯(lián)宠默。
-lavfi選項(xiàng)等同于-filter_complex麸恍。
一個(gè)復(fù)雜的過(guò)濾器圖的一個(gè)簡(jiǎn)單的例子是覆蓋過(guò)濾器,它有兩個(gè)視頻輸入和一個(gè)視頻輸出搀矫,包含一個(gè)視頻疊加在另一個(gè)上面抹沪。 它的音頻對(duì)應(yīng)是amix濾波器
3.6.3 添加水印
ffmpeg -i out.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
- -vf中的 movie 指定logo位置。scale 指定 logo 大小瓤球。overlay 指定 logo 擺放的位置融欧。
添加文字水印
ffmpeg -i src.mp4 -vf "drawtext=fontfile=simhei.ttf: text='1':x=300:y=500:fontsize=100:fontcolor=yellow:shadowy=2" drawtext.mp4
添加本地時(shí)間水印
ffmpeg -i src.mp4 -vf "drawtext=fontsize=160:text='%{localtime\:%T}'" -c:v libx264 -an -f mp4 output.mp4 -y
http://www.reibang.com/p/e4ad7e1e7ed5
3.6.4 刪除水印
先通過(guò) ffplay 找到要?jiǎng)h除 LOGO 的位置
ffplay -i test.flv -vf delogo=x=806:y=20:w=70:h=80:show=1
使用 delogo 濾鏡刪除 LOGO
ffmpeg -i test.flv -vf delogo=x=806:y=20:w=70:h=80 output.flv
3.6.5 視頻縮小一倍
ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4
- -vf scale 指定使用簡(jiǎn)單過(guò)濾器 scale,iw/2:-1 中的 iw 指定按整型取視頻的寬度卦羡。 -1 表示高度隨寬度一起變化噪馏。
3.6.6 視頻裁剪
ffmpeg -i VR.mov -vf crop=in_w-200:in_h-200 vr_new.mp4
crop 格式:crop=out_w:out_h:x:y
- out_w: 輸出的寬度÷潭可以使用 in_w 表式輸入視頻的寬度欠肾。
- out_h: 輸出的高度∧馍蓿可以使用 in_h 表式輸入視頻的高度董济。
- x : X坐標(biāo)
- y : Y坐標(biāo)
如果 x和y 設(shè)置為 0,說(shuō)明從左上角開(kāi)始裁剪。如果不寫(xiě)是從中心點(diǎn)裁剪要门。
3.6.7 倍速播放
ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4
- -filter_complex 復(fù)雜濾鏡,[0:v]表示第一個(gè)(文件索引號(hào)是0)文件的視頻作為輸入廓啊。setpts=0.5*PTS表示每幀視頻的pts時(shí)間戳都乘0.5 欢搜,也就是差少一半。[v]表示輸出的別名谴轮。音頻同理就不詳述了炒瘟。
- map 可用于處理復(fù)雜輸出,如可以將指定的多路流輸出到一個(gè)輸出文件第步,也可以指定輸出到多個(gè)文件疮装。"[v]" 復(fù)雜濾鏡輸出的別名作為輸出文件的一路流。上面 map的用法是將復(fù)雜濾鏡輸出的視頻和音頻輸出到指定文件中粘都。
https://blog.csdn.net/matrix_laboratory/article/details/53158307
3.6.8 對(duì)稱視頻
ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4
- hflip 水平翻轉(zhuǎn)
如果要修改為垂直翻轉(zhuǎn)可以用vflip廓推。
3.6.9 畫(huà)中畫(huà)
ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4
3.6.10 錄制畫(huà)中畫(huà)
ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0"
-r 30 -c:v libx264 -preset ultrafast
-c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2
-filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]"
-map "[out]" -movflags faststart -map 1:a b.mp4
3.6.11 多路視頻拼接
ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map "[out]" -movflags faststart -map 1:a c.mp4
3.7 音視頻的拼接與裁剪
3.7.1 裁剪
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
- -ss 指定裁剪的開(kāi)始時(shí)間,精確到秒
- -t 被裁剪后的時(shí)長(zhǎng)翩隧。
3.7.2 合并
首先創(chuàng)建一個(gè) inputs.txt 文件樊展,文件內(nèi)容如下:
file '1.flv'
file '2.flv'
file '3.flv'
然后執(zhí)行下面的命令:
ffmpeg -f concat -i inputs.txt -c copy output.flv
3.7.3 hls切片
ffmpeg -i out.mp4 -c:v libx264 -c:a libfdk_aac -strict -2 -f hls out.m3u8
- -strict -2 指明音頻使有AAC。
- -f hls 轉(zhuǎn)成 m3u8 格式。
3.8 視頻圖片互轉(zhuǎn)
3.8.1 視頻轉(zhuǎn)JPEG
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
3.8.2 視頻轉(zhuǎn)gif
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif
3.8.3 圖片轉(zhuǎn)視頻
ffmpeg -f image2 -i image-%3d.jpeg images.mp4
3.9 直播相關(guān)
3.9.1 推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
3.9.2 拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
3.9.3 轉(zhuǎn)流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
3.9.4 實(shí)時(shí)推流
ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room
3.10 ffplay
3.10.1 播放YUV 數(shù)據(jù)
ffplay -s 192x144 -pix_fmt nv12 1.yuv
播放yuv數(shù)據(jù)专缠,需要指定分辨率
- -s 指定視頻分辨率
- -pix_fmt 指定像素格式 yuv420p
3.10.2 播放YUV中的 Y平面
ffplay -s 640x480 -pix_fmt nv21 -vf extractplanes='y' 1.yuv
3.10.3 播放pcm
ffplay -ar 44100 -ac 2 -f s16le out.pcm
3.10.4 播放h264
ffplay test.h264
3.10.5 播放G711音頻
ffplay -i test.g711a -f alaw -ac 1 -ar 8000
ffplay -i test.g711u -f mulaw -ac 1 -ar 8000