1、ffmpeg的認識與安裝

1、ffmpeg的認識與安裝

初識ffmpeg(一)

1、什麼是FFmpeg

  • FFmpeg是一套能夠用來記錄和轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。採用LGPL或GPL許可證。
    它提供了錄製、轉換以及流化音視頻的完整解決方案。其軟件內部包含了很是先進的音頻/視頻編解碼庫libavcodec,

  • 爲了保證高可移植性和編解碼質量,libavcodec裏不少code都是從頭開發的。

  • FFmpeg在Linux平臺下開發,但它一樣也能夠在其它操做系統環境中編譯運行,包括Windows、Mac OS X等。

存在問題:ffmpeg與mpeg、H264等編碼格式是什麼關係?
問題解析:FFmpeg是一套用於處理各種編碼音視頻編碼格式的計算機軟件,其中固然也包括了mpeg、H264這兩種編碼格式的軟件。html

2、編解碼的基本概念

一、編解碼器(CODEC):可以進行視頻和音頻壓縮(CO)與解壓縮(DEC),是視頻編解碼的核心部分。linux


二、容器/多媒體文件(Container/File):沒有了解視頻的編解碼以前,老是錯誤的認爲日常下載的電影的文件的後綴(avi,mkv,rmvb等)就是視頻的編碼方式。事實上,剛纔提到的幾種文件的後綴並非視頻的編碼方式,只是其封裝的方式。一個視頻文件一般有視頻數據、音頻數據以及字幕等,封裝的格式決定這些數據在文件中是如何的存放的,封裝在一塊兒音頻、視頻等數據組成的多媒體文件,也能夠叫作容器(其中包含了視音頻數據)。因此,只看多媒體文件的後綴名是難以知道視音頻的編碼方式的。windows


三、流數據 Stream,例如視頻流(Video Stream),音頻流(Audio Stream)。流中的數據元素被稱爲幀Frame服務器

3、FFmpeg的組成

一、libavformat:用於各類音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;網絡


二、libavcodec:用於各類類型聲音/圖像編解碼;ide


三、libavutil:包含一些公共的工具函數;函數


四、libswscale:用於視頻場景比例縮放、色彩映射轉換;工具


五、libpostproc:用於後期效果處理;post


六、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼;測試


七、ffsever:是一個HTTP多媒體實時廣播流服務器,支持時光平移;


八、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,經過SDL顯示;

4、ffmpeg源碼獲取與編譯

4.一、Windows篇

ffmpeg的官方網站是:http://ffmpeg.zeranoe.com/builds/

FFMPEG分爲3個版本:Static,Shared,Dev。其中 Static 顧名思義就是靜態庫版本了。Shared則是動態庫版本。Dev則是提供給開發者用的Lib文件。

注:FFMPEG最新版已是3了,不過咱們用的仍是2.5的,固然也能夠用其餘的,如2.8。基本上版本2的API都是沒差的,所以對開發沒有影響。

版本區別:

  • Static裏面只有3個應用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每一個exe的體積都很大,相關的Dll已經被編譯到exe裏面去了。

  • Shared裏面除了3個應用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe以外,還有一些Dll,Shared版本的exe體積很小,他們在運行的時候,需相應的Dll。

  • Dev版本:是用於開發的,裏面包含了庫文件xxx.lib以及頭文件xxx.h,這個版本不包含exe文件。

  • 備註:應用程序在開發期間須要用到dev版本下的lib庫,應用程序編譯後執行期間須要shared中的dll庫文件的支持

  • windows下安裝:http://www.javashuo.com/article/p-phbvguhb-bx.html

4.二、Linux篇

4.2.一、PC版本FFmpeg交叉編譯

//yasm是彙編編譯器,由於ffmpeg中爲了提升效率用到了彙編指令,因此須要先安裝。
一、sudo apt-get install yasm
或者
tar -xvf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure
make
make install

