欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

FFmpeg音視頻轉(zhuǎn)換工具的介紹與安裝使用方法

  發(fā)布時間:2021-01-15 12:09:08   作者:佚名   我要評論
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序,它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec

FFmpeg(Fast Forward Moving Picture Experts Group)是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec。 FFmpeg是在 Linux 下開發(fā)出來的,但它可以在包括 Windows 在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。這個項目是由 Fabrice Bellard 發(fā)起的,現(xiàn)在由 Michael Niedermayer 主持??梢暂p易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如可以將攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。

FFmpeg 命令行工具的介紹

在 FFmpeg 官網(wǎng) 可以下載對應(yīng)平臺的可執(zhí)行程序包,比如 Windows 平臺的下載地址是:https://www.gyan.dev/ffmpeg/builds/,下載解壓后就能在 bin 文件夾下能看到三個可執(zhí)行程序:ffmpeg、ffplay、ffprobe,配置好環(huán)境變量后即可使用。

ffprobe

ffprobe 是用于查看媒體文件頭信息的工具,常用命令有:

ffprobe INPUT
ffprobe -show_format INPUT
ffprobe -show_streams INPUT
ffprobe -show_frames INPUT
ffprobe -show_packets INPUT
...

show_format 用于查看文件格式、時長、碼率等信息,較為簡略;

show_streams 用于查看視頻流、音頻流的信息,包括編碼器、幀率、采樣率、寬高、像素格式、采樣格式、碼率、時長、總幀率等等,較為詳細(xì),是最常用的一個功能;

show_frames、show_packets 用于查看每一幀(解碼前/解碼后)的信息,可以配合 select_streams 使用;

關(guān)于 ffprobe 的更多命令可以查看官網(wǎng)文檔:ffprobe Documentation

ffplay

ffplay 是用于播放媒體文件的工具,常用命令有:

ffplay INPUT -loop 10 // 循環(huán)播放 10 次
ffplay INPUT -ast 1 // 播放視頻中的第一路音頻流
ffplay INPUT -vst 1 // 播放視頻中的第一路視頻流
ffplay INPUT -x WIDTH -y HEIGHT // 指定寬高播放
...

播放原始音頻/視頻數(shù)據(jù):

ffplay INPUT.pcm -f s16le -channels 2 -ar 44100
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 INPUT.yuv(或 rgb)

指定播放過程中音視頻同步的方式:

// 以音頻(或視頻、或外部時鐘)作為基準(zhǔn)進(jìn)行音視頻同步
ffplay INPUT -sync audio(或 video、ext)

關(guān)于 ffplay 的更多命令可以查看官網(wǎng)文檔:ffplay Documentation

ffmpeg

ffmpeg 是強大的媒體文件轉(zhuǎn)換工具,常用于轉(zhuǎn)碼,可選命令非常多,編碼器、視頻時長、幀率、分辨率、像素格式、采樣格式、碼率、裁剪選項、聲道數(shù)等等都可以自由選擇:

ffmpeg -i INPUT -codec:v h264 -codec:a aac -s 644x360 OUTPUT

更詳細(xì)的內(nèi)容可以查看官網(wǎng)文檔:ffmpeg Documentation

通用選項

還有一些命令可以用于查看 ffmpeg 支持的編解碼器、像素格式、采樣格式等信息,即上面 3 個文檔都有的 Generic options 部分,上述三個命令都可以查看這些信息,比如:

ffmpeg -encoders
ffprobe -sample_fmts
ffplay -pix_fmts

FFmpeg 源碼結(jié)構(gòu)

主要組成

這部分直接引用自雷神的博客:FFMPEG中最關(guān)鍵的結(jié)構(gòu)體之間的關(guān)系

FFMPEG中結(jié)構(gòu)體很多。最關(guān)鍵的結(jié)構(gòu)體可以分成以下幾類:

a) 解協(xié)議(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協(xié)議的類型以及狀態(tài)。URLProtocol存儲輸入視音頻使用的封裝格式。每種協(xié)議都對應(yīng)一個URLProtocol結(jié)構(gòu)。(注意:FFMPEG中文件也被當(dāng)做一種協(xié)議“file”)

b) 解封裝(flv,avi,rmvb,mp4)

AVFormatContext主要存儲視音頻封裝格式中包含的信息;AVInputFormat存儲輸入視音頻使用的封裝格式。每種視音頻封裝格式都對應(yīng)一個AVInputFormat 結(jié)構(gòu)。

