FFmpeg AVFilter的原理(三)- filter是如何被驱动的

这篇具有很好参考价值的文章主要介绍了FFmpeg AVFilter的原理(三)- filter是如何被驱动的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先上官方filter的链接:https://ffmpeg.org/ffmpeg-filters.html
关于filter命令行:FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理

1、下面是一个avfilter的graphFFmpeg AVFilter的原理(三)- filter是如何被驱动的,ffmpeg
上图是ffmpeg中doc/examples中filtering_video.c案例的示意图。
特别注意上面蓝色方块箭头,其就是query_format()后的结果,也是filter协商fmt的关键步骤。
本章节主要查看avfilter中的数据是怎么进入的,然后又是怎么出来的。
主要考察两个函数:

av_buffersrc_add_frame_flags()
av_buffersink_get_frame()

下面是其具体用法:

 /* read all packets */
    while (1) {
        if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
            break;

        if (packet.stream_index == video_stream_index) {
            ret = avcodec_send_packet(dec_ctx, &packet);
            if (ret < 0) {
                av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
                break;
            }

            while (ret >= 0) {
                ret = avcodec_receive_frame(dec_ctx, frame);
                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
                    break;
                } else if (ret < 0) {
                    av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
                    goto end;
                }

                frame->pts = frame->best_effort_timestamp;

                /* push the decoded frame into the filtergraph */
                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
                    av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
                    break;
                }

                /* pull filtered frames from the filtergraph */
                while (1) {
                    ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
                    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                        break;
                    if (ret < 0)
                        goto end;
                    display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
                    av_frame_unref(filt_frame);
                }
                av_frame_unref(frame);
            }
        }
        av_packet_unref(&packet);
    }

整个函数关系调用图如下:
FFmpeg AVFilter的原理(三)- filter是如何被驱动的,ffmpeg文章来源地址https://www.toymoban.com/news/detail-606314.html

到了这里,关于FFmpeg AVFilter的原理(三)- filter是如何被驱动的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ffmpeg中filter_query_formats函数解析

    ffmpeg中filter_query_formats主要起一个pix fmt引用指定的功能。 下下结论: 先看几个结构体定义: 结构体: AVFilterFormatsConfig 再来看函数: 核心函数: ff_set_common_formats 看宏定义: 接着看ref 主要看关键的三行代码: 这就是最开始图片指示的互相引用。

    2024年02月16日
    浏览(36)
  • FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation) ,笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。 解封装 ,就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业

    2023年04月09日
    浏览(50)
  • FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码

    ​ 学习FFmpeg的时候,经常要到GitHub下载各种开源代码,比如FFmpeg的源码页面位于https://github.com/FFmpeg/FFmpeg。然而国内访问GitHub很不稳定,经常打不开该网站,比如在命令行执行下面的ping命令。 上面的ping结果如下所示,可见默认解析的DNS地址连接超时。 现在GitHub的DNS请求超时

    2024年03月17日
    浏览(64)
  • [libglog][FFmpeg] 如何把 ffmpeg 的库日志输出到 libglog里

    ffmpeg 提供了自己的 log 模块 av_log,会默认把输出打印到 stderr 上,因此无法方便地跟踪日志。但是 ffmpeg 提供了一个接口 av_log_set_callback 以供外界自定义自己的日志输出。 libglog 提供的是c++ 形式的日志输出样式,因此需要将二者关联起来,代码如下:

    2024年02月10日
    浏览(37)
  • 如何压缩视频-ffmpeg

    压缩视频大多使用ffmpeg,我们需要思考清楚,为什么需要压缩视频。是因为用户体验(秒开、流畅)问题?还是因为成本(带宽、存储)问题?还是因为运营(广告、互动)需要?我们在进行压缩之前要锚定好关键目标,然后平衡取舍。 最初我拿到的需求是用户播放卡顿,需

    2024年02月10日
    浏览(40)
  • 如何使用FFmpeg精确剪辑视频

    1.1 背景 之前基于 ffmpeg 做二次开发,完成常见的视频处理功能,并用 ffmpeg 命令行做兜底。在此基础上,还做一个转码接入和调度系统对外提供服务。有个功能需要是这样的:快速从指定的视频中裁剪某一时间范围的子视频, 两个要求:1. 要快,不能像转码一样耗时;2.要精

    2024年02月12日
    浏览(43)
  • Windows下如何编译FFmpeg

      ffmpeg一般在linux环境中使用,但是我们目前很多的开发工具是windows,为了方便在windows下调试和使用ffmpeg,我们需要再windows下面编译和使用ffpeg,本文只讲述windows下如何编译ffmpeg的内容。   windows下编译ffmpeg有很多的方法,本文主要用MSYS2的方式来编译。其本质就是模拟

    2024年02月08日
    浏览(37)
  • 如何在Ubuntu上安装FFmpeg?

    FFmpeg是一个开源的跨平台音视频处理工具,它可以用于录制、转换和流式传输多种音视频格式。在Ubuntu上安装FFmpeg非常简单,下面是详细的步骤。 步骤 1:更新软件包列表 在安装任何软件之前,建议先更新软件包列表,以确保安装的是最新版本的软件。打开终端并执行以下命

    2024年02月21日
    浏览(33)
  • 关于ffmpeg如何下载、安装和使用

            最近在B站爬视频的时候,发现爬出来的文件分为音频和视频文件,于是查阅了几个小时的资料和视频教学,亲测用subprocess库和ffmpeg软件可以实现音视频同步拼接,下面直接上步骤。 一、下载 1.百度搜索ffmpeg官网,点进去 2.Download下载  3.下滑到 Get packages executa

    2024年02月16日
    浏览(42)
  • 【板栗糖GIS】——如何安装ffmpeg

    【板栗糖GIS】——如何安装ffmpeg 目录 1. 解压安装包 2. 把bin路径放在环境变量中 3. 检测是否安装成功 下载软件包,我已经准备好资源,只是审核还未通过,过两天会加上安装包链接 1. 解压安装包 2. 把bin路径放在环境变量中   3. 检测是否安装成功 win+r打开窗口,输入cmd,调

    2024年02月16日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包