ffmpeg anull 是个啥?

1. ffmpeg anull 是个啥?
----------------------------------------
author: hjjdebug
date:   2023年 07月 13日 星期四 17:59:47 CST
----------------------------------------

当然是ffmpeg audio filter了,
$ ffmpeg -h filter=anull
给出了如下信息:
Filter anull
  Pass the source unchanged to the output.
    Inputs:
       #0: default (audio)
    Outputs:
       #0: default (audio)
这些信息是怎么来的? 它实际上打印了anull 对象定义的一些信息.
anull 对象是一个全局对象,它的地址是通过avfilter_get_by_name()找到的.
其它的引脚等,都是找的定义的变量或函数.
因为它简单,所以才好分析.

2. 打开ffmpeg4.4/libavfilter/af_anull.c
这里就是其真身了, 非常简单.

static const AVFilterPad avfilter_af_anull_inputs[] = {
    {
        .name = "default",
        .type = AVMEDIA_TYPE_AUDIO,
    },
    { NULL }
};

static const AVFilterPad avfilter_af_anull_outputs[] = {
    {
        .name = "default",
        .type = AVMEDIA_TYPE_AUDIO,
    },
    { NULL }
};

AVFilter ff_af_anull = {
    .name          = "anull",
    .description   = NULL_IF_CONFIG_SMALL("Pass the source unchanged to the output."),
    .inputs        = avfilter_af_anull_inputs,
    .outputs       = avfilter_af_anull_outputs,
};

3. 关键是它是如何工作的?
3.1: 先分析一下 ffmpeg -h filter=anull 的执行过程.
因为命令行里有-h 选项,所以执行了 show_help()函数
由于参数是filter=anull, 从=号处分割,前为"filter", 后为"anull"
所以调用: show_help_filter("anull")
首先获取filter , 过程是枚举,这里忽略.拿到了AVFilter 对象的指针ff_af_anull, 在文件中定义的全局对象
    const AVFilter *f = avfilter_get_by_name(name);

关键成员如下:
$9 = {
  name = 0x7ffff65e9e38 "anull",
  description = 0x7ffff65e9e40 "Pass the source unchanged to the output.",
  inputs = 0x7ffff6673ee0 <avfilter_af_anull_inputs>,
  outputs = 0x7ffff6673f60 <avfilter_af_anull_outputs>,
  priv_class = 0x0,
  flags = 0,
    ...
}
首先打印filter 名字  printf("Filter %s\n", f->name);   //这就是 打印输出 "Filter anull" 的来历
然后打印filter 描述  printf("  %s\n", f->description); //这就是 打印输出 "Pass the source unchanged to the output."的来历
然后打印输入:   printf("    Inputs:\n");
然后是每一个引脚的序号,名称,类型
  int count = avfilter_pad_count(f->inputs);
    for (i = 0; i < count; i++) {
        printf("       #%d: %s (%s)\n", i, avfilter_pad_get_name(f->inputs, i),
               media_type_string(avfilter_pad_get_type(f->inputs, i)));
    }

同理, 打印输出引脚信息:
    printf("    Outputs:\n");
    count = avfilter_pad_count(f->outputs);
    for (i = 0; i < count; i++) {
        printf("       #%d: %s (%s)\n", i, avfilter_pad_get_name(f->outputs, i),
               media_type_string(avfilter_pad_get_type(f->outputs, i)));
    }
 
我们挖地三尺,继续看看下一层.
3.1.1:    count = avfilter_pad_count(f->inputs);

int avfilter_pad_count(const AVFilterPad *pads)
{
    int count;
    for (count = 0; pads->name; count++)
        pads++;
    return count;
}
我们看到,代码里只定义了一个输入脚,所以count 返回1, 同理输出也一样.

3.1.2: avfilter_pad_get_name(f->inputs,i)
#define media_type_string av_get_media_type_string
const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
{
    return pads[pad_idx].name;  //给了pads 指针,又给了idx,当然可以返回name, 这个指针对anull而言必然是文件中定义的地址.
}

enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
{
    return pads[pad_idx].type;
}

const char *av_get_media_type_string(enum AVMediaType media_type)
{
    switch (media_type) {
    case AVMEDIA_TYPE_VIDEO:      return "video";
    case AVMEDIA_TYPE_AUDIO:      return "audio";
    case AVMEDIA_TYPE_DATA:       return "data";
    case AVMEDIA_TYPE_SUBTITLE:   return "subtitle";
    case AVMEDIA_TYPE_ATTACHMENT: return "attachment";
    default:                      return NULL;
    }
}
至此对 ffmpeg -h filter=anull 分析完毕!

3.2 anull filter 是如何工作的?
那需要分析一下如下命令是如何工作的.
ffmpeg -y -i /opt/test/test.ts  -af anull  1.ts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解码 LangChain|用 LangChain 和 Milvus 从零搭建 LLM 应用

如何从零搭建一个 LLM 应用&#xff1f;不妨试试 LangChain Milvus 的组合拳。 作为开发 LLM 应用的框架&#xff0c;LangChain 内部不仅包含诸多模块&#xff0c;而且支持外部集成&#xff1b;Milvus 同样可以支持诸多 LLM 集成&#xff0c;二者结合除了可以轻松搭建一个 LLM…

原型模式-克隆一个对象

在开发一个界面的时候&#xff0c;里面有多个Button&#xff0c;这些对象的属性内容相似。如果一个个实例化Button对象&#xff0c;并设置其属性&#xff0c;那么代码量将会增多。 通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 图 原型模式 …

