最简单的基于 FFmpeg 的 AVfilter 例子 - 纯净版

FFMPEG 之 AVFilter 函数名 作用 unsigned avfilter_version (void) 返回libavfilter_version_int常量 const char * avfilter_configuration (void) 返回libavfilter构建时配置 const char * avfilter_license (void) 返回libavfilter许可证。 int avfilter_pad_count (const AVFilterPad *pads) 阅读详情

最简单的基于 FFmpeg 的 AVfilter 例子 - 纯净版

最简单的基于 FFmpeg 的 AVfilter 例子 - 纯净版

参考雷霄骅博士的文章,链接:最简单的基于FFmpeg的AVfilter的例子-纯净版

正文

有关 FFmpeg 的 avfilter 已经写过一个水印叠加的例子:最简单的基于 FFmpeg 的 AVfilter 例子(水印叠加),本文作为补充再记录一个纯净版的 avfilter 的例子。

我们发现,libavfilter 可以独立于 libavcodec 等类库的接口函数作为一个“纯粹”的视音频特效类库进行使用。本文记录的“纯净版”的 avfilter 的例子,即实现了一个纯粹的视频特效添加的功能。

该例子输入为一个 YUV 文件,输出也是一个 YUV 文件,通过 avfilter 的功能可以处理该 YUV 文件实现去色调、模糊、水平翻转、裁剪、加方框、叠加文字等功能。

该程序的流程图如下所示:

请添加图片描述

AVFilter 的初始化比较复杂,而使用起来比较简单。初始化的时候需要调用 avfilter_register_all() 到 avfilter_graph_config() 一系列函数。而使用的时候只有两个函数:

  1. av_buffersrc_add_frame():用于向 FilterGraph 中加入一个 AVFrame;
  2. av_buffersink_get_frame():用于从 FilterGraph 中取出一个 AVFrame。

流程中的关键函数如下所示:

  1. avfilter_register_all():注册所有 AVFilter。
  2. avfilter_graph_alloc():为 FilterGraph 分配内存。
  3. avfilter_graph_create_filter():创建并向 FilterGraph 中添加一个 Filter。
  4. avfilter_graph_parse_ptr():将一串通过字符串描述的 Graph 添加到 FilterGraph 中。
  5. avfilter_graph_config():检查 FilterGraph 的配置。
  6. av_buffersrc_add_frame():向 FilterGraph 中加入一个 AVFrame。
  7. av_buffersink_get_frame():从 FilterGraph 中取出一个 AVFrame。

源代码:

// Simplest FFmpeg AVfilter Example - Pure.cpp : 定义控制台应用程序的入口点。
//

/**
* 最简单的基于 FFmpeg 的 AVFilter 例子 - 纯净版
* Simplest FFmpeg AVfilter Example - Pure
*
* 雷霄骅 Lei Xiaohua
* leixiaohua1020@126.com
* 中国传媒大学/数字电视技术
* Communication University of China / Digital TV Technology
* http://blog.youkuaiyun.com/leixiaohua1020
*
* 修改:
* 刘文晨 Liu Wenchen
* 812288728@qq.com
* 电子科技大学/电子信息
* University of Electronic Science and Technology of China / Electronic and Information Science
* https://blog.youkuaiyun.com/ProgramNovice
*
* 本程序使用 FFmpeg 的 AVfilter 实现了 YUV 像素数据的滤镜处理功能。
* 可以给 YUV 数据添加各种特效功能。
* 是最简单的 FFmpeg 的 AVFilter 方面的教程。
* 适合 FFmpeg 的初学者。
*
* This software uses FFmpeg's AVFilter to process YUV raw data.
* It can add many excellent effect to YUV data.
* It's the simplest example based on FFmpeg's AVFilter.
* Suitable for beginner of FFmpeg
*
*/

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>