c) 解碼(h264,mpeg2,aac,mp3)

每個AVStream存儲一個視頻/音頻流的相關(guān)數(shù)據(jù);每個AVStream對應(yīng)一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關(guān)數(shù)據(jù);每個AVCodecContext中對應(yīng)一個AVCodec,包含該視頻/音頻對應(yīng)的解碼器。每種解碼器都對應(yīng)一個AVCodec結(jié)構(gòu)。

d) 存數(shù)據(jù)

視頻的話,一般每個 AVPacket 是一幀;音頻可能有好幾幀

解碼前數(shù)據(jù):AVPacket(h264, aac)
解碼后數(shù)據(jù):AVFrame(yuv, pcm)

模塊簡介

AVUtil:核心工具庫,最基礎(chǔ)的模塊之一,其它模塊經(jīng)常依賴該庫做一些基本的音視頻處理操作,比如 av_image_fill_arrays(填充原始圖像數(shù)據(jù)到 AVFrame)、av_image_get_buffer_size(根據(jù)圖像寬高、格式獲取填充該圖像需要的字節(jié)數(shù))、av_get_pix_fmt_name(獲取像素格式的名稱) 等等。

AVFormat:文件格式和協(xié)議庫,最重要的模塊之一,封裝了 Protocol 層和 Demuxer、Muxer 層。常用于讀寫文件及文件信息,比如 avformat_write_header(寫文件頭)、av_write_trailer(寫文件尾)、av_read_frame (從文件中讀取一幀編碼后的圖像/音頻數(shù)據(jù))、av_write_frame(往文件中寫一幀編碼后的圖像/音頻數(shù)據(jù))、av_seek_frame(給定一個時間戳,移動讀指針到對應(yīng)位置)等等。

AVCodec:編解碼庫,最重要的模塊之一。FFmpeg 默認(rèn)不會添加 libx264、FDK-AAC 等庫,但 FFmpeg 可以像一個平臺一樣,將其它第三方的 Codec 以插件的形式添加進(jìn)來,并為開發(fā)者提供統(tǒng)一的接口。編解碼需要用到的函數(shù)基本都在該庫中,比如 avcodec_find_decoder(找到對應(yīng)的第三方解碼器)、avcodec_decode_video2(使用對應(yīng)的解碼器解碼一幀圖像/音頻數(shù)據(jù))。

AVFilter:濾鏡庫。該模塊提供了包括音頻特效和視頻特效的處理,比如把 “drawbox=10:20:200:60:red@0.5” 這條命令,傳遞給函數(shù) avfilter_graph_parse() 解析,并傳遞原始圖像數(shù)據(jù)到該 filter 中,就能在圖像坐標(biāo)為 (10, 20) 的點上生成一個寬高為 (200, 60) 、透明度為 0.5 的紅色矩形。

以上是 FFmpeg 最常用的四個庫,此外還有 AVDevice(輸入輸出設(shè)備庫)、SwrResample(音頻重采樣,可轉(zhuǎn)換音頻的聲道數(shù)、數(shù)據(jù)格式、采樣率等格式)、SWScale(可用于處理像素格式轉(zhuǎn)換的庫)等就不一一介紹了,實際上,到對應(yīng)的 FFmpeg 源代碼對應(yīng)的頭文件看看都提供了什么函數(shù),就大致能了解該庫的作用了。

在 FFmpeg 中,還有一個類型的 filter 為 bit stream filter,顧名思義,該 filter 處理的是流數(shù)據(jù),主要用于某些格式的封裝轉(zhuǎn)換行為。比如 AAC 編碼,常見的有兩種封裝格式,一種是 ADTS 的流,一種是封裝在 MPEG4 里面的格式,這種格式會在每一幀前面拼接一個由聲道、采樣率等信息組成的頭,該 filter 中的一個類型,名為 aac_adtstoasc,可以很方便地把 ADTS 轉(zhuǎn)換為另一種格式,常用于編碼過程中。與之相對應(yīng)的,H264 也有兩種封裝格式,一種是 MP4 封裝的格式,一種是裸的 H264 格式(一般稱為 annexb 封裝格式),用于轉(zhuǎn)換的 filter 名為 h264_mp4toannexb。若要使用這兩個 filter,需要在編譯 ffmpeg 的時候開啟:

