ffmpeg是視頻開發最常用到的開源軟件,ffmpeg功能強大,用途廣泛,提供幾乎所有你能夠想到的與視頻開發相關的操作,許多商業軟件都以ffmpeg為基礎進行開發定製。
FFmpeg: FFmpeg is a free and open-source project consisting of a vast software suite of libraries and programs for handling video, audio, and other multimedia files and streams. At its core is the FFmpeg program itself, designed for command-line-based processing of video and audio files, and widely used for format transcoding, basic editing (trimming and concatenation), video scaling, video post-production effects, and standards compliance (SMPTE, ITU) . 摘自wikipedia
ffmpeg功能龐大,向開發者提供了豐富的函數庫調用,常用的函數庫包括:
- libavcodec - 各種格式的音視頻編解碼
- libavformat - 各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息、讀取音視頻數據等功能
- libswscale - 視頻圖像縮放的庫,提供顏色空間轉換、圖像格式轉換的功能
- libavutil - 工具庫,包括算數運算,字符操作等
- libpostproc - 對視頻做預處理的庫
- libpostproc - 濾鏡功能庫
- libavdevice - 提供了訪問捕獲設備和回放設備的接口
此外,ffmpeg還向開發者提供了豐富的命令行工具,對於不熟悉ffmpeg的開發者來説,可以先通過這些命令行工具,對ffmpeg的基本功能有個大致的瞭解,下面我們就開始正式討論。
1、ffmpeg安裝
這裏以Ubuntu 16 LTS版為例介紹FFmpeg的安裝。
添加PPA源
ffmpeg 4是目前最新的發行版本,如果要安裝該版本,需要添加PPA源,執行以下命令添加PPA倉庫到Ubuntu系統
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
安裝ffmpeg
通過以下命令安裝ffmpeg
sudo apt-get update
sudo apt-get install ffmpeg
可以看到x264等相關的動態庫文件也會一同安裝
sudo apt-get install ffmpeg
[sudo] password for ron:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libaom0 libavcodec58 libavdevice58 libavfilter7 libavformat58 libavresample4 libavutil56 libbs2b0 libchromaprint1 libcodec2-0.4
libflite1 liblilv-0-0 libmysofa1 libnorm1 libopenjp2-7 libopenmpt0 libpgm-5.2-0 libpocketsphinx3 libpostproc55 librabbitmq4
librubberband2v5 libserd-0-0 libsodium18 libsord-0-0 libsphinxbase3 libsratom-0-0 libsrt1-gnutls libswresample3 libswscale5
libvdpau1 libvidstab1.1 libx264-155 libx265-192 libzmq5 mesa-vdpau-drivers vdpau-driver-all
Suggested packages:
ffmpeg-doc serdi sordi libvdpau-va-gl1 nvidia-vdpau-driver nvidia-legacy-340xx-vdpau-driver
Recommended packages:
pocketsphinx-hmm-en-hub4wsj | pocketsphinx-hmm-zh-tdt | pocketsphinx-hmm-en-tidigits pocketsphinx-lm-en-hub4
| pocketsphinx-lm-zh-hans-gigatdt | pocketsphinx-lm-zh-hant-gigatdt
The following NEW packages will be installed:
ffmpeg libaom0 libavcodec58 libavdevice58 libavfilter7 libavformat58 libavresample4 libavutil56 libbs2b0 libchromaprint1
libcodec2-0.4 libflite1 liblilv-0-0 libmysofa1 libnorm1 libopenjp2-7 libopenmpt0 libpgm-5.2-0 libpocketsphinx3 libpostproc55
librabbitmq4 librubberband2v5 libserd-0-0 libsodium18 libsord-0-0 libsphinxbase3 libsratom-0-0 libsrt1-gnutls libswresample3
libswscale5 libvdpau1 libvidstab1.1 libx264-155 libx265-192 libzmq5 mesa-vdpau-drivers vdpau-driver-all
0 upgraded, 37 newly installed, 0 to remove and 233 not upgraded.
Need to get 29.2 MB of archives.
After this operation, 106 MB of additional disk space will be used.
Do you want to continue? [Y/n]
確認ffmpeg安裝成功
ffmpeg安裝完成後,可以通過ffmpeg -version命令打印FFmpeg的版本號,能夠成功打印即可確認ffmpeg安裝成功。
ffmpeg -version
2、ffmpeg源碼編譯
ffmpeg源碼編譯並不需要多麼複雜的編譯環境,只需要基本的編譯器及依賴庫即可。ffmpeg支持多個主流平台的開發,這裏主要講述如何在linux環境下進行編譯。
ffmpeg編譯環境準備
這裏以ubuntu系統為例進行講述,其他linux發行版原理類似。
在linux系統上編譯需要安裝gcc make等組件,可以用下命令進行安裝
sudo apt-get install build-essential
輸入gcc -v命令即可查詢當前的gcc版本號
gcc -v
ffmpeg依賴庫準備
ffmpeg源碼編譯主要依賴x264、yasm這兩個組件,在搜索引擎中可以非常容易到找到它們的源碼包,通過源碼包編譯安裝的方式還可用於嵌入式環境
x264: x264 is a free software library and application for encoding video streams into the H.264/MPEG-4 AVC compression format, and is released under the terms of the GNU GPL.
Yasm: Yasm is a complete rewrite of the NASM assembler under the “new” BSD License,Yasm currently supports the x86 and AMD64 instruction sets, accepts NASM and GAS assembler syntaxes, outputs binary, ELF32, ELF64, 32 and 64-bit Mach-O, RDOFF2, COFF, Win32, and Win64 object formats, and generates source debugging information in STABS, DWARF 2, and CodeView 8 formats.
下面給出源碼包的鏈接地址
https://ffmpeg.org/download.h...
http://download.videolan.org/...
http://yasm.tortall.net/Downl...
這裏實測過的源碼版本分別是
x264-0.148 (x264 snapshot-20170307-2245)
yasm-1.3.0
ffmpeg-3.2.4
其中,x264提供對h.264編碼器的支持,yasm用於對彙編優化的支持,若不需要彙編優化的支持,可在編譯選項中關閉yasm即可(--disable-yasm)
在Linux下可採用以下方式配置編譯選項:
yasm configure配置
./configure --prefix=/usr/local/3rdparty/yasm
x264 configure配置
./configure --prefix=/usr/local/3rdparty/x264 --enable-shared --enable-static --enable-yasm
生成Makefile文件後,輸入make命令即可開始編譯過程,編譯完成後,執行make install命令進行安裝
make
sudo make install
x264、yasm編譯完成後,還需要讓系統能夠找到對應的安裝位置。打開/etc/profile配置文件,在該文件底部添加各組件的環境變量
# YASM
export PATH="$PATH:/usr/local/3rdparty/yasm/bin/"
export LD_LIBRARY_PATH=/usr/local/3rdparty/yasm/lib:$LD_LIBRARY_PATH
# X264
export PATH="$PATH:/usr/local/3rdparty/x264/bin/"
export LD_LIBRARY_PATH=/usr/local/3rdparty/x264/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/3rdparty/x264/lib/pkgconfig:$PKG_CONFIG_PATH
使用source /etc/profile命令刷新環境變量
source /etc/profile
環境變量配置完成後,可以通過下面的命令確認x264等依賴組件是否編譯安裝成功
x264 --version
x264 0.148.x
built on May 22 2019, gcc: 5.4.0 20160609
x264 configuration: --bit-depth=8 --chroma-format=all
libx264 configuration: --bit-depth=8 --chroma-format=all
x264 license: GPL version 2 or later
yasm --version
yasm 1.3.0
Compiled on May 6 2015.
Copyright (c) 2001-2014 Peter Johnson and other Yasm developers.
Run yasm --license for licensing overview and summary.
ffmpeg源碼編譯
在Linux下可採用以下方式配置編譯選項:
ffmpeg configure配置
./configure --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib
生成Makefile文件後,輸入make命令即可開始編譯過程,編譯完成後,執行make install命令進行安裝
make
sudo make install
編譯完成後,在源碼目錄生成ffmpeg、ffserver、ffprobe等命令行工具,其中
- ffmpeg - 命令行工具支持視頻編解碼、視頻轉碼、視頻格式轉換、視頻推流等功能
- ffserver - 命令行工具與ffmpeg配合,負責響應客户端的流媒體請求,把流媒體數據發送給客户端
- ffprobe - 命令行工具用來查看多媒體文件的描述信息
ffmpeg環境變量配置
在ffmpeg及其依賴環境編譯完成後,還需要讓系統能夠找到對應的安裝位置。打開/etc/profile配置文件,在該文件底部添加各組件的環境變量
# FFMPEG
export PATH="$PATH:/usr/local/3rdparty/ffmpeg/bin/"
export LD_LIBRARY_PATH=/usr/local/3rdparty/ffmpeg/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/3rdparty/ffmpeg/lib/pkgconfig:$PKG_CONFIG_PATH
使用source /etc/profile命令刷新環境變量
source /etc/profile
使用ffmpeg -version命令打印版本號,這裏採用的ffmpeg是3.2.4版本
ffmpeg -version
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
在ffmpeg源碼路徑下,可以通過ldd命令查詢ffmpeg依賴的所有組件,若其中的某些組件無法找到,則需要對照本文查詢是否有依賴的組件未配置環境變量。類似的,也可通過ldd命令在對應的路徑下查詢x264等組件的依賴項。
ldd ffmpeg
linux-vdso.so.1 => (0x00007ffc24f84000)
libavdevice.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavdevice.so.57 (0x00007fc17da42000)
libavfilter.so.6 => /usr/local/3rdparty/ffmpeg/lib/libavfilter.so.6 (0x00007fc17d613000)
libavformat.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavformat.so.57 (0x00007fc17d1f3000)
libavcodec.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavcodec.so.57 (0x00007fc17bcbf000)
libpostproc.so.54 => /usr/local/3rdparty/ffmpeg/lib/libpostproc.so.54 (0x00007fc17baa3000)
libswresample.so.2 => /usr/local/3rdparty/ffmpeg/lib/libswresample.so.2 (0x00007fc17b887000)
libswscale.so.4 => /usr/local/3rdparty/ffmpeg/lib/libswscale.so.4 (0x00007fc17b5ff000)
libavutil.so.55 => /usr/local/3rdparty/ffmpeg/lib/libavutil.so.55 (0x00007fc17b385000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc17b07c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc17ae5f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc17aa95000)
libXv.so.1 => /usr/lib/x86_64-linux-gnu/libXv.so.1 (0x00007fc17a890000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fc17a556000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fc17a344000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fc17a122000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007fc179f1e000)
libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007fc179d16000)
libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007fc179b12000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007fc179812000)
libSDL2-2.0.so.0 => /usr/local/3rdparty/sdl2/lib/libSDL2-2.0.so.0 (0x00007fc1794df000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc1792c5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc1790c1000)
libx264.so.148 => /usr/local/3rdparty/x264/lib/libx264.so.148 (0x00007fc178d1b000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fc178af9000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc17dc5a000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fc1788f5000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fc1786ef000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc1784e7000)
// 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
// 公眾號:斷點實驗室
// 掃描二維碼,關注更多優質原創,內容包括:音視頻開發、圖像處理、網絡、
// Linux,Windows、Android、嵌入式開發等