工具:ffmpeg过滤器模块
相关过滤器,其创建过程如下:
- 创建一个过滤器节点,如overlay:avfilter_get_by_name(“overlay”);
- 创建一个过滤器上下文并将其添加到FilterGraph上,如:avfilter_graph_create_filter(&overlayFilter_ctx, overlayFilter, “overlay”,
“y=0:H/2”, NULL, filter_graph);
AVFilter *overlayFilter = avfilter_get_by_name("overlay");
AVFilterContext *overlayFilter_ctx;
ret = avfilter_graph_create_filter(&overlayFilter_ctx, overlayFilter, "overlay",
"y=0:H/2", NULL, filter_graph);
buffer(源过滤器)
buffersink(输出过滤器)
split(分流)
crop(裁剪)
- 参数配置裁剪区域:“out_w=iw:out_h=ih/2:x=0:y=0”
vfilpt(垂直翻转)
overlay(视频合成)
- 将通过滤镜的图像叠加到某个位置:“y=0:H/2”
代码如下,整体流程均已注释:
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
int main(int argc, char* argv)
{
int ret = 0;
FILE* inFile = NULL;
const char* inFileName = "F:\\Avenger4_1_YUV420P_480x320.yuv";
inFile = fopen(inFileName, "rb");
if (!inFile) {
printf("Fail to open file\n");
return -1;
}
int in_width = 480;
int in_height = 320;
FILE* outFile = NULL;
const char* outFileName = "F:\\out_crop_vfilter_480x320.yuv";
fopen_s(&outFile, outFileName, "wb");
if (!outFile) {
printf("Fail to create file for output\n");
return -1;
}
avfilter_register_all();
AVFilterGraph* filter_graph = avfilter_graph_alloc();
if (!filter_graph) {
printf("Fail to create filter graph!\n");
return -1;
}
char args[512];
sprintf(args,
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
in_width, in_height, AV_PIX_FMT_YUV420P