文章目錄
- 前言
- ffmpeg的描述
- 重新編碼媒體流
- 重新編碼媒體流的命令
- ffmpeg支持的媒體流
- 設置視頻碼率
- 視頻碼率是什么
- 設置視頻的碼率
- 設置文件幀數率
- 幀數率是什么
- ffmpeg設置幀數率
- 總結
前言
在數字媒體處理領域,ffmpeg是一款非常強大的工具,它可以用來進行媒體流的重新編碼、設置碼率、設置幀速率等操作。ffmpeg的功能強大且復雜,但是一旦掌握了其基本的使用方法,就能夠靈活地處理各種媒體文件,滿足各種需求。
ffmpeg的描述
ffmpeg是一款通用的媒體轉換工具,它可以讀取各種類型的輸入(包括實時抓取/錄制設備),進行過濾,并將它們轉換成各種輸出格式。
ffmpeg可以從任意數量的輸入"文件"中讀取數據,這些文件可以是常規文件、管道、網絡流、抓取設備等,這些都是通過-i
選項指定的。ffmpeg可以寫入任意數量的輸出"文件",這些文件是通過一個普通的輸出url指定的。命令行上找到的任何不能被解釋為選項的內容都被視為輸出url。
每個輸入或輸出url原則上可以包含任意數量和類型(視頻/音頻/字幕/附件/數據)的流。流的數量和/或類型可能受到容器格式的限制。選擇哪些流從哪些輸入進入哪個輸出要么自動完成,要么通過-map
選項完成。
在選項中引用輸入文件時,你必須使用它們的索引(從0開始)。例如,第一個輸入文件是0,第二個是1,等等。同樣,文件內的流也是通過它們的索引引用的。例如,2:3
指的是第三個輸入文件中的第四個流。
作為一般規則,選項應用于下一個指定的文件。因此,順序很重要,你可以在命令行上多次使用同一個選項。每次出現的選項都會應用于下一個輸入或輸出文件。此規則的例外是全局選項(例如,詳細程度級別),這些選項應該首先被指定。
不要混合輸入和輸出文件 - 首先指定所有輸入文件,然后指定所有輸出文件。也不要混合屬于不同文件的選項。所有選項僅適用于下一個輸入或輸出文件,并在文件之間重置。
重新編碼媒體流
重新編碼媒體流的命令
我們可以使用ffmpeg把任意他支持的媒體流變成另一個他支持的媒體流,就像這樣:
ffmpeg -i input.mp4 output.avi
D:\Codes\ffmpeg_Command>ffmpeg -i test.mp4 out1.avi
ffmpeg支持的媒體流
FFmpeg支持的文件后綴非常多,包括但不限于以下幾種:
- 視頻格式:
.mp4
、.avi
、.flv
、.mov
、.mkv
、.wmv
、.3gp
等。 - 音頻格式:
.mp3
、.wav
、.aac
、.flac
、.ogg
、.m4a
等。 - 封裝格式:
.ts
、.m3u8
(用于HLS流)等。 - 圖像格式:
.jpg
、.png
、.bmp
、.gif
等。
你可以通過ffmpeg -formats
命令來獲取FFmpeg所支持的所有文件類型
D:\Codes\ffmpeg_Command>ffmpeg -formats
ffmpeg version 7.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developersbuilt with gcc 13.2.0 (Rev5, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberbandlibavutil 59. 8.100 / 59. 8.100libavcodec 61. 3.100 / 61. 3.100libavformat 61. 1.100 / 61. 1.100libavdevice 61. 1.100 / 61. 1.100libavfilter 10. 1.100 / 10. 1.100libswscale 8. 1.100 / 8. 1.100libswresample 5. 1.100 / 5. 1.100libpostproc 58. 1.100 / 58. 1.100
Formats:D.. = Demuxing supported.E. = Muxing supported..d = Is a device---D 3dostr 3DO STRE 3g2 3GP2 (3GPP2 file format)E 3gp 3GP (3GPP file format)D 4xm 4X TechnologiesE a64 a64 - video for Commodore 64D aa Audible AA format filesD aac raw ADTS AAC (Advanced Audio Coding)D aax CRI AAXDE ac3 raw AC-3DE ac4 raw AC-4D ace tri-Ace Audio ContainerD acm Interplay ACMD act ACT Voice file formatD adf Artworx Data FormatD adp ADPD ads Sony PS2 ADSE adts ADTS AAC (Advanced Audio Coding)DE adx CRI ADXDE aea MD STUDIO audioD afc AFCDE aiff Audio IFFD aix CRI AIXDE alaw PCM A-lawD alias_pix Alias/Wavefront PIX imageDE alp LEGO Racers ALPDE amr 3GPP AMRD amrnb raw AMR-NBD amrwb raw AMR-WBE amv AMVD anm Deluxe Paint AnimationD apac raw APACD apc CRYO APCD ape Monkey's Audio
//后面還有很多,這里不寫出來了
設置視頻碼率
視頻碼率是什么
視頻碼率是指視頻數據的傳輸速率,也就是每秒鐘傳輸的數據量。它通常以比特每秒(bps)或千比特每秒(kbps)為單位來表示。
舉個例子,如果一個視頻的碼率是500 kbps,那么這意味著每秒鐘這個視頻會傳輸500千比特的數據。
視頻碼率對視頻質量有很大的影響。一般來說,碼率越高,視頻質量越好,因為每秒鐘傳輸的數據量更大,能夠展示更多的細節。但是,高碼率的視頻也會占用更多的存儲空間和帶寬。
所以,選擇合適的視頻碼率是一個平衡的過程,需要在視頻質量和存儲空間/帶寬之間做出權衡。
設置視頻的碼率
ffmpeg -i test2.mp4 -b:v 2048k -bufsize 2048k out2.mp4
這個命令是使用FFmpeg將一個輸入的視頻文件input.avi
轉換為輸出的視頻文件output.mp4
,并在轉換過程中設置視頻流的碼率和緩沖區大小。
具體來說,這個命令的各個部分的含義如下:
-
ffmpeg
:這是調用FFmpeg程序的命令。 -
-i input.avi
:-i
選項后面跟的是輸入文件的名稱,這里是input.avi
。 -
-b:v 2048k
:這是設置視頻流的碼率為2048kbps(千比特每秒)。-b:v
是指定視頻碼率的選項,2048k
是碼率的值。碼率越大,視頻質量越好,但文件大小也會越大。 -
-bufsize 2048k
:這是設置碼率控制緩沖區的大小,這里是2048kbps。緩沖區大小可以影響視頻的質量和文件大小。 -
output.mp4
:這是輸出文件的名稱,這里是output.mp4
。
設置文件幀數率
幀數率是什么
幀率,也被稱為幀頻,是用來衡量視頻播放流暢度的一個參數。它表示的是每秒鐘能夠顯示的圖片的數量,單位通常是FPS(Frames Per Second,每秒幀數)。
舉個例子,如果一個視頻的幀率是30 FPS,那就意味著每秒鐘這個視頻會播放30張圖片。這些圖片以足夠快的速度連續播放,使人眼看起來就像是連續的動畫。
一般來說,幀率越高,視頻看起來就越流暢。例如,大多數電影的幀率是24 FPS,而電視節目可能會使用30 FPS或60 FPS。然而,更高的幀率也意味著需要更多的存儲空間和更高的播放要求。
總的來說,幀率是決定視頻播放質量的重要因素之一。
ffmpeg設置幀數率
使用-r
選項強制設置幀數率:
ffmpeg -i test2.mp4 -r 144 out3.mp4
過程:
frame= 46 fps=0.0 q=33.0 size= 0KiB time=00:00:00.30 bitrate= 1.3kbits/s dup=73 drop=0 speed=0.5frame= 135 fps=130 q=33.0 size= 256KiB time=00:00:00.92 bitrate=2271.0kbits/s dup=125 drop=0 speed=0.frame= 231 fps=149 q=33.0 size= 512KiB time=00:00:01.59 bitrate=2637.7kbits/s dup=181 drop=0 speed=1.frame= 318 fps=154 q=33.0 size= 768KiB time=00:00:02.19 bitrate=2867.2kbits/s dup=231 drop=0 speed=1.frame= 410 fps=159 q=33.0 size= 1280KiB time=00:00:02.83 bitrate=3701.0kbits/s dup=286 drop=0 speed= 1frame= 509 fps=164 q=33.0 size= 1536KiB time=00:00:03.52 bitrate=3574.0kbits/s dup=343 drop=0 speed=1.frame= 608 fps=168 q=33.0 size= 1792KiB time=00:00:04.20 bitrate=3488.4kbits/s dup=400 drop=0 speed=1.frame= 697 fps=169 q=33.0 size= 2048KiB time=00:00:04.82 bitrate=3476.2kbits/s dup=452 drop=0 speed=1.frame= 797 fps=172 q=33.0 size= 2560KiB time=00:00:05.51 bitrate=3803.5kbits/s dup=511 drop=0 speed=1.frame= 889 fps=172 q=33.0 size= 2816KiB time=00:00:06.15 bitrate=3745.1kbits/s dup=564 drop=0 speed=1.
//省略
[out#0/mp4 @ 0000023746653900] video:14502KiB audio:477KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.512872%
frame= 4330 fps=165 q=-1.0 Lsize= 15056KiB time=00:00:30.00 bitrate=4111.3kbits/s dup=2526 drop=0 speed=1.14x
[libx264 @ 000002374665af80] frame I:67 Avg QP:18.77 size: 18885
[libx264 @ 000002374665af80] frame P:1160 Avg QP:23.94 size: 8734
[libx264 @ 000002374665af80] frame B:3103 Avg QP:22.95 size: 1113
[libx264 @ 000002374665af80] consecutive B-frames: 1.9% 4.4% 9.8% 83.9%
[libx264 @ 000002374665af80] mb I I16..4: 14.1% 80.9% 5.0%
[libx264 @ 000002374665af80] mb P I16..4: 4.0% 13.5% 1.1% P16..4: 10.2% 2.8% 0.7% 0.0% 0.0% skip:67.7%
[libx264 @ 000002374665af80] mb B I16..4: 0.1% 0.2% 0.0% B16..8: 9.5% 0.4% 0.0% direct: 0.1% skip:89.6% L0:46.4% L1:53.0% BI: 0.6%
[libx264 @ 000002374665af80] 8x8 transform intra:73.9% inter:73.4%
[libx264 @ 000002374665af80] coded y,uvDC,uvAC intra: 12.4% 19.1% 3.2% inter: 0.7% 0.7% 0.0%
[libx264 @ 000002374665af80] i16 v,h,dc,p: 49% 31% 11% 9%
[libx264 @ 000002374665af80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 48% 15% 30% 1% 1% 1% 1% 1% 1%
[libx264 @ 000002374665af80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 15% 20% 4% 5% 6% 4% 5% 2%
[libx264 @ 000002374665af80] i8c dc,h,v,p: 69% 13% 15% 2%
[libx264 @ 000002374665af80] Weighted P-Frames: Y:0.6% UV:0.2%
[libx264 @ 000002374665af80] ref P L0: 68.4% 6.5% 17.6% 7.4% 0.1%
[libx264 @ 000002374665af80] ref B L0: 84.6% 12.3% 3.0%
[libx264 @ 000002374665af80] ref B L1: 97.7% 2.3%
[libx264 @ 000002374665af80] kb/s:3950.77
[aac @ 0000023746669ac0] Qavg: 910.307
總結
通過本文的學習,我們了解了如何使用ffmpeg進行媒體流的重新編碼、設置碼率和設置幀速率等操作。雖然ffmpeg的命令行參數眾多,但是只要掌握了一些基本的命令和概念,就能夠靈活地處理各種媒體文件。希望本文能夠幫助你入門ffmpeg,為你的媒體處理工作提供幫助。在實際使用中,你可能還需要根據自己的需求去查閱更多的ffmpeg命令和參數,不斷提高自己的技能。祝你學習愉快!