// 解决报错:无法解析的外部符号 __imp__fprintf,该符号在函数 _ShowError 中被引用
#pragma comment(lib, "legacy_stdio_definitions.lib")
extern "C"
{
	// 解决报错:无法解析的外部符号 __imp____iob_func,该符号在函数 _ShowError 中被引用
	FILE __iob_func[3] = { *stdin, *stdout, *stderr };
}

#define __STDC_CONSTANT_MACROS

#ifdef _WIN32
// Windows
extern "C"
{
#include "libavfilter/avfiltergraph.h"
#include "libavfilter/buffersink.h"
#include "libavfilter/buffersrc.h"
#include "libavutil/avutil.h"
#include "libavutil/imgutils.h"
};
#else
// Linux...
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavfilter/avfiltergraph.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/avutil.h>
#include <libavutil/imgutils.h>
#ifdef __cplusplus
};
#endif
#endif

AVFilterContext *buffersrc_ctx;
AVFilterContext *buffersink_ctx;
AVFilterGraph *filter_graph;

static int video_stream_index = -1;
const int in_width = 480;
const int in_height = 272;

static int init_filters(const char* filter_descr)
{
	int ret;
	// args 是 buffersrc 滤镜的参数
	char args[512];

	AVFilter *buffersrc = avfilter_get_by_name("buffer");
	AVFilter *buffersink = avfilter_get_by_name("ffbuffersink");
	AVFilterInOut *outputs = avfilter_inout_alloc();
	AVFilterInOut *inputs = avfilter_inout_alloc();
	enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE };
	AVBufferSinkParams *buffersink_params;

	// 为 FilterGraph 分配内存
	filter_graph = avfilter_graph_alloc();

	// buffer video source: the decoded frames from the decoder will be inserted here
	snprintf(args, sizeof(args),
		"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
		in_width, in_height, AV_PIX_FMT_YUV420P,
		1, 25, 1, 1);

	// 创建并向 FilterGraph 中添加一个 Filter
	ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
		args, NULL, filter_graph);
	if (ret < 0)
	{
		printf("Can't create buffer source.\n");
		return ret;
	}

	// buffer video sink: to terminate the filter chain
	buffersink_params = av_buffersink_params_alloc();
	buffersink_params->pixel_fmts = pix_fmts;
	// 创建并向 FilterGraph 中添加一个 Filter
	ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",
		NULL, buffersink_params, filter_graph);
	av_free(buffersink_params);
	if (ret < 0)
	{
		printf("Can't create buffer sink.\n");
		return ret;
	}

	// endpoints for the filter graph
	outputs->name = av_strdup("in");
	outputs->filter_ctx = buffersrc_ctx;
	outputs->pad_idx = 0;
	outputs->next = NULL;

	inputs->name = av_strdup("out");
	inputs->filter_ctx = buffersink_ctx;
	inputs->pad_idx = 0;
	inputs->next = NULL;

	// 将一串通过字符串描述的 Graph 添加到 FilterGraph 中
	ret = avfilter_graph_parse_ptr(filter_graph, filter_descr, &inputs, &outputs, NULL);
	if (ret < 0)
	{
		return ret;
	}

	// 检查 FilterGraph 的配置
	// check validity and configure all the links and formats in the graph
	ret = avfilter_graph_config(filter_graph, NULL);
	if (ret < 0)
	{
		return ret;
	}

	return 0;
}

