天天看點

FFmpeg學習(2) 源碼編譯, 環境配置(上)

作者:音視訊流媒體技術

FFmpeg學習(1)開篇

FFmpeg學習(2)源碼編譯,環境配置

上一篇部落格“FFmpeg學習(一)開篇” 中講解了FFmpeg的源碼下載下傳,以及簡單的介紹了FFmpeg是什麼,學習它的好處,本篇部落客要是針對FFmpeg源碼編譯,環境變量設定,常用指令進行講解。

1. 準備知識

1.1 linux基礎指令

由于FFmpeg的學習涉及到要在指令行下處理,如果連一下基本的shell指令都不會的話,後面的學習是很吃力的,是以這裡簡單介紹一下基本的shell指令

必備幾個指令如下:

  • ls 指令:列出目錄下的檔案(List files)
  • cd 指令:切換目錄(Change directory)
  • pwd 指令:以絕對路徑的方式顯示使用者目前工作目錄
  • mkdir 指令:建立目錄(Make directory )
  • cp 指令:複制檔案/目錄(Copy file)
  • rm 指令:删除N個檔案或整個目錄
  • sudo 指令:管理者權限運作指令
  • pkg-config指令:配置環境變量

1.1.1 cd:切換目錄

  • cd ~ 和 cd:傳回使用者目錄
FFmpeg學習(2) 源碼編譯, 環境配置(上)

cd .:停留在目前目錄

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • cd ..:傳回上一級目錄:

例如我們先跳轉到development目錄,然後再傳回上一級目錄

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • cd ../..:傳回上兩級目錄:

例如我們先跳轉到development/study 目錄,然後再傳回上兩級目錄

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • cd ../目錄A:先傳回進入此目錄之前所在的目錄,然後再進入指定的目錄A

下面示範一下 我們先進入development/study目錄,然後cd ../projects目錄

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • cd -:傳回進入此目錄之前所在的目錄 這個指令在我們來回切換兩個目錄時非常好用

上一步中我們先跳轉到development/study然後切換到了development/projects目錄,當我們輸入cd -指令時,會切換回到development/study目錄。如下圖所示:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

如果我們再輸入cd -指令時, 會切換回development/projects目錄:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

cd 路徑:進入指定目錄:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

cd /:傳回到根目錄:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】

【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.2 ls:列出目錄下的檔案 (List files)

ls:列出指定路徑下的所有檔案名、時間及讀寫權限(檔案詳細資訊)

  • ls -a:顯示所有檔案清單(含隐藏檔案“.”和“..”)
FFmpeg學習(2) 源碼編譯, 環境配置(上)

ls -A:顯示除隐藏檔案“.”和“..”以外的所有檔案清單

FFmpeg學習(2) 源碼編譯, 環境配置(上)

ls -l:以清單形式顯示檔案及檔案夾的詳細資訊

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • 如上圖從左至右:檔案類型、權限、數量、屬主、屬組、大小、修改/通路時間、檔案名)

1.1.3 mv:移動/重命名 檔案或目錄 (Move file)

文法:mv 源檔案 目标檔案

  • 目标檔案不是目錄,即重命名
FFmpeg學習(2) 源碼編譯, 環境配置(上)

單檔案移動(mv 移動前檔案 移動後檔案路徑)

FFmpeg學習(2) 源碼編譯, 環境配置(上)

多檔案移動,使用 -t(含檔案及檔案夾)

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.4 mkdir:建立目錄(Make directory )

  • 在目錄名前沒有加任何路徑名,則在目前目錄下建立
FFmpeg學習(2) 源碼編譯, 環境配置(上)

在目錄名前有一個已經存在的路徑,将會在該目錄下建立

FFmpeg學習(2) 源碼編譯, 環境配置(上)

建立多級目錄及多檔案夾,使用 -p(檔案夾之間用空格隔開) 若上層目錄沒找到,則會一并建立

FFmpeg學習(2) 源碼編譯, 環境配置(上)

建立帶權限的檔案夾,使用 -m 如果目錄不存在,建立失敗,此時需要使用 -p-m

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.5 cat:顯示檔案的内容 (Concatenate)

  • 輸出多個檔案内容
FFmpeg學習(2) 源碼編譯, 環境配置(上)

将2個檔案合并新檔案

FFmpeg學習(2) 源碼編譯, 環境配置(上)
注:若新檔案有内容,則原資料會被清空,是以需要小心操作
  • 将file1.txt追加到file2.txt的末尾(>> 表示将文本流追加到另一個檔案的末位)
FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.6 find:在指定目錄下查找檔案

文法為:find 目錄 參數

  • 單檔案比對
FFmpeg學習(2) 源碼編譯, 環境配置(上)

多檔案比對(目錄下以.txt結尾的檔案、含字母a的檔案) : 使用-o

FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • 查找除XX外的: **使用 "!" or "-not" **

例如,查找目前檔案夾下檔案名不含a

find ./ ! -name "*a*"            
FFmpeg學習(2) 源碼編譯, 環境配置(上)

查找目前目錄下 檔案不含a的資訊 使用-not

find ./ -maxdepth 1 -not -name "*a*"           
FFmpeg學習(2) 源碼編譯, 環境配置(上)

查找檔案,忽略大小寫 :使用 -i

FFmpeg學習(2) 源碼編譯, 環境配置(上)

隻查找某層目錄下含XX的檔案(夾):使用 mindepth 和 maxdepth “-maxdepth 1” :限制隻查找1層目錄深度,目前目錄即為1層 例如查找目前目錄下,含test的檔案及檔案夾

find ./ -maxdepth 1 -name "*test*"            
FFmpeg學習(2) 源碼編譯, 環境配置(上)
  • 查找空檔案(-empty)

隻列出目前目錄下的非隐藏空檔案

FFmpeg學習(2) 源碼編譯, 環境配置(上)

查找指定檔案類型的檔案 (-type) 查找指定目錄下的所有目錄 -type d

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.7 pwd:以絕對路徑的方式顯示使用者目前工作目錄

Print working directory

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.8 rm -參數:删除N個檔案或整個目錄

使用rm指令要格外小心。因為一旦删除了一個檔案,就無法再恢複。

建議用-i選項,删除時會有提示

FFmpeg學習(2) 源碼編譯, 環境配置(上)

rm -r(或rm -R):删除目前目錄下除隐含檔案外的所有檔案和子目錄 rm -(r)f:強制删除,f 可了解為force

結合find指令删除: find 目錄 -name "*file*" -exec rm -rf {} \; 文法解析 -exec 找到後執行指令 rm -rf {} 就是删除檔案 \; 指令 屬于格式要求的,沒有具體含義

find /app1/ -name "*test*" -exec rm -rf {} \;           

1.1.9 touch:建立新的空檔案

  • 建立單個檔案
FFmpeg學習(2) 源碼編譯, 環境配置(上)

批量建立檔案

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.10 cp:複制檔案/目錄(Copy file)

  • 預設情況下,cp指令不能複制目錄, 如果要複制目錄,則必須使用-R選項
FFmpeg學習(2) 源碼編譯, 環境配置(上)

注意點:

  1. 目标目錄存在,直接複制
  2. 目标目錄不存在,先自動建立目标目錄再複制源目錄
  • 複制檔案
FFmpeg學習(2) 源碼編譯, 環境配置(上)

複制檔案并重命名檔案

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.11 vi:修改檔案内容

先按鍵盤字母I,編輯内容後,儲存(按esc鍵後輸入:wq)

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.12 echo:建立/覆寫檔案

  • 若檔案不存在則建立檔案
FFmpeg學習(2) 源碼編譯, 環境配置(上)

若檔案存在,覆寫檔案原内容并重新輸入内容

FFmpeg學習(2) 源碼編譯, 環境配置(上)

使用 >>,向檔案追加内容,原内容不變

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.13 tar:檔案打包、解壓(Tape archive)

  • 檔案打包:tar -zcvf 打包名 檔案 例如:我們先進入到目前使用者的Downloads目錄下看看
FFmpeg學習(2) 源碼編譯, 環境配置(上)

現在我們要将紅框裡面的檔案壓縮成一個tar壓縮包

FFmpeg學習(2) 源碼編譯, 環境配置(上)

檔案解壓:tar -zxvf 檔案名

FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.13.1 zip unzip 指令

  • zip 指令 在mac上面我經常需要壓縮成zip包,指令如下:
zip -q -r -e -m -o '\user\someone\someDir\someFile.zip' '\users\someDir'           

下面來示範一下zip指令:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

上面的操作将env檔案夾壓縮成了env_temp.zip并且壓縮完成後删除了env檔案夾。

  • unzip 指令 文法:unzip [選項] 壓縮檔案名.zip

    unzip 各選項的含義分别為:

  1. -x 檔案清單 解壓縮檔案,但不包括指定的file檔案
  2. -v 檢視壓縮檔案目錄,但不解壓。
  3. -t 測試檔案有無損壞,但不解壓。
  4. -d 目錄 把壓縮檔案解到指定目錄下。
  5. -z 隻顯示壓縮檔案的注解。
  6. -n 不覆寫已經存在的檔案。
  7. -o 覆寫已存在的檔案且不要求使用者确認。
  8. -j 不重建文檔的目錄結構,把所有檔案解壓到同一目錄下

将壓縮檔案env_temp.zip在目前目錄下解壓縮。

unzip env_temp.zip           
FFmpeg學習(2) 源碼編譯, 環境配置(上)

