ffmpeg anull 是个啥?

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-558707.html

到了这里,关于ffmpeg anull 是个啥?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ​Web3到底是个啥?

    Web3到底是个啥? Web3是近两年来科技领域最火热的概念之一,但是目前对于Web3的定义却仍然没有形成标准答案,相当多对于Web3的理解,都是建立在虚拟货币行业(即俗称的“币圈”)的逻辑基础之上的。 区块链服务网络(BSN)的核心理念,是在互联网上推动建立一个新的公

    2024年02月14日
    浏览(35)
  • 【C#】微软的Roslyn 是个啥?

            Roslyn 是微软重写的C#编译器并开源。         Roslyn  是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始,并成为所有C#(和VB)的开源,跨平台,公共语言引擎,我将在本文的其余部分将其视为给定的)。        

    2024年02月15日
    浏览(38)
  • 了解 Langchain️是个啥?:第 1 部分

            在日常生活中,我们主要致力于构建端到端的应用程序。我们可以使用许多自动 ML 平台和 CI/CD 管道来自动化 ml 管道。我们还有像Roboflow和Andrew N.G.的登陆AI这样的工具来自动化或创建端到端的计算机视觉应用程序。         如果我们想在OpenAI或拥抱脸的帮助下

    2024年02月13日
    浏览(31)
  • 大语言模型:LLM的概念是个啥?

                 大语言模型(维基:LLM-  large language model )是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的,人工智能加速器能够处理大量文本数据,这些数据大部分是从互联网上抓取的。 [1]所构建的人工神经网络可以包含数千万到数十亿的权重,

    2024年02月13日
    浏览(26)
  • 液体神经网络:LNN是个啥概念?

            在在人工智能领域,神经网络已被证明是解决复杂问题的非常强大的工具。多年来,研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络(LNN)的概念,这是一个利用动态计算功能的迷人框架。在本文中,我们将深入研究 LNN 的世

    2024年02月13日
    浏览(47)
  • ChatGPT到底是个啥 - 它甚至会和狗说话

    写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二

    2024年02月03日
    浏览(39)
  • AIGC到底是个啥? AI和AIGC的区别有哪些

      说来说去,到底什么是AIGC呢?AIGC是人工智能生成内容的缩写,是一种基于生成对抗网络(GAN)、大型预训练模型等人工智能技术的方法,通过对已有数据进行学习和模式识别,以适当的泛化能力生成相关内容的技术,AIGC的应用领域有很多例如,AIGC可以用于自动生成新闻、

    2024年02月08日
    浏览(32)
  • 云原生到底是个啥玩意?从云端降临的超级技术:云原生

    目录 福利:文末分享云原生相关全套资料哦 一、云计算?云原生? 二、云原生带来什么好处 7个字:隔离、弹性、自动化。 三、云原生的基础知识 四、云原生中最重要的概念 1、虚机 2、容器 3、容器编排 4、VPC 5、微服务(Microservices) 6、服务网格(Service Mesh) 7、无服务器

    2024年02月08日
    浏览(31)
  • 越来越火的Serverless(无服务器计算),到底是个啥?

    今天这篇文章,我们来聊一个云计算领域的热门概念——Serverless。 到底什么是Serverless? 英语好的童鞋,可能一眼就看出来了,Serverless是由Server和less两个词根组成的词。从字面上理解,就是“无服务器”。 行业通常所说的Serverless,主要是指 “无服务器计算(Serverless Comp

    2024年02月03日
    浏览(35)
  • CocoaPods 在iOS开发中养活了这么多项目,它到底是个啥?

    对于iOS开发者而言,CocoaPods并不陌生,通过pod相关的命令操作,就可以很方便的将项目中用到的三方依赖库资源集成到项目环境中,大大的提升了开发的效率。CocoaPods作为iOS项目的包管理工具,它在命令行背后做了什么操作?而又是通过什么样的方式将命令指令声明出来供我

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包