int main(int argc, char* argv[])
{
	int ret;
	AVFrame* frame_in;
	AVFrame* frame_out;
	unsigned char* frame_buffer_in;
	unsigned char* frame_buffer_out;

	// 帧计数器
	int frame_cnt = 0;

	// 输入 YUV 文件
	FILE* fp_in = fopen("sintel_480x272_yuv420p.yuv", "rb+");
	if (fp_in == NULL) {
		printf("Can't open input file.\n");
		return -1;
	}

	// 输出 YUV 文件
	FILE* fp_out = fopen("output.yuv", "wb+");
	if (fp_out == NULL) {
		printf("Can't open output file.\n");
		return -1;
	}

	//const char *filter_descr = "lutyuv='u=128:v=128'";
	const char *filter_descr = "boxblur";
	//const char *filter_descr = "hflip";
	//const char *filter_descr = "hue='h=60:s=-3'";
	//const char *filter_descr = "crop=2/3*in_w:2/3*in_h";
	//const char *filter_descr = "drawbox=x=100:y=100:w=100:h=100:color=pink@0.5";
	//const char *filter_descr = "drawtext=fontfile=arial.ttf:fontcolor=green:fontsize=30:text='Lei Xiaohua'";

	// 注册所有 AVFilter
	avfilter_register_all();

	ret = init_filters(filter_descr);
	if (ret < 0)
	{
		goto end;
	}

	frame_in = av_frame_alloc();
	frame_buffer_in = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, in_width, in_height, 1));
	av_image_fill_arrays(frame_in->data, frame_in->linesize, frame_buffer_in,
		AV_PIX_FMT_YUV420P, in_width, in_height, 1);

	frame_out = av_frame_alloc();
	frame_buffer_out = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, in_width, in_height, 1));
	av_image_fill_arrays(frame_out->data, frame_out->linesize, frame_buffer_out,
		AV_PIX_FMT_YUV420P, in_width, in_height, 1);

	frame_in->width = in_width;
	frame_in->height = in_height;
	frame_in->format = AV_PIX_FMT_YUV420P;

	while (1)
	{
		if (fread(frame_buffer_in, 1, in_width * in_height * 3 / 2, fp_in) != in_width * in_height * 3 / 2)
		{
			break;
		}
		// Input Y, U, V
		frame_in->data[0] = frame_buffer_in;
		frame_in->data[1] = frame_buffer_in + in_width * in_height;
		frame_in->data[2] = frame_buffer_in + in_width * in_height * 5 / 4;

		// 向 FilterGraph 中加入一个 AVFrame
		if (av_buffersrc_add_frame(buffersrc_ctx, frame_in) < 0)
		{
			printf("Error while feeding the filtergraph.\n");
			break;
		}

		// 从 FilterGraph 中取出一个 AVFrame
		ret = av_buffersink_get_frame(buffersink_ctx, frame_out);
		if (ret < 0)
		{
			break;
		}

		printf("Process %d frame.\n", ++frame_cnt);

		// Output Y, U, V
		if (frame_out->format == AV_PIX_FMT_YUV420P)
		{
			// Y, U, V
			for (int i = 0; i < frame_out->height; i++)
			{
				fwrite(frame_out->data[0] + frame_out->linesize[0] * i, 1, frame_out->width, fp_out);
			}
			for (int i = 0; i < frame_out->height / 2; i++)
			{
				fwrite(frame_out->data[1] + frame_out->linesize[1] * i, 1, frame_out->width / 2, fp_out);
			}
			for (int i = 0; i < frame_out->height / 2; i++)
			{
				fwrite(frame_out->data[2] + frame_out->linesize[2] * i, 1, frame_out->width / 2, fp_out);
			}
		}

		av_frame_unref(frame_out);
	}

	fclose(fp_in);
	fclose(fp_out);

end:
	av_frame_free(&frame_in);
	av_frame_free(&frame_out);
	avfilter_graph_free(&filter_graph);

	if (ret < 0 && ret != AVERROR_EOF)
	{
		char buf[1024];
		av_strerror(ret, buf, sizeof(buf));
		printf("Error occurred: %s.\n", buf);
		return -1;
	}

	system("pause");
	return 0;
}

结果

本程序输入为一个名称为 “sintel_480x272_yuv420p.yuv” 的 YUV420P 视频数据,输出为一个名称为 “output.yuv” 的 YUV420P 视频数据。

输入的视频数据的内容如下所示:

在这里插入图片描述