将壓縮檔案env_temp.zip在指定目錄/tmp下解壓縮,如果已有相同的檔案存在,要求unzip指令不覆寫原先的檔案。

$ unzip -n env_temp.zip -d /tmp            
FFmpeg學習(2) 源碼編譯, 環境配置(上)

此外我們還可以隻檢視壓縮檔案目錄,但不解壓。

輸入指令:

$ unzip -v env_temp.zip            
FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.14 scp:遠端拷貝檔案(secure copy)

  • 将本地的檔案上傳到遠端伺服器上 相對路徑下,scp 檔案名 使用者名@ip:伺服器絕對路徑目錄 (分号後面無空格)
scp ffmpeg.tar.gz [email protected]:/app1/tools           

絕對路徑:

scp /app/software/tools/text.txt [email protected]:/app1/bak           

若是上傳目錄,需要使用 -r

scp -r /app/software/tools [email protected]:/app1/bak           
  • 将遠端伺服器上的檔案/目錄拷貝到本地

scp -r 使用者名@ip:伺服器絕對路徑目錄 絕對路徑本地目錄

scp -r [email protected]:/app1/tools   /app/software
scp [email protected]:/app1/tools/text.txt    /app/software/tools           

1.1.15 sudo: 管理者權限運作指令

  • 簡介:

sudo是linux系統管理指令,是允許系統管理者讓普通使用者執行一些或者全部的root指令的一個工具,如halt,reboot,su等等。這樣不僅減少了root使用者的登入 和管理時間,同樣也提高了安全性。sudo不是對shell的一個代替,它是面向每個指令的。

  • 特性:

(1) sudo能夠限制使用者隻在某台主機上運作某些指令。 (2)sudo提供了豐富的日志,詳細地記錄了每個使用者幹了什麼。它能夠将日志傳到中心主機或者日志伺服器。 (3)sudo使用時間戳檔案來執行類似的“檢票”系統。當使用者調用sudo并且輸入它的密碼時,使用者獲得了一張存活期為5分鐘的票(這個值可以在編譯的時候改變)。 (4) sudo的配置檔案是sudoers檔案,它允許系統管理者集中的管理使用者的使用權限和使用的主機。它所存放的位置預設是在/etc/sudoers,屬性必須為0440。

  • 指令原理:

sudo使一般使用者不需要知道超級使用者的密碼即可獲得權限。首先超級使用者将普通使用者的名字、可以執行的特定指令、按照哪種使用者或使用者組的身份執行等資訊,登記在特殊的檔案中(通常是/etc/sudoers),即完成對該使用者的授權(此時該使用者稱為“sudoer”);在一般使用者需要取得特殊權限時,其可在指令前加上“sudo”,此時sudo将會詢問該使用者自己的密碼(以确認終端機前的是該使用者本人),回答後系統即會将該指令的程序以超級使用者的權限運作。之後的一段時間内(預設為5分鐘,可在/etc/sudoers自定義),使用sudo不需要再次輸入密碼。

文法:

sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command

  • 參數:
FFmpeg學習(2) 源碼編譯, 環境配置(上)

1.1.16 pkg-config : 配置環境變量

  • pkgconfig有什麼用: 大家應該都知道用第三方庫,就少不了要使用到第三方的頭檔案和庫檔案。我們在編譯、連結的時候,必須要指定這些頭檔案和庫檔案的位置。 對于一個比較大第三方庫,其頭檔案和庫檔案的數量是比較多的。如果我們一個個手動地寫,那将是相當麻煩的。是以,pkg-config就應運而生了。pkg-config能夠把這些頭檔案和庫檔案的位置指出來,給編譯器使用。如果你的系統裝有gtk,可以嘗試一下下面的指令
FFmpeg學習(2) 源碼編譯, 環境配置(上)

