当前位置: 首页 > news >正文

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_enable
true && gpl_enable
false) 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 在 optionlibx264CMDLINE_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 执行退出判断的关键…...

数据结构与算法之排序算法-归并排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; …...

高血压危险因素分析(项目分享)

高血压危险因素分析&#xff08;项目分享&#xff09; 高血压作为一种极为常见的慢性疾病&#xff0c;正严重威胁着大众健康。它的发病机制较为复杂&#xff0c;涉及多个方面的因素。 在一份临床采集的数据的基础上&#xff0c;我们通过数据分析手段深入观察一下 BMI&#xf…...

java集合框架之Map系列

前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的&#xff0c;使用数组和链表&#xff08;或红黑树&#xff09;的结构。在Java 8之后&#xff0c;当链表长度超过阈值时会转换为红黑树&#xff0c;以提高查询效率。哈希冲突通过链地址法解决。需要明确的是&#xff…...

android设置添加设备QR码信息

摘要&#xff1a;客户衍生需求&#xff0c;通过扫QR码快速获取设备基础信息&#xff0c;并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...

Python实现微博关键词爬虫

1.背景介绍 随着社交媒体的广泛应用&#xff0c;微博上的海量数据成为了很多研究和分析的重要信息源。为了方便获取微博的相关内容&#xff0c;本文将介绍如何使用Python编写一个简单的爬虫脚本&#xff0c;从微博中抓取指定关键词的相关数据&#xff0c;并将这些数据保存为Ex…...

linux概念详解

用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序&#xff0c;提供系统级服务。 下面举一些例子。 网络服务&#xff1a; 如sshd&#xff08;SSH服务&#xff09;、httpd&#xff08;HTTP服务&#xff09;。 sshd&#xff1a;sshd 守护进程会在后台运行&#x…...

【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)

工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一&#xff0c;但它是一种常见的设计模式。它提供了一种创建对象的接口&#xff0c;但由子类决定要实例化的类是哪一个。这样&#xff0c;工厂方法模式让类的实例化推迟到子类…...

AMESim中批处理功能的应用

AMESim 软件的批处理功能是一项能显著提高仿真效率和灵活性的功能&#xff0c;以下是其介绍与应用说明&#xff1a; 一 功能介绍 参数扫描功能&#xff1a;用户可以指定模型中一个或多个参数的取值范围和步长&#xff0c;批处理功能会自动遍历这些参数组合&#xff0c;进行多…...

《Spring实战》(第6版)第1章 Spring起步

第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean)&#xff0c;与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...

E卷-特殊的加密算法-(200分)

专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...

QT 异步编程之多线程

一、概述 1、在进行桌面应用程序开发的时候&#xff0c;假设应用程序在某些情况下需要处理比较复制的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事…...

K-均值(K-means)

K-均值&#xff08;K-means&#xff09;是一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分成 K 个簇。该算法的过程大致如下&#xff1a; 1. 随机初始化 K 个聚类中心&#xff08;centroid&#xff09;。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

接入 SSL 认证配置:满足等保最佳实践

前言 随着信息安全形势的日益严峻&#xff0c;等保&#xff08;信息安全等级保护&#xff09;要求成为各行业信息系统必须遵守的标准。在数据库领域&#xff0c;OpenGauss作为一款高性能、安全、可靠的开源关系型数据库&#xff0c;也需要满足等保要求&#xff0c;确保数据的安…...

微软AutoGen高级功能——Selector Group Chat

介绍 大家好&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊)&#xff0c;"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客&#xff0c;但是并没有详…...

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计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&#xff08;深度求索&#xff09;是由中国人工智能公司深度求索&#xff08;DeepSeek Inc.&#xff09;研发的大规模语言模型&#xff08;LLM&#xff09;&#xff0c;专注于提供高效、智能的自然语言处理能力&#xff0c;支持多种场景下的文本生成、对…...

flv实时监控视频

文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时&#xff0c;可能需要在大屏上展示一个监控画面&#xff0c;此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...