天天看點

FFmpeg項目初探學習筆記

FFmpeg是廣泛使用于的多媒體解決方案,是一個自由軟體項目的名稱,采用LGPL或GPL許可證。它提供了錄制/轉換以及流化音視訊的完整解決方案。包含非常先進的音頻/視訊編解碼庫libavcodec。為了保證高可移植性和編解碼品質,libavcodec裡很多代碼都是新開發的。“FFmpeg”這個詞中的“FF”指的是“Fast Forward”,而“mpeg”指的是一種壓縮率比較大的活動圖像和聲音的壓縮标準。

一.FFmpeg簡介:

指令行工具概述(Command Line Tool Documentation):

ffmpeg -i input.avi -r 24 output.avi
           

以上可以把input.avi中的幀率變成24,輸出的output.avi就是24fps的視訊。

  • ffmpeg:包含FFmpeg的各種功能,如gif/格式轉換/截圖/編解碼等;
  • ffmpeg-all:包含FFmpeg工具及FFmpeg元件;
  • ffplay:一個使用FFmpeg和SDL庫的/簡單的/可移植性的媒體播放器。
  • ffplay-all:包含ffplay工具及FFmpeg元件;
  • ffporbe:用來檢視多媒體檔案的資訊;
  • ffporbe-all:包含ffprobe工具及FFmpeg元件;
  • ffserver:與流媒體伺服器相關,負責響應用戶端的流媒體請求,把流媒體資料發送給用戶端;
  • ffserver-all:包含ffserver工具及FFmpeg元件。

元件概述(Componets Documentation):

  • Utilities:libavutils提供的通用的features及工具;
  • Video scaling and pixel format converter:視訊縮放和縮放像素格式轉換器;
  • Audio resampler:音頻重新取樣;
  • Encoders and decoder(codecs):編碼和解碼;
  • Bitstream filters:碼流過濾器;
  • Muxers and demuxers(formats):資料合成及資料分離;
  • Protocols:協定;
  • Input and output devices:輸入和輸出裝置;
  • Filters:過濾器。

類庫概述(Libraries Documentation):

  • libavutil:包含一些公共的工具函數的使用庫,包含算術運算/字元操作等;
  • libswscale:(原始視訊格式轉換)用于視訊場景比例縮放/色彩映射轉換/圖像顔色空間或格式轉換,如RGB565/RGB888等與YUV420等之間的轉換;
  • libswresample:原始音頻格式轉碼;
  • libavcodec:用于各種類型聲音/圖像編解碼,該庫是音視訊編解碼核心庫,實作了市面上可見絕大部分編解碼器的功能;
  • libavformat:用于各種類型音視訊封裝格式的生成和解析,包含擷取解碼核心庫所需資訊以生成解碼上下文結構和讀取音視訊幀的功能,音視訊的格式解析協定,為libavcodec分析碼流提供獨立的音頻或視訊碼流源;
  • libavdevice:硬體采集/加速/顯示。操作計算機中常用的音視訊捕捉或輸出裝置有ALSA/AUDIO_BEOS/JACK/OSS/1394/VFW等;
  • libfilter:filter(FileIO/FPS/DrawText)音視訊鋁箔器的開發,如寬高比/裁剪/格式化/非格式化/伸縮等。

二.FFmpeg源碼目錄結構:

對照FFmpeg-3.1.3補充如下兩個庫:

  • libavresample:音視訊封裝編解碼格式預設等;
  • libpostproc:(同步/時間計算的簡單算法)用于後期效果處理,音視訊應用的後處理,如圖像的去塊效應。

檔案概述(General Documentation):

  • Frequently Asked Questions:常見問題;
  • Supported External Libraries,Formats ,Codecs or Features:支援擴充庫/格式/編解碼或特性;
  • Platform Specific Information:平台具體資訊;
  • Developer Documentation:開發者概述;
  • Git How-To:Git;
  • FFmpeg Automated Testing Environment:FFmpeg自動化測試環境。

三.在Mac OS下編譯FFmpeg(摘自何俊林android音視訊開發一書):

下載下傳源碼及配置環境變量:

FFmpeg下載下傳位址,選擇Mac OS下載下傳。解壓後如下圖

FFmpeg項目初探學習筆記

下載下傳NDK安裝包,并配置NDK環境:

  • 啟動終端Terminal;
  • 進入目前使用者的home目錄(輸入cd ~ 或/User/YourUserName);
  • 建立.bash_profile檔案(輸入touch .bash_profile);
  • 編輯.bash_profile檔案(輸入open -e .bash_profile);
FFmpeg項目初探學習筆記
  • 在.bash_profile中配置NDK及SDK的開發環境,需要輸入Mac OS下的NDK的目錄:
FFmpeg項目初探學習筆記
  • 儲存檔案,關閉 .bash_profile。更新剛配置的環境變量,輸入source.basd_profile。并檢視剛剛配置設定的環境變量,離開編輯器後在終端輸入$PATH并按下Enter鍵來确定是否編輯成功,成功之後配置檔案内容如下:
FFmpeg項目初探學習筆記
  • 進入終端NDK下的sample目錄,輸入cd hello-jni/指令,按下enter鍵然後執行ndk-build指令。

開始編譯FFmpeg:

  • 修改FFmpeg的configure檔案,由于編譯出來的動态庫檔案的版本号在.so之後(如libavcodec.so.5.100.1),而Android平台不能識别這樣的檔案名字,是以需修改檔案名,在configure替換如下内容:
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF).$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
           
  • 編寫shell腳本,拷貝ffmpeg下名為version.sh的shell腳本,複制為名為build_android.sh:

如執行./build_android.sh時出現-bash ./build_android.sh:Permission denied則是改shell檔案權限未開,則需要開讀寫權限"chmod a+x build_android.sh",如出現“-bash: ./build_android.sh: /bin/bash^M: bad interpreter: No such file or directory”則是文本格式要修改,vim build_android.sh編輯"set ff=unix"。