上一篇博客“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 /
:返回到根目录:
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~
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
[选项] 压缩文件名.zipunzip
各选项的含义分别为:
-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 ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