--enable-bsf=aac_adtstoasc
--enable-bsf=h264_mp4toannexb

常用 API 分析

通用 API

  1. av_register_all

編譯配置(–enable、–disable) FFmpeg 的時候,會生成兩個文件:config.mk、config.h。config.mk 會實際上就是 makefile 文件需要包含進(jìn)去的子模塊,會作用在編譯階段,幫助開發(fā)者編譯出正確的庫;而 config.h 是作用在運行階段,這一階段將確保需要注冊哪些容器以及編解碼格式到 FFmpeg 框架中。所以該函數(shù)的內(nèi)部實現(xiàn)會先調(diào)用 avcodec_register_all 來注冊所有 config.h 里面開放的編解碼器,然后會注冊所有的 Muxer 和 Demuxer,最后注冊所有的 Protocol。如此,在 config 的過程中,enable、disable 的選項就作用到了運行時,該函數(shù)的源碼分析涉及的源文件包括 url.c、alformats.c、mux.c、format.c 等文件。

  1. av_find_codec

在 avcodec_register_all 函數(shù)里面已經(jīng)把編碼器和解碼器都存放到了一個鏈表中,因此都是從該鏈表進(jìn)行遍歷查找

  1. avcodec_open2 分析

打開編解碼其的時候就會用到該函數(shù),參數(shù)有三個,第一個是 AVCodecContext,如果想要傳入私有參數(shù),比如 preset、tune、profile,則可以為設(shè)置到 priv_data 參數(shù)中。具體到函數(shù)實現(xiàn)時,它會找到對應(yīng)的實現(xiàn)文件,比如,如果打開的是 libx264 編碼器,那么實際上的 Codec 為 libx264.c 中的 ff_libx264_encoder,Codec 的生命周期方法就會委托給該結(jié)構(gòu)體對應(yīng)的函數(shù)指針?biāo)赶虻暮瘮?shù)。open 對應(yīng)的就是 init 函數(shù)指針?biāo)赶虻暮瘮?shù),該函數(shù)會調(diào)用具體的編碼庫的 API,并以對應(yīng)的 AVCodecContext 中的 priv_data 來填充對應(yīng)第三方庫所需要的私有參數(shù)。

  1. av_codec_close 分析

和 open 類似,找到對應(yīng)的實現(xiàn)文件中的 close 函數(shù)指針?biāo)赶虻暮瘮?shù),然后該函數(shù)會調(diào)用對應(yīng)第三方庫的 API 來關(guān)閉掉對應(yīng)編碼庫。

其實 FFmpeg 所做的事情就是透明化所有的編碼庫,用自己的封裝來為開發(fā)者提供統(tǒng)一的接口,開發(fā)者只需要在打開編解碼庫時指定編解碼器的 ID 即可,之后編碼、解碼、關(guān)閉資源都會找到對應(yīng)的實現(xiàn)文件去做具體的事情。

解碼時用到的 API

  1. avformat_open_input

該函數(shù)會根據(jù)提供的的文件路徑判斷文件的格式,繼而決定使用哪一個 Demuxer。比如,如果是 flv 文件,那么 Demuxer 就會使用對應(yīng)的 ff_flv_demuxer,之后關(guān)鍵的生命周期方法 read_header、read_packet、read_seek、read_close 都會使用 ff_flv_demuxer 中函數(shù)指針指定的函數(shù)。read_header 函數(shù)會將 AVStream 結(jié)構(gòu)體構(gòu)造好。

  1. avformat_find_stream_info

這個函數(shù)非常重要,該方法的作用是將所有 Stream 的 MetaData 信息填充好,方法內(nèi)部會先查找對應(yīng)的解碼器,并打開,緊接著利用 Demuxer 中的 read_packet 函數(shù)讀取一段數(shù)據(jù)進(jìn)行解碼,解碼數(shù)據(jù)越多,分析出的流數(shù)據(jù)就會越準(zhǔn)確,本地資源會比較快,網(wǎng)絡(luò)資源則較慢。該函數(shù)提供了幾個參數(shù)可以控制讀取數(shù)據(jù)的長度,分別為:probe_size、max_analyze、fps_probe_size,這幾個參數(shù)的值越小,讀取速度越快,信息則相對不夠準(zhǔn)確。

  1. av_read_frame

