1 ffmpeg介紹
FFmpeg 是一個非常強大和靈活的開源工具集,用于處理音頻和視頻文件。它提供了一系列的工具和庫,可以用于錄制、轉(zhuǎn)換、流式傳輸和播放音頻和視頻。
FFmpeg 主要特點如下:
-
格式支持廣泛:FFmpeg 支持幾乎所有的音頻和視頻格式,包括非常流行的格式如 MP4, AVI, MOV, MP3, AAC 等。
-
轉(zhuǎn)碼和處理能力:它可以用來轉(zhuǎn)換文件格式,調(diào)整視頻質(zhì)量和分辨率,提取音頻,合并或分割視頻文件等。
-
流媒體功能:FFmpeg 可以用于實時視頻流的捕獲、編碼和轉(zhuǎn)碼,非常適合直播應(yīng)用。
-
命令行工具:通過命令行界面,用戶可以使用一系列的命令和參數(shù)來精確控制音視頻處理過程。
-
編程接口:FFmpeg 提供了豐富的編程接口,開發(fā)者可以使用它們來集成音視頻處理功能到自己的應(yīng)用中。
-
社區(qū)和文檔:有著活躍的開發(fā)社區(qū)和詳細(xì)的文檔,使得用戶和開發(fā)者可以輕松地學(xué)習(xí)和使用 FFmpeg。
-
跨平臺兼容性:它可以在多種操作系統(tǒng)上運行,包括 Windows, macOS, Linux 等。
-
免費和開源:FFmpeg 是完全免費和開源的,適用于個人和商業(yè)用途。
一個典型的視頻轉(zhuǎn)換處理過程:
2 ffmpeg使用場景
2.1 查看視頻基本信息
ffmpeg -i video01.mp4
顯示結(jié)果如下:
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7.3.0 (crosstool-NG 1.23.0.449-a04d0)
configuration: --prefix=/tmp/build/80754af9/ffmpeg_1587154242452/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho --cc=/tmp/build/80754af9/ffmpeg_1587154242452/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc --disable-doc --enable-avresample --enable-gmp --enable-hardcoded-tables --enable-libfreetype --enable-libvpx --enable-pthreads --enable-libopus --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-static --enable-version3 --enable-zlib --enable-libmp3lame --disable-nonfree --enable-gpl --enable-gnutls --disable-openssl --enable-libopenh264 --enable-libx264
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video01.mp4':
Metadata:
major_brand : XAVC
minor_version : 17506303
compatible_brands: XAVCmp42iso6
creation_time : 2021-01-24T08:58:52.000000Z
Duration: 00:06:22.56, start: 0.000000, bitrate: 305946 kb/s
Stream #0:0[0x1](und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 279989 kb/s, 100 fps, 100 tbr, 100k tbn (default)
Metadata:
creation_time : 2021-01-24T08:58:52.000000Z
handler_name : Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Side data:
displaymatrix: rotation of -90.00 degrees
Stream #0:1[0x2](und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
Metadata:
creation_time : 2021-01-24T08:58:52.000000Z
handler_name : Sound Media Handler
vendor_id : [0][0][0][0]
Stream #0:2[0x3](und): Data: none (rtmd / 0x646D7472), 23756 kb/s (default)
Metadata:
creation_time : 2021-01-24T08:58:52.000000Z
handler_name : Timed Metadata Media Handler
timecode : 07:34:17:80
-
視頻分辨率 1920x1080
-
時長:00:06:33.15
-
幀率:25fps
-
編碼器:h264
-
音頻采樣率:48000HZ
-
音頻編碼:aac
2.2 調(diào)整視頻碼率和分辨率
ffmpeg -i video01.mp4 -vf scale=1080*1920 -r 25 processed_video01.mp4
查看轉(zhuǎn)換后的視頻信息:
ffmpeg -i processed_video01.mp4
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 7 (GCC)
configuration:
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'processed_video01.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf60.11.100
Duration: 00:06:22.64, start: 0.000000, bitrate: 1038 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p10le(tv, bt709), 1080x1920 [SAR 1:1 DAR 9:16], 903 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : Video Media Handler
encoder : Lavc60.26.100 libx264
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 129 kb/s (default)
Metadata:
handler_name : Sound Media Handler
2.3 提取視頻的第一幀
ffmpeg -i video01.mp4 -ss 00:00:01 -vframes 1 output.jpg
查看截取后的圖片信息:
ffmpeg -i output.jpg
ffmpeg version 2023-09-07-git-9c9f48e7f2-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (Rev10, 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-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 58. 19.100 / 58. 19.100
libavcodec 60. 26.100 / 60. 26.100
libavformat 60. 11.100 / 60. 11.100
libavdevice 60. 2.101 / 60. 2.101
libavfilter 9. 11.100 / 9. 11.100
libswscale 7. 3.100 / 7. 3.100
libswresample 4. 11.100 / 4. 11.100
libpostproc 57. 2.100 / 57. 2.100
Input #0, image2, from 'output.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 14454 kb/s
Stream #0:0: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 1080x1920 [SAR 1:1 DAR 9:16], 25 fps, 25 tbr, 25 tbn
At least one output file must be specified
2.4 截取第10幀以后得視頻
ffmpeg -i processed_video01.mp4 -vf select="gte(n\, 10)" cut_video01.mp4
查看截取后的視頻信息:
ffmpeg -i cut_video01.mp4
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 7 (GCC)
configuration:
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut_video01.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf58.45.100
Duration: 00:06:22.64, start: 0.000000, bitrate: 1179 kb/s
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1080x1920 [SAR 1:1 DAR 9:16], 1046 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
Metadata:
handler_name : Video Media Handler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : Sound Media Handler
2.5 跳過第一秒截取視頻
ffmpeg -i processed_video01.mp4 -ss 3 cut2_video01.mp4
?查看處理后的視頻:
ffmpeg -i cut2_video01.mp4
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 7 (GCC)
configuration:
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut2_video01.mp4 ':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf58.45.100
Duration: 00:06:19.64, start: 0.000000, bitrate: 1179 kb/s
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1080x1920 [SAR 1:1 DAR 9:16], 1046 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
Metadata:
handler_name : Video Media Handler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : Sound Media Handler
At least one output file must be specified
2.6 使用圖片文件集合和音頻合成視頻
ffmpeg -f image2 -i pictures/%06d.png -i audio/audio01.wav -c:a aac -r 25 video_01.mp4
查看處理后的視頻:
ffmpeg -i video_01.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7.3.0 (crosstool-NG 1.23.0.449-a04d0)
configuration: --prefix=/tmp/build/80754af9/ffmpeg_1587154242452/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho --cc=/tmp/build/80754af9/ffmpeg_1587154242452/_build_env/bin/x86_64-conda_cos6-linux-gnu-cc --disable-doc --enable-avresample --enable-gmp --enable-hardcoded-tables --enable-libfreetype --enable-libvpx --enable-pthreads --enable-libopus --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-static --enable-version3 --enable-zlib --enable-libmp3lame --disable-nonfree --enable-gpl --enable-gnutls --disable-openssl --enable-libopenh264 --enable-libx264
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video_01.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.29.100
Duration: 00:03:27.52, start: 0.000000, bitrate: 4405 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2160x3840, 4335 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 69 kb/s (default)
Metadata:
handler_name : SoundHandler
3 ffmpeg知識補充
FFMPEG堪稱自由軟件中最完備的一套多媒體支持庫,它幾乎實現(xiàn)了所有當(dāng)下常見的數(shù)據(jù)封裝格式、多媒體傳輸協(xié)議以及音視頻編解碼器,堪稱多媒體業(yè)界的瑞士軍刀。因此,對于從事多媒體技術(shù)開發(fā)的工程師來說,深入研究FFMPEG成為一門必不可少的工作,可以這樣說,F(xiàn)FMPEG之于多媒體開發(fā)工程師的重要性正如kernel之于嵌入式系統(tǒng)工程師一般。
幾個小知識:
- FFMPEG項目是由法國人Fabrice Bellard發(fā)起的,此人也是著名的CPU模擬器項目QEMU的發(fā)起者,同時還是圓周率算法紀(jì)錄的保持者。
- FF是Fast Forward的意思,翻譯成中文是“快進”。
- FFMPEG的LOGO是一個”Z字掃描”示意圖,Z字掃描用于將圖像的二維頻域數(shù)據(jù)一維化,同時保證了一維化的數(shù)據(jù)具備良好的統(tǒng)計特性,從而提高其后要進行的一維熵編碼的效率。
FFMPEG大部分代碼遵循LGPL許可證,如果使用者對FFMpeg進行了修改,要求公布修改的源代碼;有少部分代碼遵循GPL許可證,要求使用者同時公開使用FFMpeg的軟件的源代碼。實際上,除去部分具備系統(tǒng)軟件開發(fā)能力的大型公司(Microsoft、Apple等)以及某些著名的音視頻技術(shù)提供商(Divx、Real等)提供的自有播放器之外,絕大部分第三方開發(fā)的播放器都離不開FFMpeg的支持,像Linux桌面環(huán)境中的開源播放器VLC、MPlayer,Windows下的KMPlayer、暴風(fēng)影音以及Android下幾乎全部第三方播放器都是基于FFMPEG的。也有許多看似具備自主技術(shù)的播放器,其實也都不聲不響地使用了FFMPEG,這種行為被稱為“盜竊”,參與“盜竊”的公司則被請入恥辱廳,如于2009年上榜的國產(chǎn)播放器暴風(fēng)影音、QQ影音。
關(guān)于FFMPEG的商業(yè)應(yīng)用:與其他開源軟件不同的是,F(xiàn)FMPEG所觸及的多媒體編解碼算法中有相當(dāng)一部分處于大量的專利涵蓋范圍之內(nèi),因此,在商業(yè)軟件中使用FFMPEG必須考慮可能造成的對專利所有者的權(quán)利侵犯,這一點在FFMPEG的官方網(wǎng)站也有所提及,所涉及的風(fēng)險需使用者自行評估應(yīng)對。
FFMPEG從功能上劃分為幾個模塊,分別為核心工具(libutils)、媒體格式(libavformat)、編解碼(libavcodec)、設(shè)備(libavdevice)和后處理(libavfilter, libswscale, libpostproc),分別負(fù)責(zé)提供公用的功能函數(shù)、實現(xiàn)多媒體文件的讀包和寫包、完成音視頻的編解碼、管理音視頻設(shè)備的操作以及進行音視頻后處理。
3.1 使用FFMPEG
這里指FFMPEG提供的命令行(CLI)工具ffmpeg,其使用方法如下(方括號表示可選項,花括號表示必選項目):
ffmpeg [global options] {[infile options]['-i' 'infile'] ...} {[outfile options] 'outfile' ...}
參數(shù)選項由三部分組成:可選的一組全局參數(shù)、一組或多組輸入文件參數(shù)、一組或多組輸出文件參數(shù),其中,每組輸入文件參數(shù)以‘-i’為結(jié)束標(biāo)記;每組輸出文件參數(shù)以輸出文件名為結(jié)束標(biāo)記。
3.2 基本選項
能力集列表
- -formats:列出支持的文件格式。
- -codecs:列出支持的編解碼器。
- -decoders:列出支持的解碼器。
- -encoders:列出支持的編碼器。
- -protocols:列出支持的協(xié)議。
- -bsfs:列出支持的比特流過濾器。
- -filters:列出支持的濾鏡。
- -pix_fmts:列出支持的圖像采樣格式。
- -sample_fmts:列出支持的聲音采樣格式。
常用輸入選項
- -i filename:指定輸入文件名。
- -f fmt:強制設(shè)定文件格式,需使用能力集列表中的名稱(缺省是根據(jù)擴展名選擇的)。
- -ss hh:mm:ss[.xxx]:設(shè)定輸入文件的起始時間點,啟動后將跳轉(zhuǎn)到此時間點然后開始讀取數(shù)據(jù)。
對于輸入,以下選項通常是自動識別的,但也可以強制設(shè)定。
- -c codec:指定解碼器,需使用能力集列表中的名稱。
- -acodec codec:指定聲音的解碼器,需使用能力集列表中的名稱。
- -vcodec codec:指定視頻的解碼器,需使用能力集列表中的名稱。
- -b:v bitrate:設(shè)定視頻流的比特率,整數(shù),單位bps。
- -r fps:設(shè)定視頻流的幀率,整數(shù),單位fps。
- -s WxH : 設(shè)定視頻的畫面大小。也可以通過掛載畫面縮放濾鏡實現(xiàn)。
- -pix_fmt format:設(shè)定視頻流的圖像格式(如RGB還是YUV)。
- -ar sample rate:設(shè)定音頻流的采樣率,整數(shù),單位Hz。
- -ab bitrate:設(shè)定音頻流的比特率,整數(shù),單位bps。
- -ac channels:設(shè)置音頻流的聲道數(shù)目。
常用輸出選項
- -f fmt:強制設(shè)定文件格式,需使用能力集列表中的名稱(缺省是根據(jù)擴展名選擇的)。
- -c codec:指定編碼器,需使用能力集列表中的名稱(編碼器設(shè)定為”copy“表示不進行編解碼)。
- -acodec codec:指定聲音的編碼器,需使用能力集列表中的名稱(編碼器設(shè)定為”copy“表示不進行編解碼)。
- -vcodec codec:指定視頻的編碼器,需使用能力集列表中的名稱(編解碼器設(shè)定為”copy“表示不進行編解碼)。
- -r fps:設(shè)定視頻編碼器的幀率,整數(shù),單位fps。
- -pix_fmt format:設(shè)置視頻編碼器使用的圖像格式(如RGB還是YUV)。
- -ar sample rate:設(shè)定音頻編碼器的采樣率,整數(shù),單位Hz。
- -b bitrate:設(shè)定音視頻編碼器輸出的比特率,整數(shù),單位bps。
- -ab bitrate:設(shè)定音頻編碼器輸出的比特率,整數(shù),單位bps。
- -ac channels:設(shè)置音頻編碼器的聲道數(shù)目。
- -an 忽略任何音頻流。
- -vn 忽略任何視頻流。
- -t hh:mm:ss[.xxx]:設(shè)定輸出文件的時間長度。
- -to hh:mm:ss[.xxx]:如果沒有設(shè)定輸出文件的時間長度的畫可以設(shè)定終止時間點。
3.3 流標(biāo)識
FFMPEG的某些選項可以對一個特定的媒體流起作用,這種情況下需要在選項后面增加一個流標(biāo)識。流標(biāo)識允許以下幾種格式:文章來源:http://www.zghlxwxcb.cn/news/detail-759036.html
- 流序號。譬如“:1”表示第二個流。
- 流類型。譬如“:a“表示音頻流,流類型可以和流序號合并使用,譬如“:a:1”表示第二個音頻流。
- 節(jié)目。節(jié)目和流序號可以合并使用。
- 流標(biāo)識。流標(biāo)識是一個內(nèi)部標(biāo)識號。
假如要設(shè)定第二個音頻流為copy,則需要指定-codec:a:1 copy文章來源地址http://www.zghlxwxcb.cn/news/detail-759036.html
3.4 音頻選項
- -aframes:等價于frames:a,輸出選項,用于指定輸出的音頻幀數(shù)目。
- -aq:等價于q:a,老版本為qscale:a,用于設(shè)定音頻質(zhì)量。
- -atag:等價于tag:a,用于設(shè)定音頻流的標(biāo)簽。
- -af:等價于filter:a,用于設(shè)定一個聲音的后處理過濾鏈,其參數(shù)為一個描述聲音后處理鏈的字符串。
3.5 視頻選項
- -vframes:等價于frames:v,輸出選項,用于指定輸出的視頻幀數(shù)目。
- -aspect:設(shè)置寬高比,如4:3、16:9、1.3333、1.7777等。
- -bits_per_raw_sample:設(shè)置每個像素點的比特數(shù)。
- -vstats:產(chǎn)生video統(tǒng)計信息。
- -vf:等價于filter:v,用于設(shè)定一個圖像的后處理過濾鏈,其參數(shù)為一個描述圖像后處理鏈的字符串。
- -vtag:等價于tag:v,用于設(shè)定視頻流的標(biāo)簽。
- -force_fps:強制設(shè)定視頻幀率。
- -force_key_frames:顯式控制關(guān)鍵幀的插入,參數(shù)為字符串,可以是一個時間戳,也可以是一個“expr:”前綴的表達式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”
到了這里,關(guān)于使用ffmpeg命令進行視頻格式轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!