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:返回用户目录

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. 目标目录存在,直接复制
  2. 目标目录不存在,先自动创建目标目录再复制源目录
  • 复制文件

复制文件并重命名文件

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 各选项的含义分别为:
  1. -x 文件列表 解压缩文件,但不包括指定的file文件
  2. -v 查看压缩文件目录,但不解压。
  3. -t 测试文件有无损坏,但不解压。
  4. -d 目录 把压缩文件解到指定目录下。
  5. -z 只显示压缩文件的注解。
  6. -n 不覆盖已经存在的文件。
  7. -o 覆盖已存在的文件且不要求用户确认。
  8. -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)。 这三种模式的作用分别是:

  1. esc:切换到到命令模式
  2. i : 切换到输入模式/编辑模式
  3. : :切换到底线命令模式 q 退出程序 w 保存文件 qi 强制退出


这三种模式之间的关系如下图:
 

原文 FFmpeg学习(2) 源码编译, 环境配置(上)

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/131263045