該方法讀取出來的數(shù)據(jù)是 AVPacket,該函數(shù)的實現(xiàn)首先會委托到 Demuxer 的 read_packet 方法,然后在該函數(shù)中把未處理完的壓縮數(shù)據(jù)進(jìn)行緩存處理。

  1. avcodec_decode

如果要解碼 H264,會找到 ff_h264_decoder,其中最重要的三個聲明周期方法為 init、decode、close。

編碼時用到的 API

  1. avformat_alloc_output_context

和 avformat_open_input 類似,該函數(shù)最終會找到對應(yīng)的格式復(fù)制給 AVFormatContext 中的 oformat。

  1. avio_open2

該方法首先調(diào)用函數(shù) ffurl_open,構(gòu)造除 URLContext,這個結(jié)構(gòu)體包含了 URLProtocol,接著調(diào)用 avio_alloc_context 方法,分配除 AVIOContext 結(jié)構(gòu)體,并將上一步構(gòu)造出來的 URLProtocol 傳遞進(jìn)來,然后復(fù)制給 AVFormatContext 的屬性。

編碼步驟其實是解碼的一個逆過程,解碼過程中的 av_find_stream_info 對應(yīng)到編碼就是 avformat_new_stream 和 av_format_write_header,該步驟會將音頻流或視頻流的信息填充好,分配出 AVStream 結(jié)構(gòu)體。read_header 則對應(yīng)于 av_write_header,再之后是 av_write_frame、av_write_tailer,注意,av_write_header 和 av_write_tailer 必須成對出現(xiàn)。avcodec_encode 等函數(shù)就不一一介紹了。

一些概念

PTS 和 DTS

DTS(Decoding Time Stamp):解碼時間戳,這個時間戳的意義在于告訴播放器該在什么時候解碼這一幀圖像

PTS(Presentation Time Stamp):顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀圖像

DTS、PTS 是在編碼的時候由編碼器生成的,當(dāng)視頻流中沒有 B 幀時,通常 DTS 和 PTS 的順序一致。但如果有 B 幀時,解碼順序和播放順序就有區(qū)別了。

比如一個視頻中,幀的顯示順序是:I B B P,現(xiàn)在我們需要在解碼 B 幀時知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時候就體現(xiàn)出 DTS 和 PTS 的作用了。DTS 告訴我們該按什么順序解碼這幾幀圖像,PTS 告訴我們該按什么順序顯示這幾幀圖像。順序大概如下:

PTS: 1 4 2 3
DTS: 1 2 3 4
Stream: I P B B

  1. time_base

時間單位,比如幀率為 30幀/s 的視頻,time_base 就等于 1/30,此時 pts * time_base 就等于當(dāng)前幀顯示的時間

  1. 音視頻的同步

音頻也有 DTS、PTS 的概念,但是音頻沒有 B 幀,不需要雙向預(yù)測,所以音頻幀的 DTS、PTS 順序是一致的。

音視頻同步的方式一般有三種:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時鐘。 因為音頻幀的 DTS、PTS 順序一致,因此一般情況下,都采用同步視頻到音頻的方式。

  1. gop

group of picture,可以認(rèn)為是兩個 I 幀之間的間隔,通常設(shè)置為幀率的兩倍即可

  1. 參考幀

最多可以設(shè)置為 16 個, 通常,該值越大,壓縮率越高,但大于6后對壓縮率的貢獻(xiàn)很低,推薦默認(rèn)值 6。

  1. align

很多圖像相關(guān)的函數(shù)中都有這個參數(shù),是 YUV 通道對齊時的字節(jié)單位,如果不確定,可以設(shè)為 1,但效率可能不太高。

參考:what is ‘linesize alignment’ meaning?

碼率控制

主要參考:H.264 Video Encoding Guide

在 x264 中,碼率控制方式主要有(通常只推薦 CRF、Two-Pass ABR 兩種):

CQP(Constant Quantization Parameter )。值越大,壓縮率越大,質(zhì)量越低。使用方法(雖然這里使用的是命令行的形式,但在編寫代碼時也有參考價值):

ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>

僅適用于視頻編碼研究,除非確切知道自己在做什么,否則不要使用這種模式。

ABR(Average Bitrate)。使用方法:

fmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M <output>

避免使用這種模式!x264 開發(fā)者甚至說永遠(yuǎn)不要用它,因為質(zhì)量不可控。

CBR(Constant BitRate)。
使用:

ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M <output>
// VP9
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M <output>