gcc main.c pkg-config --cflags --libs gtk+-2.0 -o main 上面的編譯指令中,pkg-config --cflags --libs gtk+-2.0的作用就如前面所說的,把gtk的頭檔案路徑和庫檔案列出來,讓編譯去擷取。--cflags和--libs分别指定頭檔案和庫檔案。 Ps:指令中的`不是引号,而是數字1左邊那個鍵位的那個符号。 其實,pkg-config同其他指令一樣,有很多選項,不過我們一般隻會用到--libs和--cflags選項。更多的選項可以在這裡檢視。

  • 配置環境變量

首先要明确一點,因為pkg-config也隻是一個指令,是以不是你安裝了一個第三方的庫,pkg-config就能知道第三方庫的頭檔案和庫檔案所在的位置。pkg-config指令是通過查詢XXX.pc檔案而知道這些的。我們所需要做的是,寫一個屬于自己的庫的.pc檔案。 但pkg-config又是如何找到所需的.pc檔案呢?這就需要用到一個環境變量PKG_CONFIG_PATH了。這環境變量寫明.pc檔案的路徑,pkg-config指令會讀取這個環境變量的内容,這樣就知道pc檔案了。 對于Ubuntu系統,可以用root權限打開/etc/bash.bashrc檔案。在最後輸入下面的内容。

FFmpeg學習(2) 源碼編譯, 環境配置(上)

這樣,pkg-config就會去/usr/local/lib/pkgconfig目錄下,尋找.pc檔案了。如果不是Ubuntu系統,那就沒有/etc/bash.bashrc檔案,可以參考我的一篇博文,來找到一個合适的檔案,修改這個環境變量。輸入bash指令使得配置生效。 現在pkg-config能找到我們的.pc檔案。但如果有多個.pc檔案,那麼pkg-config又怎麼能正确找到我想要的那個呢?這就需要我們在使用pkg-config指令的時候去指定。比如$gcc main.c pkg-config --cflags --libs gtk+-2.0 -o main就指定了要查找的.pc檔案是gtk+-2.0.pc。又比如,有第三方庫OpenCV,而且其對應的pc檔案為opencv.pc,那麼我們在使用的時候,就要這樣寫pkg-config --cflags --libs opencv。這樣,pkg-config才會去找opencv.pc檔案。

  • *.pc檔案的編寫:

首先要明确一點,因為pkg-config也隻是一個指令,是以不是你安裝了一個第三方的庫,pkg-config就能知道第三方庫的頭檔案和庫檔案所在的位置。pkg-config指令是通過查詢XXX.pc檔案而知道這些的。我們所需要做的是,寫一個屬于自己的庫的.pc檔案。

如下展示hyperscan開源庫中的libhs.pc檔案的撰寫:

[root@localhost pkgconfig]# ls
libhs.pc
[root@localhost pkgconfig]# 
[root@localhost pkgconfig]# 
[root@localhost pkgconfig]# cat libhs.pc 
prefix=/usr/local
exec_prefix=/usr/local
libdir=/usr/local/lib
includedir=/usr/local/include

Name: libhs
Description: Intel(R) Hyperscan Library
Version: 4.5.0
Libs: -L${libdir} -lhs
Libs.private:  -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
Cflags: -I${includedir}/hs
[root@localhost pkgconfig]#           
  • 設定pkg-config的環境變量:

pkg-config又是如何找到所需的.pc檔案呢?這就需要用到一個環境變量PKG_CONFIG_PATH了。這環境變量寫明.pc檔案的路徑,pkg-config指令會讀取這個環境變量的内容,這樣就知道pc檔案了。

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig           

将環境變量增加到.bashrc腳本檔案中:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib64/pkgconfig
export PKG_CONFIG_PATH
 source .bashrc           

pkg-config的查詢結果:

[root@localhost pkgconfig]# pkg-config --cflags --libs libhs
 -I/usr/local/include/hs  -L/usr/local/lib -lhs  
 [root@localhost pkgconfig]#            

在腳本和編譯的指令行中使用pkg-config的查詢結果:

[root@localhost examples]# g++ -o simplegrep simplegrep.c $(pkg-config --cflags --libs libhs)     
[root@localhost examples]# 
[root@localhost examples]# echo $(pkg-config --cflags --libs libhs)
-I/usr/local/include/hs -L/usr/local/lib -lhs
[root@localhost examples]# ls
CMakeFiles           CMakeLists.txt  patbench.cc  README.md   simplegrep.c
cmake_install.cmake  Makefile        pcapscan.cc  simplegrep
[root@localhost examples]#           

1.2 Vim編輯器

Vim是從 vi 發展出來的一個文本編輯器。代碼補完、編譯及錯誤跳轉等友善程式設計的功能特别豐富,在程式員中被廣泛使用。 簡單的來說, vi 是老式的字處理器,不過功能已經很齊全了,但是還是有可以進步的地方。 vim 則可以說是程式開發者的一項很好用的工具。 連 vim 的官方網站 (www.vim.org) 自己也說 vim 是一個程式開發工具而不是文字處理軟體。

如果你熟練了Vim後,你的工作效率會大大提高,就像你學會了五筆去打漢字一樣。

下面有一種業界廣為流傳的vim鍵盤圖:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

基本上 vi/vim 共分為三種模式,分别是指令模式(Command mode),輸入模式(Insert mode)和底線指令模式(Last line mode)。 這三種模式的作用分别是:

  1. esc:切換到到指令模式
  2. i : 切換到輸入模式/編輯模式
  3. : :切換到底線指令模式 q 退出程式 w 儲存檔案 qi 強制退出

這三種模式之間的關系如下圖:

FFmpeg學習(2) 源碼編譯, 環境配置(上)

原文 FFmpeg學習(2) 源碼編譯, 環境配置

繼續閱讀