pygplates专栏——Reconstruc features——reconstruct regular features

pygplates专栏——Reconstruc features——reconstruct regular features Reconstruct regular features导出重构特征到文件示例代码详解 计算重建距离示例代码详解 Reconstruct regular features 这个例子展示了几个不同的场景&#xff0c;涉及到重建地质时代的常见特征。 导…

【分布式】ceph存储

目录 一、存储基础单机存储设备单机存储的问题商业存储解决方案 二、 分布式存储 &#xff08;软件定义的存储 SDS&#xff09;分布式存储的类型Ceph 优势Ceph 架构Ceph 核心组件Pool中数据保存方式支持两种类型&#xff1a;Pool、PG 和 OSD 的关系OSD 存储后端BlueStore 的主要…

stable diffusion webui mov2mov

手把手教你用stable diffusion绘画ai插件mov2mov生成动画_哔哩哔哩_bilibili手把手教你用stable diffusion绘画ai插件mov2mov生成动画, 视频播放量 14552、弹幕量 3、点赞数 275、投硬币枚数 114、收藏人数 980、转发人数 75, 视频作者 懂你的冷兮, 作者简介 科技改变世界&…

Ubuntu新版静态IP设置

cd /etc/netplan直接编辑 sudo vi /etc/netplan/00-installer-config.yaml#network: # ethernets: # ens160: # dhcp4: true # version: 2network:version: 2ethernets:ens160:dhcp4: noaddresses: [172.17.10.23/24]optional: truegateway4: 172.17.10.1nameservers…

多个excel文件合并为一个excel

Python openpyxl库实现将同一目录下的excel文件合并为一个excel功能(包含格式&#xff0c;不含宏)&#xff0c;运行程序后&#xff0c;输入要生成的excel文件名称即可 import os import copy import sys import openpyxl from openpyxl.utils import get_column_letter import…

java工作随笔

String s JSONObject.toJSONString(fixedAsset);logger.error("-----------------8------------------" s);CusFixedAssettDTO CusFixedAssettDTO3 JSONObject.parseObject(s, CusFixedAssettDTO.class);父类转子类 相同对象合并 import java.util.Date; Data T…

Bard:Google AI开始支持中文对话和看图说话了

说起时下火爆的生成式AI&#xff0c;并不是只有ChatGPT。Bard也是一个很优秀的产品&#xff0c;并且刚刚发布的很多有趣的新功能。文末告诉你如何访问Bard。 Google AI在最近的更新中发布了Bard&#xff0c;一个新的语言模型。Bard支持多种语言&#xff0c;包括中文&#xff0…

【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解 1.创建Ceph对象存储系统RGW接口2. 开启httphttps,更改监听端口3. 更改监听端口4.S3接口访问测试5.实验中遇到的故障案例 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph对象存储系统RGW接口 &#xff08;1&#xff09;对象存储概念 对象存…

WPF嵌入外部exe应用程序-使用Winfom控件承载外部程序

使用Winform控件承载外部程序 在WPF中使用Winfom控件添加winform相关的程序集在XAML头中加入对这两个程序集命名空间的引用使用Winform控件效果&#xff1a;问题 在Winfom控件中嵌入exe程序准备Winfrom控件更换父窗体的句柄完整实现代码&#xff1a;实现效果&#xff1a; 问题和…

ffmpeg get_bits() 函数是如何工作的.

/* * 本测试程序用来说明 GetBitContext 是什么? * get_bits() 函数是如何工作的. * author: hjjdebug * date: 2023年 07月 13日 星期四 16:42:45 CST */ GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits. typedef struct GetBi…

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码&#xff0c;原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有&#xff0c;如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

MetaTown:一个可以自己构建数字资产的平台

摘要&#xff1a;华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案。 本文分享自华为云社区《基于MetaTown构建数字资产平台》&#xff0c;作者&#xff1a; 阿米托福。 华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案&…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

Linux系统部署Nginx详细教程(图文讲解)

前言&#xff1a;本篇博客记录了我是如何使用Linux系统一步一步部署Nginx的完整过程&#xff0c;也是我学习之路上的一个笔记总结&#xff0c;每一行代码都进行了严格的测试&#xff0c;特此做一个技术分享&#xff01; 目录 一、安装依赖 二、安装Nginx 三、配置Nginx 四、…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

手把手教你搭建SpringCloud项目(八)集成Ribbon负载均衡器

什么是微服务&#xff1f;一看就会系列&#xff01; 一、手把手教你搭建SpringCloud项目&#xff08;一&#xff09;图文详解&#xff0c;傻瓜式操作 二、手把手教你搭建SpringCloud项目&#xff08;二&#xff09;生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

【数据结构】24王道考研笔记——图

六、图 目录 六、图定义及基本术语图的定义有向图以及无向图简单图以及多重图度顶点-顶点间关系连通图、强连通图子图连通分量强连通分量生成树生成森林边的权、带权网/图特殊形态的图 图的存储及基本操作邻接矩阵邻接表法十字链表邻接多重表分析对比图的基本操作 图的遍历广度…

区块链学习一:安装 Geth

区块链技术正在迅速发展&#xff0c;并在各个领域展现出巨大的潜力。如果您对区块链开发感兴趣&#xff0c;那么学习如何安装和配置以太坊客户端 Geth 是一个很好的起点。在本篇文章中&#xff0c;我们将介绍如何使用 DockerHub 上的 Geth Docker 映像来快速安装和运行 Geth 节…