輸出文件需要是 .ts 文件,因為 MP4 不支持 NAL 填充,如果輸入文件易于編碼,使用這種方式會浪費帶寬,適用于視頻直播。

CRF(Constant Rate Factor)。

使用方法:

ffmpeg -i <input> -c:v libx264 -crf 23 <output>
ffmpeg -i <input> -c:v libx265 -crf 28 <output>
ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 0 <output>

x264 默認(rèn)值是 23(推薦 17 ~ 28),x265 是28(推薦 24 ~ 34),可用值是 0 到 51。值越小編碼質(zhì)量越好,碼率越高(每 -6,比特率加倍),值等于 0 時則為無損編碼。注意:如果不是基于 ffmpeg 的播放器,可能無法解碼無損壓縮的視頻。

很方便,但比特率、文件大小不好控制 ,適用于文件存儲或需要實現(xiàn)最好的質(zhì)量的場景;不適用于流媒體。

在代碼中使用時,通過 av_dict_set 設(shè)置到 AVDictionary 中,并作為參數(shù)傳遞給 avcodec_open2 即可

Two-Pass ABR
用于限制輸出文件的大小,比如預(yù)期視頻文件有 10min(600s),200 MB:

200 * 8192 / 600 = ~2730 Kb
2730 - 128(音頻常用的比特率) = 2602 kb

那么:

ffmpeg -y -i input -c:v libx264 -b:v 2600k -pass 1 -c:a aac -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

如果是 Windows 環(huán)境, /dev/null 換為 NUL,\ 換為 ^

但我一直不知道在代碼中應(yīng)該怎么使用這種模式,如果有了解的請指教。

VBV(Video Buffer Verifier)
可以確保最大碼率限制在一個范圍里,對于流式傳輸非常有用,可以配合到 (2-Pass)ABR 或 CRF 模式一起使用,使用方法:

// crf & vbv
ffmpeg -i <input> -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M <output>
ffmpeg -i <input> -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000 <output>

ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 2M <output>

// 2-pass abr & vbv
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f mp4 /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f mp4 /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000 <output>


ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f webm /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

編寫代碼的話,指定 AVCodecContext 的 rc_max_rate 和 rc_buffer_size 即可。bufsize 根據(jù)你希望比特率獲得多大的可變性而設(shè)置,默認(rèn)為 maxrate 的兩倍,如果想限制流的比特率,可以設(shè)置為 maxrate 的一半。

配合 CRF 模式使用的時候,如果設(shè)置的 crf 值過低,視頻碼率可能超出 -maxrate 的時候,編碼器會自動調(diào)整 crf,避免出現(xiàn)較大的碼率波動。然而,x264 不會嚴(yán)格控制你指定的最大碼率,除非使用 2 pass 模式。

preset、tune
如果參數(shù)的設(shè)置有些復(fù)雜,可以使用 preset、tune 參數(shù)(編寫代碼時可以通過 av_dict_set 設(shè)置),preset 是一個用于控制編碼速度壓縮比的選項集合,編碼速度越慢,壓縮率越高??蛇x值有:

ultrafast
superfast
veryfast
faster
fast
medium – default preset
slow
slower
veryslow

編碼速度對比:

tune 可根據(jù)輸入情況(不同的視頻類型等)調(diào)整設(shè)置(比如對畫面作出一些優(yōu)化),可選值有:

film – use for high quality movie content; lowers deblocking
animation – good for cartoons; uses higher deblocking and more reference frames
grain – preserves the grain structure in old, grainy film material(紋理調(diào)整)
stillimage – good for slideshow-like content(適用于 ppt 等內(nèi)容)
fastdecode – allows faster decoding by disabling certain filters
zerolatency – good for fast encoding and low-latency streaming(適用于快速編碼及低延遲流)

 ffmpeg的安裝與使用

ffmpeg的簡介

