网站首页 > 技术教程 正文
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.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 root@30.108.65.136:/app1/tools
绝对路径:
scp /app/software/tools/text.txt root@30.108.65.136:/app1/bak
若是上传目录,需要使用 -r
scp -r /app/software/tools root@30.108.65.136:/app1/bak
- 将远程服务器上的文件/目录拷贝到本地
scp -r 用户名@ip:服务器绝对路径目录 绝对路径本地目录
scp -r root@30.108.65.136:/app1/tools /app/software
scp root@30.108.65.136:/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) 源码编译, 环境配置
猜你喜欢
- 2024-11-06 Qt音视频开发9-ffmpeg录像存储(nba比赛录像回放)
- 2024-11-06 音视频开源基础 - ffmpeg命令(ffmpeg音频处理)
- 2024-11-06 ffmpeg常用命令行集锦(ffmpeg 命令大全)
- 2024-11-06 音视频开发7. ffmpeg 几个重要结构体
- 2024-11-06 超详细的手把手下载安装FFmpeg整个过程,你学会了吗?
- 2024-11-06 FFmpeg硬解码(ffmpeg硬解码和直接使用cuda的区别)
- 2024-11-06 mPEG-Lys(MAL)-DBCO,甲氧基PEG赖氨酸马来酰亚胺二苯并环辛炔
- 2024-11-06 音视频流媒体高级开发(FFmpeg6.0/WebRTC/RTMP/RTSP/编码解码)
- 2024-11-06 FFmpeg在windows的安装、合并、切片、.m4s、.m3u8处理
- 2024-11-06 完美解决Linux环境编译ffmpeg库(linux编译环境配置)
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)