//二、安裝編碼庫x264和x265庫
H.264是ITU(International Telecommunication Union,國際通訊聯盟)和MPEG(Motion Picture Experts Group,運動圖像專家組)聯合制定的視頻編碼標準。而x264是一個開源的H.264/MPEG-4 AVC**視頻編碼函數庫,是最好的有損視頻編碼器。一樣的片源、碼率一、編碼器默認設置下,用x264編碼的視頻(通常是mkv或mp4格式)必定會比rmvb畫質更好。x264是一種編碼方式。
x265是一個用於編碼,符合高效率視頻編碼(HEVC/H.265)標準的視頻開源自由軟件及函數庫。
由上可知,x264和x265庫主要是用來給視頻編碼的,`而博主暫時的工做只是接收網絡流,而後解碼處理,因此就不添加x264和x265庫的須要了!`

//三、安裝音頻庫以及相關文件
SDL(Simple DirectMdeia Layer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言寫成。SDL提供了數種控制圖像、
聲音、輸入輸出的函數,讓開發者只要用相同或是類似的代碼就能夠開發出跨多個平臺的應用軟件。

3.一、sudo apt-get install libasound2-dev

3.二、unzip SDL2-2.0.5.zip
cd SDL2-2.0.5/
./autogen.sh
./configure --prefix=/usr/local/
make
sudo make install

//四、安裝FFMPEG //PC下安裝直接指定目錄,其它大部分採用默認
./configure 
--prefix=/usr/local/lib/ffmpeg3.3.2_pc \
--enable-shared \
--disable-static \
--enable-ffplay  #enable-ffplay   //若是沒有安裝上述音頻庫,即便加上了該選項也不能生成ffplay 可執行程序
make
make install

二、ffmpeg使用
./ffmpeg    //若出錯找不到(libavdevice.so.57)這個動態庫。 
ldd ffmpeg  //來查看運行當前可執行文件須要哪些動態庫
使用find或者locate能夠在/xxx/ubu_ffmpeg/lib中找到這個動態庫,連接到/etc/ld.so.conf便可,具體過程:
sudo vi /etc/ld.so.conf.d
/xxx/ubu_ffmpeg/lib //在conf文件中加入以下
sudo ldconfig  //最後執行生效

或者在profie中添加環境變量
export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH




//測試使用:
//ffmpeg是用於轉碼的應用程序。 
//ffplay是用於播放的應用程序。 
//ffprobe是用於查看文件格式的應用程序。
./ffmpeg -version
ffplay test.avi
ffmpeg -i input.avi output.ts
ffprobe test.avi

4.2.2.一、編譯腳本

#!/bin/sh
./configure \
 --prefix=/usr/local/arm/ffmpeg-2.5.11 \
 --enable-shared \
 --enable-cross-compile \
 --cross-prefix=/work/fsl-linaro-toolchain-2.13/bin/arm-linux- \
 --arch=arm \
 --target-os=linux \
 --enable-gpl \
 --enable-pthreads \
 --disable-stripping \
 --disable-ffplay

4.2.2.二、可能出錯問題

//出錯問題1:
../libavutil/libm.h:62: error: static declaration of 'lrint' follows non-static declaration  
../libavutil/libm.h:69: error: static declaration of 'lrintf' follows non-static declaration  
//解決辦法:ffmpeg/libavutil/libm.h 裏的全部static方法全都註釋掉

//出錯問題2:lrint、lrintf、round、roundf錯誤
//解決辦法:在config.h搜索lrint、lrintf、round、roundf等對於的字符
#define HAVE_LLRINT 1  
#define HAVE_LLRINTF 1  
#define HAVE_LRINT 1  
#define HAVE_LRINTF 1  
#define HAVE_ROUND 1  
#define HAVE_ROUNDF 1

6、ffmpeg、ffplay、ffprobe基本用法

http://www.javashuo.com/article/p-pxnlxyck-cs.html //good
https://blog.csdn.net/kaikai136412162/article/details/80746961
https://blog.csdn.net/kangweijian/article/details/54906514
http://www.javashuo.com/article/p-oklzdmuo-bk.html
http://www.javashuo.com/article/p-fwzewpax-dy.html
http://www.javashuo.com/article/p-dxveknln-gn.html

相關文章
相關標籤/搜索