FFmpeg是一個自由軟件,可以運行音頻和視頻多種格式的錄影、轉(zhuǎn)換、流功能,包含了libavcodec——這是一個用于多個項目中音頻和視頻的解碼器庫,以及l(fā)ibavformat——一個音頻與視頻格式轉(zhuǎn)換庫。
主要參數(shù)
-i——設(shè)置輸入檔名。
-f——設(shè)置輸出格式。
-y——若輸出文件已存在時則覆蓋文件。
-fs——超過指定的文件大小時則結(jié)束轉(zhuǎn)換。
-t——指定輸出文件的持續(xù)時間,以秒為單位。
-ss——從指定時間開始轉(zhuǎn)換,以秒為單位。
-t從-ss時間開始轉(zhuǎn)換(如-ss 00:00:01.00 -t 00:00:10.00即從00:00:01.00開始到00:00:11.00)。
-title——設(shè)置標(biāo)題。
-timestamp——設(shè)置時間戳。
-vsync——增減Frame使影音同步。
-c——指定輸出文件的編碼。
-metadata——更改輸出文件的元數(shù)據(jù)。
-help——查看幫助信息。

ffmpeg的官網(wǎng)地址是:https://www.ffmpeg.org/
ffmpeg的Github項目地址是:https://github.com/FFmpeg/FFmpeg

更多詳細(xì)內(nèi)容請參考維基百科。

安裝

FFmpeg可以在Windows、Linux還有Mac OS等多種操作系統(tǒng)中進(jìn)行安裝和使用。

這篇文章主要介紹其在Windows下面的安裝:

下載編譯好的Windows版本:https://www.gyan.dev/ffmpeg/builds/(與官網(wǎng)同步)

FFmpeg三種版本

static 版本
靜態(tài)庫版本 里面有3個exe: ffmpeg.exe, ffplay.exe, ffprobe.exe,每個exe體積很大,因為相關(guān)的dll已經(jīng)被編譯到exe 里面去了。作為工具而言此版本就可以滿足我們的需求。

shared 版本
動態(tài)庫版本,里面有3個exe:ffmpeg.exe,ffplay.exe , ffprobe.exe ,還有一些dll, 比如說avcodec-54.dll之類的。shared 里面的exe體積很小,因為他們在運行的時候,到相應(yīng)的dll中調(diào)用功能。程序運行過程必須依賴于提供的dll文件。

dev 版本
開發(fā)者版本,是用于開發(fā)的,里面包含了庫文件 xxx.lib 以及頭文件 xxx.h,這個版本不包含exe文件。dev版本中include文件夾內(nèi)文件用途:在這里插入圖片描述

libavcodec: 用于各種類型聲音、圖像編解碼
libavdevice: 用于音視頻數(shù)據(jù)采集和渲染等功能的設(shè)備相關(guān);
libavfileter:包含多媒體處理常用的濾鏡功能;
libavformat:包含多種多媒體容器格式的封裝、解封裝工具;
libavutil:包含一些公共的工具函數(shù)
libpostproc: 用于后期效果處理
libswresample: 用于音頻充采用和格式轉(zhuǎn)換等功能;
libswscale: 用于食品場景比例縮放、色彩映射轉(zhuǎn)換;

常用命令集

獲取視頻的信息

ffmpeg -i video.avi

將圖片序列合成視頻

ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令會把當(dāng)前目錄下的圖片(名字如:Image1.jpg、image2.jpg等)合并成video.mpg
將視頻分解成圖片序列

ffmpeg -i video.mpg image%d.jpg

上面的命令會生成image1.jpg、image2.jpg …
支持的圖片格式有 : pgm/ppm/pam/pgmyuv/jpeg/gif/png/tiff/sci等

環(huán)境變量的配置

1、將下載的ffmpeg解壓到指定目錄下,博主解壓在:G:\【1】軟件(已經(jīng)過測試)目錄下;
2、右擊此電腦——>屬性——>高級系統(tǒng)設(shè)置——>環(huán)境變量。在系統(tǒng)變量的path變量里添加解壓的路徑。
例如:G:\【1】軟件(已經(jīng)過測試)\ffmpeg-4.0-win64-static\ffmpeg-4.0-win64-static\bin
3、配置完成后運行cmd,輸入ffmpeg,若顯示如下界面,則說明配置成功。

 使用

命令行工具的使用

ffmpeg.exe

用于轉(zhuǎn)碼的應(yīng)用程序:

一個簡單的轉(zhuǎn)碼命令 將input.avi轉(zhuǎn)碼成output.ts,并設(shè)置視頻的碼率為640kbps

ffmpeg -i input.avi -b:v 640k output.ts  

ffmpeg參數(shù)中文詳細(xì)解釋

a) 通用選項

