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:傳回使用者目錄
cd .:停留在目前目錄
- cd ..:傳回上一級目錄:
例如我們先跳轉到development目錄,然後再傳回上一級目錄
- cd ../..:傳回上兩級目錄:
例如我們先跳轉到development/study 目錄,然後再傳回上兩級目錄
- cd ../目錄A:先傳回進入此目錄之前所在的目錄,然後再進入指定的目錄A
下面示範一下 我們先進入development/study目錄,然後cd ../projects目錄
- cd -:傳回進入此目錄之前所在的目錄 這個指令在我們來回切換兩個目錄時非常好用
上一步中我們先跳轉到development/study然後切換到了development/projects目錄,當我們輸入cd -指令時,會切換回到development/study目錄。如下圖所示:
如果我們再輸入cd -指令時, 會切換回development/projects目錄:
cd 路徑:進入指定目錄:
cd /:傳回到根目錄:
相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】
【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~
1.1.2 ls:列出目錄下的檔案 (List files)
ls:列出指定路徑下的所有檔案名、時間及讀寫權限(檔案詳細資訊)
- ls -a:顯示所有檔案清單(含隐藏檔案“.”和“..”)
ls -A:顯示除隐藏檔案“.”和“..”以外的所有檔案清單
ls -l:以清單形式顯示檔案及檔案夾的詳細資訊
- 如上圖從左至右:檔案類型、權限、數量、屬主、屬組、大小、修改/通路時間、檔案名)
1.1.3 mv:移動/重命名 檔案或目錄 (Move file)
文法:mv 源檔案 目标檔案
- 目标檔案不是目錄,即重命名
單檔案移動(mv 移動前檔案 移動後檔案路徑)
多檔案移動,使用 -t(含檔案及檔案夾)
1.1.4 mkdir:建立目錄(Make directory )
- 在目錄名前沒有加任何路徑名,則在目前目錄下建立
在目錄名前有一個已經存在的路徑,将會在該目錄下建立
建立多級目錄及多檔案夾,使用 -p(檔案夾之間用空格隔開) 若上層目錄沒找到,則會一并建立
建立帶權限的檔案夾,使用 -m 如果目錄不存在,建立失敗,此時需要使用 -p-m
1.1.5 cat:顯示檔案的内容 (Concatenate)
- 輸出多個檔案内容
将2個檔案合并新檔案
注:若新檔案有内容,則原資料會被清空,是以需要小心操作
- 将file1.txt追加到file2.txt的末尾(>> 表示将文本流追加到另一個檔案的末位)
1.1.6 find:在指定目錄下查找檔案
文法為:find 目錄 參數
- 單檔案比對
多檔案比對(目錄下以.txt結尾的檔案、含字母a的檔案) : 使用-o
- 查找除XX外的: **使用 "!" or "-not" **
例如,查找目前檔案夾下檔案名不含a
find ./ ! -name "*a*"
查找目前目錄下 檔案不含a的資訊 使用-not
find ./ -maxdepth 1 -not -name "*a*"
查找檔案,忽略大小寫 :使用 -i
隻查找某層目錄下含XX的檔案(夾):使用 mindepth 和 maxdepth “-maxdepth 1” :限制隻查找1層目錄深度,目前目錄即為1層 例如查找目前目錄下,含test的檔案及檔案夾
find ./ -maxdepth 1 -name "*test*"
- 查找空檔案(-empty)
隻列出目前目錄下的非隐藏空檔案
查找指定檔案類型的檔案 (-type) 查找指定目錄下的所有目錄 -type d
1.1.7 pwd:以絕對路徑的方式顯示使用者目前工作目錄
Print working directory
1.1.8 rm -參數:删除N個檔案或整個目錄
使用rm指令要格外小心。因為一旦删除了一個檔案,就無法再恢複。
建議用-i選項,删除時會有提示
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:建立新的空檔案
- 建立單個檔案
批量建立檔案
1.1.10 cp:複制檔案/目錄(Copy file)
- 預設情況下,cp指令不能複制目錄, 如果要複制目錄,則必須使用-R選項
注意點:
- 目标目錄存在,直接複制
- 目标目錄不存在,先自動建立目标目錄再複制源目錄
- 複制檔案
複制檔案并重命名檔案
1.1.11 vi:修改檔案内容
先按鍵盤字母I,編輯内容後,儲存(按esc鍵後輸入:wq)
1.1.12 echo:建立/覆寫檔案
- 若檔案不存在則建立檔案
若檔案存在,覆寫檔案原内容并重新輸入内容
使用 >>,向檔案追加内容,原内容不變
1.1.13 tar:檔案打包、解壓(Tape archive)
- 檔案打包:tar -zcvf 打包名 檔案 例如:我們先進入到目前使用者的Downloads目錄下看看
現在我們要将紅框裡面的檔案壓縮成一個tar壓縮包
檔案解壓:tar -zxvf 檔案名
1.1.13.1 zip unzip 指令
- zip 指令 在mac上面我經常需要壓縮成zip包,指令如下:
zip -q -r -e -m -o '\user\someone\someDir\someFile.zip' '\users\someDir'
下面來示範一下zip指令:
上面的操作将env檔案夾壓縮成了env_temp.zip并且壓縮完成後删除了env檔案夾。
-
unzip 指令 文法:unzip [選項] 壓縮檔案名.zip
unzip 各選項的含義分别為:
- -x 檔案清單 解壓縮檔案,但不包括指定的file檔案
- -v 檢視壓縮檔案目錄,但不解壓。
- -t 測試檔案有無損壞,但不解壓。
- -d 目錄 把壓縮檔案解到指定目錄下。
- -z 隻顯示壓縮檔案的注解。
- -n 不覆寫已經存在的檔案。
- -o 覆寫已存在的檔案且不要求使用者确認。
- -j 不重建文檔的目錄結構,把所有檔案解壓到同一目錄下
将壓縮檔案env_temp.zip在目前目錄下解壓縮。
unzip env_temp.zip
将壓縮檔案env_temp.zip在指定目錄/tmp下解壓縮,如果已有相同的檔案存在,要求unzip指令不覆寫原先的檔案。
$ unzip -n env_temp.zip -d /tmp
此外我們還可以隻檢視壓縮檔案目錄,但不解壓。
輸入指令:
$ unzip -v env_temp.zip
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
- 參數:
1.1.16 pkg-config : 配置環境變量
- pkgconfig有什麼用: 大家應該都知道用第三方庫,就少不了要使用到第三方的頭檔案和庫檔案。我們在編譯、連結的時候,必須要指定這些頭檔案和庫檔案的位置。 對于一個比較大第三方庫,其頭檔案和庫檔案的數量是比較多的。如果我們一個個手動地寫,那将是相當麻煩的。是以,pkg-config就應運而生了。pkg-config能夠把這些頭檔案和庫檔案的位置指出來,給編譯器使用。如果你的系統裝有gtk,可以嘗試一下下面的指令
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檔案。在最後輸入下面的内容。
這樣,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鍵盤圖:
基本上 vi/vim 共分為三種模式,分别是指令模式(Command mode),輸入模式(Insert mode)和底線指令模式(Last line mode)。 這三種模式的作用分别是:
- esc:切換到到指令模式
- i : 切換到輸入模式/編輯模式
- : :切換到底線指令模式 q 退出程式 w 儲存檔案 qi 強制退出
這三種模式之間的關系如下圖:
原文 FFmpeg學習(2) 源碼編譯, 環境配置