程序中提供了几种特效:

  1. lutyuv=‘u=128:v=128’
  2. boxblur
  3. hflip
  4. hue=‘h=60:s=-3’
  5. crop=1/2*in_w:1/2*in_h
  6. drawbox=x=100:y=100:w=100:h=100:color=pink@0.5
  7. drawtext=fontfile=arial.ttf:fontcolor=green:fontsize=30:text=‘UestcXiye’

可以通过修改程序中的 filter_descr 字符串实现上述几种特效。下面展示几种特效的效果图。

lutyuv=‘u=128:v=128’:

在这里插入图片描述

boxblur:

在这里插入图片描述

hflip:

在这里插入图片描述

hue=‘h=60:s=-3’:

在这里插入图片描述

crop=1/2*in_w:1/2*in_h:

在这里插入图片描述

drawbox=x=100:y=100:w=100:h=100:color=pink@0.5:

在这里插入图片描述

drawtext=fontfile=arial.ttf:fontcolor=green:fontsize=30:text=‘UestcXiye’:

在这里插入图片描述

工程文件下载

GitHub:UestcXiye / Simplest FFmpeg AVfilter Example - Pure

优快云:Simplest FFmpeg AVfilter Example - Pure.zip

FFMpeg 源码分析(1)av_register_all() FFMpeg 源码分析(1)av_register_all()一般我们使用FFMpeg做编解码都会先调用`av_register_all()`这个函数开头,完成基本的初始化工作。而至于它具体初始化了哪些东西呢,我们直接从代码里面来看吧。 void av_register_all(void) { static int initialized; //标志位指示是否已经初始化 阅读详情

相关推荐

FFMPEG-AVFilter研究

FFMPEG中的libswscale是做像素转换的,但是对于一些复杂的操作,比如添加水印等,这个库就不行了,这时候就要说一下另外一个AVFilter。AVFilter完全可以替代libswscale的所有功能,也许有一天,ffmpeg也会这样去做。AVFilter虽然学起来有点复杂,但是为了学好FFMPEG,为了涨工资,我忍了。(*^__^*) 嘻嘻…… 概念: 做个directsho

BIGBurning 6816

FFmpeg 滤镜AVFilter编程——简单滤镜

一、认识滤镜 ffmpeg里面的滤镜十分重要,功能也十分强大,除了我们所谓的滤镜,还有贴图、伸缩变形、拆解合并等功能。 ffmpeg 二、如何使用滤镜

熊猫Ben的博客 3294

FFmpeg入门详解之38:FFmpeg特效处理libavfilter

libavfilter是FFmpeg提供的滤波器类,可以用其做一些音视频处理,如音视频倍速、水平翻转、裁剪、加方框、叠加文字等功能。例如之前介绍过的音频重采样,视频的像素格式转换,本质上也是滤波,所以libavfilter也可以实现libswresample、libswscale提供的对音视频格式变换的功能。1、基本概念:libavfilter结构类似于directShow,可以同时存在多个filter(滤波器)。

福优学苑@音视频+流媒体 1618

ffmpeg学习 libavfilter使用

在ffmpeg中图像处理、音频处理可以使用libswscale和libswresample库,简单的几次转换在编解码尚可,一旦需求复杂则难以实现,就需要使用libavfilter库实现。 libavfilter库简介 libavfilter提供了一整套的基于filter的机制,以插件(可实现自定义filter并编译到ffmpeg库中)的形式快速组装需要的结果。Ffmpeg官方提供的filter相关资料见文档https://ffmpeg.org/ffmpeg-filters.html#Filtering-In

热爱生活,忠于自己 2062

若依框架集成saToken

若依版本3.8.8,鉴权采用security框架,这种框架太重,项目中想实现对外提供接口功能。尽快减少修改原框架的逻辑基础上,采用satoken实现。

sccd2009的专栏 1482

51雾化器实现

1. 雾化器简介 雾化器是将试液雾化的一种器械。雾化器是原子化系统的重要部件,其性能对测定的精密度和化学干扰等产生显著影响。因此要求雾化器喷雾稳定、雾滴细小、均匀和雾化效率高。雾化器的类型有超声雾化器,空气压缩式雾化器,网式雾化器。超声雾化器因其价格合适,适合家用,被广泛应用于加湿器,香薰机等各种小家电,也在医疗领域有很多的应用。家用雾化器的主要器件是一枚雾化片。 家用雾化器分为两种不同类别雾化片,实孔雾化片和微孔雾化片,这两种的喷雾方法和工作原理是有所不同的。不同的雾化片需要特定的频率才能工作。 实孔雾

qq_42415953的博客 2万+

最简单的基于FFmpeg的AVfilter的例子-纯净版

有关FFmpeg的avfilter已经写过一个水印叠加的例子《最简单的基于FFmpeg的AVfilter例子(水印叠加)》,本文作为补充再记录一个纯净版的avfilter的例子。此前libavfilter一直是结合着libavcodec等类库的接口函数使用的,因此我一直以为libavfilter库与libavcodec等类库是高度耦合的(也就是如果想使用libavfilter的视音频特效功能的话必

雷霄骅(leixiaohua1020)的专栏 12万+

别再套用星形公式了!三角形接法PMSM的FOC控制,扇区判断与作用时间推导全解析

本文深入解析三角形接法永磁同步电机(PMSM)的FOC控制技术,重点探讨30度相位差对SVPWM扇区判断与电压矢量作用时间的影响。通过数学推导与实验验证,详细讲解修正后的扇区划分规则、作用时间计算公式优化方法,并提供可直接移植到STM32的代码实现,帮助工程师解决三角形接法特有的相电流重构与同步采样难题。

weixin_30689307的博客 469

最简单的基于FFmpeg的AVfilter的例子 纯净版

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ===========

hffgjh的博客 853

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

最简单的基于FFmpeg的AVfilter例子(水印叠加)

FFMPEG中有一个类库:libavfilter。该类库提供了各种视音频过滤器。之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处理很方便。在此将它的一个例子基础上完成了一个水印叠加器,并且移植到了VC2010下,方便开发人员学习研究它的使用方法。 下面直接贴上代码:   程序的运行效果如图所示。需要叠加的水印为一张PNG(透明

雷霄骅(leixiaohua1020)的专栏 11万+

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

这章来学习串口数据流操作。仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个Widget进行布局。如下所示。 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。 加入一些弹簧,使布局美观。(有必要可以加设置不能调整..

Mark_md的博客 9274

最简单的基于FFmpeg的AVfilter的例子-修正版

代码是参考雷神的博客的代码,不过由于ffmpeg版本不同,记录使用中遇到的问题。   1.调用avfilter_get_by_name("ffbuffersink")时在新版本的ffmpeg要修改为avfilter_get_by_name("buffersink");否则返回指针为空,调用avfilter_graph_create_filter返回-12,在以前的版本则没有这个问题。 2....

phymat.nico的专栏 7470

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

基于STM32单片机的环境监测系统设计与实现

综上所述,基于STM32单片机的环境监测系统具有良好的实时性、准确性和稳定性,能够满足环境监测的需求。本系统的研究意义在于,首先,它能够为用户提供准确的室内空气质量信息,帮助用户了解室内环境的质量状况,从而采取相应的措施来改善室内环境。本文设计并实现了一种基于STM32单片机的环境监测系统,该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓度,为用户提供准确的空气质量信息。实验过程中,我们模拟了不同的环境条件,包括温湿度变化、甲醛和二氧化碳浓度的波动等,以测试系统的实时性、准确性和稳定性。

3254968421的博客 2万+

最简单的基于 FFmpeg 的 AVfilter 例子(水印叠加)

最简单的基于 FFmpeg 的 AVfilter 例子(水印叠加)

ProgramNovice的博客 2298

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c++ ffmpeg内存推流_最简单的基于FFmpeg的AVfilter的例子

此前libavfilter一直是结合着libavcodec等类库的接口函数使用的,因此我一直以为libavfilter库与libavcodec等类库是高度耦合的(也就是如果想使用libavfilter的视音频特效功能的话必须使用libavcodec等类库的函数)。这两天空闲的时候研究了一下libavfilter的代码后发现实际情况不是这样的:libavfilter可以独立于libavcodec等类...

weixin_28295799的博客 863

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最简单的基于FFmpeg的移动端例子:Android HelloWorld

从本文开始打算记录一系列FFmpeg在Android/IOS开发的示例程序。前面几篇文章记录FFmpeg安卓端开发的例子,后面几篇文章记录FFmpeg IOS端开发的例子。这些例子中FFmpeg相关的代码源自于《FFmpeg示例合集》中的程序。本文记录第一个程序:安卓平台下基于FFmpeg的HelloWorld程序。Android程序FFmpeg类库使用说明Android应用程序使用FFmpeg类

雷霄骅(leixiaohua1020)的专栏 11万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

FFmpeg 开发之 AVFilter 使用流程总结

在使用FFmpeg开发时,使用AVFilter的流程较为复杂,涉及到的数据结构和函数也比较多,那么使用FFmpegAVFilter的整体流程是什么样,在其执行过程中都有哪些步骤,需要注意哪些细节?这些都是需要我们整理和总结的。 首先,我们需要引入三个概念结构体:AVFilterGraph、AVFilterContext、AVFilter。 一、AVFilterGraph、AVFilterContext、AVFilter 在 FFmpeg 中有多种多样的滤镜,你可以把他们当成一个个小工具,专门...

weixin_42610770的博客 2882

FFmpeg中AVFilter模块实践指南

转载 在做音视频相关的开发过程大体如下所示,对于其中的编码/解码,整个流程相对比较固定,使用ffmpeg可以很好的完成这部分的开发。对其中的帧数据处理(包括音频和视频数据)则相对要多样化一些,比如对视频做尺寸变换,进行音频音量均衡,直播中的美颜处理,多路流合成等等,这些都是属于流程中的帧数据处理。今天要介绍FFmpeg中的AVFilter模块进行帧数据处理的开发,AVFilter模块对帧数据处理...

清澈见底的专栏 7606

ffmpeg AVFilter介绍

一.  ffmpeg AVFilter介绍 利用ffmpeg做图像的pixel format转换你还在用libswscale吗?嘿嘿,过时啦! ffmpeg中有了新东西:libavfilter.使用它,可以完全代替libswscale,并且可以自动完成一些复杂的转换操作呢.libavfilter啊,用了都说好!但就是太复杂... 如果你仅仅是做图像的pixel format处理,用libsw

移动视频探索者 1万+

最简单的基于FFmpeg的AVfilter例子(水印叠加

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ===========

hffgjh的博客 465

ffmpeg AVFilter

一. ffmpeg AVFilter介绍利用ffmpeg做图像的pixel format转换你还在用libswscale吗?嘿嘿,过时啦!ffmpeg中有了新东西:libavfilter.使用它,可以完全代替libswscale,并且可以自动完成一些复杂的转换操作呢.libavfilter啊,用了都说好!但就是太复杂… 如果你仅仅是做图像的pixel format处理,用libswscale是相

回忆的往昔 1109

FFmpeg滤镜学习之AVFilter

FFmpeg滤镜学习之AVFilter 什么是AVFilter? 对音视频数据添加特效,如黑白视频、混音,同时也可以完成音视频像素格式转码工作;官方特效说明请点击;一般使用filter都是在后台服务器对视频进行特效处理,移动端的话相对比较耗资源 AVFilter处理框架 大致框架如下图所示,可以把AVFilter看做一些列Filter节点链组成,这个链由AVfilterGraph管理,每个AV...

jackzhouyu的专栏 2205
上一篇: Leetcode834. 树中距离之和
下一篇: 最简单的基于 FFmpeg 的图像编码器(YUV 编码为 JPEG)
UestcXiye
博客等级 码龄8年 9030粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值