壓縮視頻之前,我們要了解原視頻的詳細(xì)信息,利用MediaInfo可以查看視頻的詳細(xì)信息; 也可運(yùn)行 ffmpeg -i video.mp4 -hide_banner
視頻尺寸:指的就是視頻的分辨率,常見的分辨率有4096*2304,1920*1080,720*576等。
視頻編碼:視頻編碼方式就是指通過特定的壓縮技術(shù),將某個視頻格式的文件轉(zhuǎn)換成另一種視頻格式文件的方式。視頻編碼格式常見到的有:MPEG-2 TS、Divx、Xvid、H.264、WMV-HD和VC-1。
音頻編碼:音頻編碼方式指通過特定的壓縮技術(shù)對音頻數(shù)據(jù)進(jìn)行處理的方法。
幀率:幀率(即視頻更新率)是用于測量顯示幀數(shù)的量度。測量單位為“每秒顯示幀數(shù)”(Frame Per Second,F(xiàn)PS,幀率)或“赫茲”,單位用FPS用來描述視頻每秒播放多少幀,而單位用赫茲用來描述顯示器的畫面每秒更新多少次。 一般幀率越高,視頻畫面越流暢。
比特率:指每秒傳送的比特(bit)數(shù),即每秒傳輸?shù)奈募笮?。比特率?guī)定使用“比特每秒”(bit/s 或 bps)為單位。比特率越高,每秒傳送的數(shù)據(jù)越大。
采樣率:采樣率的單位是Hz,表示每秒采樣的次數(shù)。單位時間內(nèi)取樣率越大,精度就越高,處理過的視頻文件就越接近沒有處理過的視頻文件。
碼率:碼率就是數(shù)據(jù)傳輸時單位時間傳送的數(shù)據(jù)位數(shù),一般我們用的單位是kbps即千位每秒。碼率與體積成正比:碼率越大,體積越大;碼率越小,體積越小。由于文件體積與取樣率是成正比的,所以幾乎所有的編碼格式都想用最低的碼率達(dá)到最少的失真,“碼率”就是失真度,碼率越高越清晰,反之則畫面粗糙而且馬賽克多。
視頻部分的位深度:用于指定圖像中的每個像素可以使用的顏色信息數(shù)量,用“位即bit”為單位。
音頻部分的位深度:單個聲道的采樣數(shù)據(jù)大小
可選視頻編碼方案
1. MP4封裝:H264視頻編碼+AAC音頻編碼(最通用)
2. WebM封裝: VP8視頻編碼+Vorbis音頻編碼(Google為了避開專利開發(fā),無明顯優(yōu)勢)
3. OGG封裝: Theora視頻編碼 +Vorvis音頻編碼(完全開源的編碼方式,無專利,HTML5可用)
音頻轉(zhuǎn)碼
例子 flac轉(zhuǎn)mp3
ffmpeg -i input.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
一般來說音頻影響不大,重點(diǎn)說視頻壓縮:
壓縮用到的參數(shù): -i 輸入文件的路徑或者url; -s 設(shè)置輸出文件的分辨率,wxh; -b:v 輸出文件的碼率,一般500k左右即可,人眼看不到明顯的閃爍,這個是與視頻大小最直接相關(guān)的;
ffmpeg -i target.m4v -b:v 400k -s 960x540 dst.mp4
將一個叫target.m4v的視頻轉(zhuǎn)換成mp4格式,設(shè)置輸出視頻的分辨率為960x540,碼率為400k。
這就是最基本的用法了,這個軟件是非常強(qiáng)大的,視頻頻也是可以轉(zhuǎn)換,剪切、截圖的,音頻也一樣,而且還可以分離音視頻。
壓縮完成之后,視頻大小變?yōu)樵瓉淼?/4,而且還是很清楚!比市面上成品的壓縮軟件強(qiáng)太多?。?!
ffmpeg -i in.webm -s 1920*1080 -pix_format yuv420p -vcodec libx264 -preset medium -profile:v high -level:v -crf 23
ffmpeg -pix_fmts
可以打印出所有支持的選項(xiàng)。我就知道兩個YUV和RGB,YUV表示明亮度,色度和濃度,因?yàn)槿说纳X對亮度的敏感程度要高一些,所以網(wǎng)絡(luò)視頻通常會對色度層面進(jìn)行壓縮。也就是所謂的yuv420p。Y保留全部UV進(jìn)行壓縮如下圖所示,越往左支持的選項(xiàng)越少,質(zhì)量越低
實(shí)時通信領(lǐng)域采用baseline
流媒體領(lǐng)域 使用 main
超清視頻 使用high
-level:v 對編碼器配置的限制,如下表
一般情況下1080P及以下視頻選用4.1即可
-crf Constant Rate Factor 恒定速率因子模式,每一幀的畫面都按照要求的視頻質(zhì)量計(jì)算需要的比特?cái)?shù),畫質(zhì)均衡,但是無法控制碼率,也無法控制最終生成文件的大小。 適用于對于畫質(zhì)有要求,文件大小沒有要求的情況,范圍0-51,默認(rèn)值就是23,數(shù)字越小質(zhì)量越高
碼率控制模式
fmmpeg支持3種碼率控制模式
1. -qp
恒定量化器模式,量化器就是用算法將每一幀的質(zhì)量轉(zhuǎn)化為數(shù)字,可以設(shè)置,建議讓軟件自動設(shè)置。
體積最大
一般不使用這種模式,除非你想無損壓制視頻
無損壓制視頻的例子(快速編碼)
ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 output.mkv
無損壓制視頻的例子(高壓縮比)
ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output.mkv
嘗試了用這種無損壓縮方式壓縮dvd鏡像中提取的vob文件,發(fā)現(xiàn)這種方式壓制出來的文件體積竟然是原來的兩倍。所以說還是使用crf 18,這樣就比較接近無損了。
2. -crf 恒定速率因子模式,相當(dāng)于浮動值的qp模式,會給每個畫面不同的量化值,比如說把人眼不敏感的部分碼率調(diào)低。一般壓制視頻使用這個選項(xiàng)。但是不懂不推薦亂設(shè)置,讓軟件自動配置即可 值的范圍是0-51,默認(rèn)值是23,通常認(rèn)為crf值18壓制出來的視頻視覺上是無損的。18-23之間的變化不明顯。
3. -b 固定目標(biāo)碼率模式,當(dāng)上傳視頻網(wǎng)站有碼率限制時,可以使用這個選項(xiàng)。但是不推薦。crf也可以獲得合適的體積和畫質(zhì)。沒必要
使用上面3個選項(xiàng)壓制,都是單遍編碼,最好加上-preset veryslow 選項(xiàng),這樣軟件對參數(shù)的控制會更精準(zhǔn)
比特率模式
VBR 動態(tài)比特率,ffmpeg默認(rèn)采用,簡單的內(nèi)容少給碼率,復(fù)雜內(nèi)容多給碼率。
ABR 平均比特率,網(wǎng)絡(luò)視頻會采用這一格式,因?yàn)閂BR碼率變化太大,不適用網(wǎng)絡(luò)傳輸
CBR 恒定比特率, 通常沒有人使用
輸入 ffmpeg -h encoder=libx264
查看最常用的x264編碼器的使用方式
-nal-hrd
可以指定VBR和CBR兩種,但是CBR在.mp4不支持?
其余還有-maxrate -minrate 選項(xiàng),設(shè)置這兩個選項(xiàng)就能達(dá)到ABR的效果
假設(shè)我們提取mp4視頻中的視頻流
ffmpeg -i in.mp4 -vcodec copy -an v.mp4
-an選項(xiàng)是 audio no 也就是忽略音頻
ffmpeg -i in.mp4 -acodec copy -vn a.m4a
同理 -vn 即忽略音頻
如果提取多個音軌的視頻:
比如我們用ffprobe看到如下
提取第二條 只需加上-map 0:3
合并音視頻
ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4
瞬間就能完成合并,因?yàn)橐纛l和視頻都是現(xiàn)成的,不用重新編碼
-c 就是 -codec的簡寫
ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3
-ss 設(shè)置起始時間位移
-to 設(shè)置結(jié)束時間位移
也可以使用下面的方式
ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3
-t 設(shè)置截取時長
還有-sseof 選項(xiàng) 是以媒體末尾作為起點(diǎn),可以配合-t截取末尾多少秒
看下面2條命令
ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy out.mp4
調(diào)換-ss和-i的位置對結(jié)果的影響?
-ss在前面會調(diào)用關(guān)鍵幀技術(shù),可能導(dǎo)致截取的時間并不準(zhǔn)確
ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy -copyts out.mp4
我們可以加上 -copyts選項(xiàng),作用是保留時間戳,這樣就能正確截取了。
ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4
當(dāng)合并的幾個視頻參數(shù)一致時,很快就合并完成了。
合并不同參數(shù)的視頻,操作會比較麻煩。
上面的方法其實(shí)相當(dāng)于把兩個文件直接拼在一起,適用于mp2之類的視頻,如果是flv連接處會有卡頓現(xiàn)象
下面的方法,先在一個txt文本中把要拼接的文件列出來。
這條命令只要是相同格式的視頻均可以拼接
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
-safe 命令是讓ffmpeg無視安全問題報(bào)錯
在txt文件中的格式需要是這樣子
file 'file1.mp4'
file 'file2.mp4'
可以使用開源軟件Avidemux,圖形化界面,操作方便
截圖
ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg
-vframe 指定截取的幀
ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20"
-filter_complex
添加濾鏡 overlay20:20 指的是,離左邊20像素,離上邊20像素
ffmpeg -i in.mp4 -ss 4.5 -to 8.5 -s 640*320 -r 15 out.gif
ffmpeg -f gdigrab -i desktop rec.mp4
默認(rèn)錄屏參數(shù)是下面這樣的
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\rec.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.24.101
Duration: 00:00:04.11, start: 0.000000, bitrate: 676 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 672 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
清晰度相當(dāng)不錯,字符都很清楚,但是沒有聲音
-f 格式化 gdigrab 是ffmpeg的一個組件,用來捕獲視頻。 在windows系統(tǒng)中,ffmpeg自帶的就是和默認(rèn)使用的gdigrab,只能錄制屏幕,不能錄制聲音
直播推薦使用OBS Studio,開源免費(fèi),功能強(qiáng)大
直播推流
ffmpeg -re -i rec.mp4 按網(wǎng)站要求輸入想要的編碼 -f flv rtmp地址
作者:泥之天空 鏈接:https://www.jianshu.com/p/fa857f004409 來源:簡書 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
詳細(xì)參數(shù):
Print help / information / capabilities:
-h -- print basic options
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter
See man ffmpeg for detailed description of the options.
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
Global options (affect whole program instead of just one file:
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-y overwrite output files
-n never overwrite output files
-ignore_unknown Ignore unknown stream types
-filter_threads number of non-complex filter threads
-filter_complex_threads number of threads for -filter_complex
-stats print progress report during encoding
-max_error_rate maximum error rate ratio of errors (0.0: no errors, 1.0: 100% e rrors) above which ffmpeg returns an error instead of success.
-bits_per_raw_sample number set the number of bits per raw sample
-vol volume change audio volume (256=normal)
Per-file main options:
-f fmt force format
-c codec codec name
-codec codec codec name
-pre preset preset name
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration record or transcode "duration" seconds of audio/video
-to time_stop record or transcode stop time
-fs limit_size set the limit file size in bytes
-ss time_off set the start time offset
-sseof time_off set the start time offset relative to EOF
-seek_timestamp enable/disable seeking by timestamp with -ss
-timestamp time set the recording timestamp ('now' to set the current time)
-metadata string=string add metadata
-program title=string:st=number... add program with specified streams
-target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv5 0" with optional prefixes "pal-", "ntsc-" or "film-")
-apad audio pad
-frames number set the number of frames to output
-filter filter_graph set stream filtergraph
-filter_script filename read stream filtergraph description from a file
-reinit_filter reinit filtergraph on input parameter changes
-discard discard
-disposition disposition
Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number set the number of bits per raw sample
-vn disable video
-vcodec codec force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff set initial TimeCode value.
-pass n select the pass number (1 to 3)
-vf filter_graph set video filters
-ab bitrate audio bitrate (please use -b:a)
-b bitrate video bitrate (please use -b:v)
-dn disable data
Audio options:
-aframes number set the number of audio frames to output
-aq quality set audio quality (codec-specific)
-ar rate set audio sampling rate (in Hz)
-ac channels set number of audio channels
-an disable audio
-acodec codec force audio codec ('copy' to copy stream)
-vol volume change audio volume (256=normal)
-af filter_graph set audio filters
Subtitle options:
-s size set frame size (WxH or abbreviation)
-sn disable subtitle
-scodec codec force subtitle codec ('copy' to copy stream)
-stag fourcc/tag force subtitle tag/fourcc
-fix_sub_duration fix subtitles duration
-canvas_size size set canvas size (WxH or abbreviation)
-spre preset set the subtitle options to the indicated preset
————————————————
版權(quán)聲明:本文為CSDN博主「SHUIPING_YANG」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhezhebie/java/article/details/79263492
https://segmentfault.com/a/1190000002502526
ffmpeg -i MVI_7274.MOV -vcodec libx264 -preset fast -crf 20 -y -vf "scale=1920:-1" -acodec libmp3lame -ab 128k a.mp4
-preset
:指定編碼的配置。x264編碼算法有很多可供配置的參數(shù),不同的參數(shù)值會導(dǎo)致編碼的速度大相徑庭,甚至可能影響質(zhì)量。為了免去用戶了解算法,然后手工配置參數(shù)的麻煩。x264提供了一些預(yù)設(shè)值,而這些預(yù)設(shè)值可以通過preset指定。這些預(yù)設(shè)值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast編碼速度最快,但壓縮率低,生成的文件更大,placebo則正好相反。x264所取的默認(rèn)值為medium。需要說明的是,preset主要是影響編碼的速度,并不會很大的影響編碼出來的結(jié)果的質(zhì)量。壓縮高清電影時,我一般用slow或者slower,當(dāng)你的機(jī)器性能很好時也可以使用veryslow,不過一般并不會帶來很大的好處。
-crf
:這是最重要的一個選項(xiàng),用于指定輸出視頻的質(zhì)量,取值范圍是0-51,默認(rèn)值為23,數(shù)字越小輸出視頻的質(zhì)量越高。這個選項(xiàng)會直接影響到輸出視頻的碼率。一般來說,壓制480p我會用20左右,壓制720p我會用16-18,1080p我沒嘗試過。個人覺得,一般情況下沒有必要低于16。最好的辦法是大家可以多嘗試幾個值,每個都壓幾分鐘,看看最后的輸出質(zhì)量和文件大小,自己再按需選擇。
其實(shí)還有-b 1024k這樣的參數(shù),但是我發(fā)現(xiàn)-crf設(shè)置上后-b就不管用了。根據(jù)我自己的簡單嘗試,壓制5D2拍攝的一段18秒1920x1080的視頻(下午自然光、圖像簡單、大面積白墻、只有一扇黑門)crf和壓出來的文件大小關(guān)系如下:
crf 文件大小
16 54M
18 39M
20 25M
22 17M
24 11M
26 7.3M
28 5.0M
30 3.6M
32 2.7M
默認(rèn) 14M(crf為23)
又比較了一下crf在20、28、32時的視頻質(zhì)量,發(fā)現(xiàn)32還是能看出質(zhì)量下降的,20的確非常精細(xì),但28跟20之間的差別并不是那么大,crf值設(shè)置在26-28之間比較好。如果對尺寸有要求,什么都不設(shè),用默認(rèn)的也行(可能是31)。
另外,關(guān)于preset,slow和fast只跟運(yùn)行時間有關(guān),slow跑的時間比fast長不少,slow出來的mp4文件會小一些(12M),fast出來的文件會大一些(14M),但視頻質(zhì)量的差距并不明顯。
如果把原視頻尺寸從1920x1080縮小到960x540,則視頻尺寸變?yōu)榱耍?/p>
crf 文件大小
16 11M
18 6.7M
20 4.4M
22 3.0M
24 2.1M
26 1.6M
28 1.3M
30 1.1M
32 893K
默認(rèn) 2.5M(crf為23)
綜上,對質(zhì)量要求較高時,選22以下;對尺寸要求非常高時,選26(但質(zhì)量確實(shí)是會稍差一些),否則選24的性價比比較高(或者默認(rèn)的23也行),如果對尺寸實(shí)在要求非常非常高,那就28以上吧。
后記補(bǔ)充(來自@gghyoo)
可以用-threads n 來實(shí)施多線程的運(yùn)算,充分利用多核cpu
例子如下:
ffmpeg -threads 2 -crf 20 -y -i ML-02.avi -strict experimental ML-02.mp4
聯(lián)系客服