FFMPEG--使用Filter实现YUV图像翻转

本文详细介绍了如何使用FFmpeg库中的过滤器进行视频处理,包括创建过滤器节点、配置参数,如buffer源过滤器、buffersink输出过滤器、split分流、crop裁剪、vflip垂直翻转和overlay视频合成。通过示例代码展示了如何实现视频帧的读取、过滤及输出,实现视频的裁剪、翻转并合成为新的视频文件。
摘要由CSDN通过智能技术生成

工具:ffmpeg过滤器模块

相关过滤器,其创建过程如下:

  • 创建一个过滤器节点,如overlay:avfilter_get_by_name(“overlay”);
  • 创建一个过滤器上下文并将其添加到FilterGraph上,如:avfilter_graph_create_filter(&overlayFilter_ctx, overlayFilter, “overlay”,
    “y=0:H/2”, NULL, filter_graph);
    // overlay filter:视频合成
    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(分流)
  • 参数配置如:“outputs=2”
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/avfiltergraph.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;

    // input yuv
    FILE* inFile = NULL;
    const char* inFileName = "F:\\Avenger4_1_YUV420P_480x320.yuv";
    //errno_t Errno = fopen_s(&inFile, inFileName, "rb+");
    inFile = fopen(inFileName, "rb");
    if (!inFile) {
   
        printf("Fail to open file\n");
        return -1;
    }

    int in_width = 480;
    int in_height = 320;

    // output yuv
    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;
    }

    //1.注册过滤器
    avfilter_register_all();

    //2.创建一个过滤器图层,管理所有过滤器
    AVFilterGraph* filter_graph = avfilter_graph_alloc();
    if (!filter_graph) {
   
        printf("Fail to create filter graph!\n");
        return -1;
    }

    //3.获取一个用于AVFilterGraph输入的过滤器
    // source filter,源头过滤器,过滤器参数 一般为图像格式信息
    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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值