ffmpeg configure 研究1-命令行参数的分析
author: hjjdebug
date: 2025年 02月 14日 星期五 17:16:12 CST
description: ffmpeg configure 研究1
./configure 命令行参数的分析
文章目录
- 1 configure 对命令行参数的分析,在4019行
- 1.1 函数名称: is_in
- 1.2. 函数名称: enable
- 1.3. 函数名称: set_all
- 2 执行退出判断的关键代码:
- 2.1. 函数名称: map
- 2.2 函数名称: die_license_disabled
- 2.3 函数名称 enabled()
- 3. 小测试代码
- 4.执行结果 $ ./1.sh
- 5.小结:
- 小结1: 命令行参数分析过程概括.
- 小结2: bash脚本的本质是什么?
详细分析了 ffmpeg 下执行
./configure --enable-libx264
libx264 is gpl and --enable-gpl is not specified.
程序退出的过程
如果说在命令行上有 --enable-libx264 而没有 --enable-gpl 就退出,
用c 写也就寥寥几句,
libx264_enable=false,gpl_enable=fale;
for(int i=0;i<argc;i++)
{
if(strcmp(arg[i],“–enable-libx264”)0) libx264_enable=true;
if(strcmp(arg[i],“–enable-gpl”)0) gpl_enable=true;
}
if(libx264_enabletrue && gpl_enablefalse) exit(1)
如果用bash 又应该怎么写呢?
如果只是实现上边的功能,bash 也可以写的很简单, 但在configure 文件中就不是那样写了.
而是有一个复杂的架构,
为什么?因为它要支持一些复杂的功能.
所以该博客就是来了解这个简单的功能是如何在复杂的架构上实现的.
让我们能窥斑见豹. 别被它庞大的架构吓唬注了.
这些是bash编程最基本的东西, 就从此开始吧.
1 configure 对命令行参数的分析,在4019行
for opt do
因为 opt 后面没有 in 参数, 实际上就是 in “ @ " , 代码处于顶层 , @",代码处于顶层, @",代码处于顶层,@就是命令行参数,此时
$opt = --enable-libx264
case 语句会匹配到4087行
–enable-?|–disable-?)
eval ( e c h o " (echo " (echo"opt” | sed ‘s/–/action=/;s/-/ option=/;s/-/_/g’)
if is_in $option $COMPONENT_LIST; then
test $action = disable && action=unset
eval $action $$(toupper ${option%s})_LIST
elif is_in $option $CMDLINE_SELECT; then
$action $option
else
die_unknown $opt
fi
bash 在每次执行命令前要进行8大变换. 其是也是很简单的.
大括号扩展 {} , 把形如 {1…5} 扩展为 1 2 3 4 5
波浪线扩展 ~ , 把~扩展为你的家目录
变量扩展 , 简单方式就是 {} , 简单方式就是 ,简单方式就是var样式, 就是变量引用和变量替换
算术扩展 $(()) , 数学运算在这里进行
命令替换 $()或 ``, 这里可以调用命令,先执行命令
分词分割 IFS , 按照空格,tab,回车来分割成单词
路径扩展 * ? [] , 把*展开匹配任意字符,?匹配0或1个字符,[]匹配指定字符
引号去除 , 去除其中的双引号,单引号
把该行信息都收拾一遍叫扫描,然后再交给bash去执行命令,
eval ( e c h o " (echo " (echo"opt" | sed ‘s/–/action=/;s/-/ option=/;s/-//g’)
eval 语句会进行2次扫描. 即扩展了一遍还要再扩展一遍,所以有$$(…)之类的写法
执行第一遍扫描,进行变量扩展
eval $(echo --enable-libx264 | sed 's/–/action=/;s/-/ option=/;s/-//g’)
,进行命令替换
eval action=enable option=libx264
运行eval命令,执行第二遍扫描,(此例第一遍已经扩展干净了,第二遍没有要改变的.)
action=enable option=libx264
这条语句交给bash执行,就是定义了2个变量,并赋值.
elif is_in $option $CMDLINE_SELECT; then
$action o p t i o n l i b x 264 在 option libx264 在 optionlibx264在CMDLINE_SELECT 中被发现,会执行 enable libx264 函数
1.1 函数名称: is_in
输入参数: 列表
输出参数:
返回值: 0(成功), 1(失败,假)
描述: 把第一个参数作为值, 依次与后续参数做比较,如果想等,返回成功,全部不成功,返回失败.
is_in(){
value=$1 # 第一个参数为value
shift
for var in KaTeX parse error: Expected 'EOF', got '#' at position 7: *; do #̲ 后续参数与value相比
[ $var = KaTeX parse error: Expected 'EOF', got '&' at position 9: value ] &̲& return 0 # 相同…value被扩展为libx264, $CMDLINE_SELECT 被扩展为一堆字符串, 其中包含libx264, 所以其返回为成功.
$action $option 被扩展为:
enable libx264
1.2. 函数名称: enable
输入参数: 列表
输出参数: 无
返回值: 无
描述: 把参数都做为变量,其值设置为"yes"
enable(){
set_all yes $*
}
执行结果, 把libx264 设置为了 yes, 等价与 libx264=yes
1.3. 函数名称: set_all
输入参数: 列表
输出参数: 无
返回值: 无
描述: 把第一个参数作为value, 其余的参数都作为变量用$value赋值
set_all(){
value=$1 # 第一个参数为value,
shift # 移除第一个参数
for var in $*; do
eval v a r = var= var=value # 其余参数都设置为$value
done
}
注意: 调试时打印pr value 是没有意义的, pr $value才是对变量的引用.
2 执行退出判断的关键代码:
map “die_license_disabled gpl” $EXTERNAL_LIBRARY_GPL_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
$EXTERNAL_LIBRARY_GPL_LIST 变量在1721行有定义,包括libx264,libx265及其它模块
该语句功能. 检查一系列模块,如果enable 了模块而没有enable gpl, 就退出.
2.1. 函数名称: map
输入参数: 列表
输出参数: 无
描述: 把第一个参数作为命令, 后续参数依次作为$v参数,来执行第一条命令
map(){
m=$1 # 把die_license_disabled gpl 赋值给m
shift
for v; do eval $m; done # 把后面的参数依次送给v, 执行 $m,即执行die_license_disabled gpl 函数
}
2.2 函数名称: die_license_disabled
输入参数: 函数调用参数 1 , 全局参数 1, 全局参数 1,全局参数v
输出参数: 无
功能描述: 判断第1个参数(对应“gpl”,“nonfree”)是否enabled,如果已经enabled,则正常退出;
否则判断$v 参数是否 enabled, 如果为真则打印错误信息并退出(die 函数)
注意: 不满足条件时会退出程序.
die_license_disabled() {
enabled $1 || { enabled KaTeX parse error: Expected 'EOF', got '&' at position 3: v &̲& die "v is $1 and --enable-$1 is not specified."; }
}
命令可以作为map 的第一个参数. 该命令接受的参数是$1 和 $v
2.3 函数名称 enabled()
输入参数: 一个参数
输出参数: 无
返回值: 0或1
描述: 对参数$1 判断其值是否是"yes"
enabled(){
test “${1#!}” = “$1” && op=“=” || op=“!=” # 该句设置op为等号或不等号
eval test “x$${1#!}” $op “xyes” # 运行test返回真值或假值.
}
${1#!}是$1变量去除从开始到!止部分,$1无!则不会去除任何东西.
3. 小测试代码
为了对enabled() 函数,die() 及颜色设置有更深入理解,我写了如下测试函数
$ cat 1.sh
#!/bin/bash
enabled(){test "${1#!}" = "$1" && op="=" || op="!=" # 根据第一个参数是否首字符为!为op赋值=或者!=eval test "x\$${1#!}" $op "xyes" # 测试变量的值是否为yes
}
if test -t 1 && which tput >/dev/null 2>&1; thenncolors=$(tput colors)if test -n "$ncolors" && test $ncolors -ge 8; thenbold_color=$(tput bold)warn_color=$(tput setaf 3) # 设置前景色为黄(3)error_color=$(tput setaf 1) # 设置前景色为红(1) , set attr foregroudreset_color=$(tput sgr0) # 恢复颜色, set groud 0fi# 72 used instead of 80 since that's the default of prncols=$(tput cols)
fi
: ${ncols:=72} # :就是空操作, 退出总是成功 ${var:=}, 如果ncols 没有值,就给72,否则保持不变logfile="1.log"
log(){echo "$@" >> $logfile
}
die(){log "$@"echo "$error_color$bold_color$@$reset_color" # 设置红色,加重的颜色,显示$@ 然后颜色再恢复
}abc=yes
enabled abc && echo "abc enabled" || echo "abc not enabled"
enabled abb && echo "abb enabled" || echo "abb not enabled"die "I hope this is red"
4.执行结果 $ ./1.sh
abc enabled
abb not enabled
I hope this is red
5.小结:
小结1: 命令行参数分析过程概括.
对于 --enable-libx64 参数而言,它是一个动词-名词的结构,首先用sed将它分为2部分.
把动词作为函数,把名字作为参数执行函数, 实现把名词作为变量进行赋值.
命令行参数分析完后, 对变量进行数值判断,不满足条件则退出程序.
小结2: bash脚本的本质是什么?
bash脚本命令. 就是一个命令的集合体.
命令就是你在控制台下与机器交互输入的命令
你在命令行下所做的操作, 用bash脚本都可以完成.
命令是带参数的.
参数是可以用变量来存储的.
参数经过8大扩展再传递给命令
引入变量和函数可以简化人机的接口,使少敲几个字符就给计算机说明白了.
函数也是由命令集合来构成,支持参数传递,为完成特定功能而编写.
变量和函数的灵活性也增加了代码的复杂性.
所以bash脚本就是不断的执行预定的命令. 不用你在控制台下手敲了.
常在bash下工作的人, 用脚本编程简化维护等工作也是很自然的了.
相关文章:
ffmpeg configure 研究1-命令行参数的分析
author: hjjdebug date: 2025年 02月 14日 星期五 17:16:12 CST description: ffmpeg configure 研究1 ./configure 命令行参数的分析 文章目录 1 configure 对命令行参数的分析,在4019行1.1 函数名称: is_in1.2. 函数名称: enable1.3. 函数名称: set_all 2 执行退出判断的关键…...
数据结构与算法之排序算法-归并排序
排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来: …...
高血压危险因素分析(项目分享)
高血压危险因素分析(项目分享) 高血压作为一种极为常见的慢性疾病,正严重威胁着大众健康。它的发病机制较为复杂,涉及多个方面的因素。 在一份临床采集的数据的基础上,我们通过数据分析手段深入观察一下 BMI…...
java集合框架之Map系列
前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的,使用数组和链表(或红黑树)的结构。在Java 8之后,当链表长度超过阈值时会转换为红黑树,以提高查询效率。哈希冲突通过链地址法解决。需要明确的是ÿ…...
android设置添加设备QR码信息
摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...
Python实现微博关键词爬虫
1.背景介绍 随着社交媒体的广泛应用,微博上的海量数据成为了很多研究和分析的重要信息源。为了方便获取微博的相关内容,本文将介绍如何使用Python编写一个简单的爬虫脚本,从微博中抓取指定关键词的相关数据,并将这些数据保存为Ex…...
linux概念详解
用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...
【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类…...
AMESim中批处理功能的应用
AMESim 软件的批处理功能是一项能显著提高仿真效率和灵活性的功能,以下是其介绍与应用说明: 一 功能介绍 参数扫描功能:用户可以指定模型中一个或多个参数的取值范围和步长,批处理功能会自动遍历这些参数组合,进行多…...
《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean),与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...
E卷-特殊的加密算法-(200分)
专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...
QT 异步编程之多线程
一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…...
K-均值(K-means)
K-均值(K-means)是一种常用的无监督学习算法,用于将数据集中的样本分成 K 个簇。该算法的过程大致如下: 1. 随机初始化 K 个聚类中心(centroid)。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
微软AutoGen高级功能——Selector Group Chat
介绍 大家好,这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊),"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客,但是并没有详…...
w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...
深度求索—DeepSeek API的简单调用(Java)
DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…...
flv实时监控视频
文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时,可能需要在大屏上展示一个监控画面,此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