-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協(xié)議的...
-f fmt 強迫采用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設(shè)置紀(jì)錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設(shè)置標(biāo)題
-author string 設(shè)置作者
-copyright string 設(shè)置版權(quán)
-comment string 設(shè)置評論
-target type 設(shè)置目標(biāo)文件類型(vcd,svcd,dvd) 所有的格式選項(比特率,編解碼以及緩沖區(qū)大?。┳詣釉O(shè)置,只需要輸入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質(zhì)量設(shè)置
-itsoffset offset 設(shè)置以秒為基準(zhǔn)的時間偏移,該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味著相應(yīng)的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

b) 視頻選項

-b bitrate 設(shè)置比特率,缺省200kb/s
-r fps 設(shè)置幀頻 缺省25
-s size 設(shè)置幀大小 格式為WXH 缺省160X128.下面的簡寫也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設(shè)置頂部切除帶大小 像素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設(shè)置頂部補齊的大小 像素單位
-padbottom size –padleft size –padright size –padcolor color 設(shè)置補齊條顏色(hex,6個16進(jìn)制的數(shù),紅:綠:蘭排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設(shè)置視頻碼率容忍度kbit/s
-maxrate bitrate設(shè)置最大視頻碼率容忍度
-minrate bitreate 設(shè)置最小視頻碼率容忍度
-bufsize size 設(shè)置碼率控制緩沖區(qū)大小
-vcodec codec 強制使用codec編解碼方式。如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝。
-sameq 使用同樣視頻質(zhì)量作為源(VBR)
-pass n 選擇處理遍數(shù)(1或者2)。兩遍編碼非常有用。第一遍生成統(tǒng)計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀(jì)錄文件名為file

c)高級視頻選項

-g gop_size 設(shè)置圖像組大小
-intra 僅適用幀內(nèi)編碼
-qscale q 使用固定的視頻量化標(biāo)度(VBR)
-qmin q 最小視頻量化標(biāo)度(VBR)
-qmax q 最大視頻量化標(biāo)度(VBR)
-qdiff q 量化標(biāo)度間最大偏差 (VBR)
-qblur blur 視頻量化標(biāo)度柔化(VBR)
-qcomp compression 視頻量化標(biāo)度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始復(fù)雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp偏差
-i_qoffset offset 在p和i幀間的qp偏差
-rc_eq equation 設(shè)置碼率控制方程 默認(rèn)tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設(shè)置運動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 設(shè)置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設(shè)置idct算法??捎玫挠?0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設(shè)置錯誤殘留為n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設(shè)置錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用于mpeg4
-part 使用數(shù)據(jù)劃分 僅用于mpeg4
-bug param 繞過沒有被自動監(jiān)測到編碼器的問題
-strict strictness 跟標(biāo)準(zhǔn)的嚴(yán)格性
-aic 使能高級幀內(nèi)編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不采用交織方法
-interlace 強迫交織法編碼僅對mpeg2和mpeg4有效。當(dāng)你的輸入是交織的并且你想要保持交織以最小圖像損失的時候采用該選項。可選的方法是不交織,但是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視頻編碼統(tǒng)計到vstats_hhmmss.log
-vhook module 插入視頻處理模塊 module 包括了模塊名和參數(shù),用空格分開

D)音頻選項

-ab bitrate 設(shè)置音頻碼率
-ar freq 設(shè)置音頻采樣率
-ac channels 設(shè)置通道 缺省為1
-an 不使能音頻紀(jì)錄
-acodec codec 使用codec編解碼

E)音頻/視頻捕獲選項

-vd device 設(shè)置視頻捕獲設(shè)備。比如/dev/video0
-vc channel 設(shè)置視頻捕獲通道 DV1394專用
-tvstd standard 設(shè)置電視標(biāo)準(zhǔn) NTSC PAL(SECAM)
-dv1394 設(shè)置DV1394捕獲
-av device 設(shè)置音頻設(shè)備 比如/dev/dsp

F)高級選項

-map file:stream 設(shè)置輸入流映射
-debug 打印特定調(diào)試信息
-benchmark 為基準(zhǔn)測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確算法 用于編解碼測試
-ps size 設(shè)置包大小,以bits為單位
-re 以本地幀頻讀數(shù)據(jù),主要用于模擬捕獲設(shè)備
-loop 循環(huán)輸入流(只工作于圖像流,用于ffserver測試)

到此這篇關(guān)于FFmpeg音視頻轉(zhuǎn)換工具的介紹與安裝使用方法的文章就介紹到這了,更多相關(guān)FFmpeg內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論