日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最简单的基于FFmpeg的AVfilter的例子-修正版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

代碼是參考雷神的博客的代碼,不過由于ffmpeg版本不同,記錄使用中遇到的問題。

?

1.調(diào)用avfilter_get_by_name("ffbuffersink")時在新版本的ffmpeg要修改為avfilter_get_by_name("buffersink");否則返回指針為空,調(diào)用avfilter_graph_create_filter返回-12,在以前的版本則沒有這個問題。


2.調(diào)用avfilter_graph_parse_ptr解析字幕水印時返回-22,ffmpeg報錯No such filter: 'drawtext',這是由于編譯的時候沒有開啟FreeType字體引擎庫,編譯的時候./configure--enable-libfreetype。

?

3.調(diào)用avfilter_graph_parse_ptr解析參數(shù)時返回-2,drawtext=fontfile=arial.ttf:fontcolor=red:fontsize=30:text='Lei Xiaohua':x=50:y=50里面的arial.ttf是字體文件,要保證字體文件在程序可以找到的目錄,冒號在里面是分隔符,路徑中不能帶冒號。

?

4.編譯完ffmpeg后可能沒有l(wèi)ibpostproc.so這個庫,編譯的時候加入開啟這個庫的編譯選項--enable-postproc。

?

5.代碼

// test_avfilter.cpp : 定義控制臺應(yīng)用程序的入口點。 //#include "stdafx.h"/** * 最簡單的基于FFmpeg的AVFilter例子 - 純凈版 * Simplest FFmpeg AVfilter Example - Pure * * 雷霄驊 Lei Xiaohua * leixiaohua1020@126.com * 中國傳媒大學(xué)/數(shù)字電視技術(shù) * Communication University of China / Digital TV Technology * http://blog.csdn.net/leixiaohua1020 * * 本程序使用FFmpeg的AVfilter實現(xiàn)了YUV像素數(shù)據(jù)的濾鏡處理功能。 * 可以給YUV數(shù)據(jù)添加各種特效功能。 * 是最簡單的FFmpeg的AVFilter方面的教程。 * 適合FFmpeg的初學(xué)者。 * * 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 <stdio.h>#define __STDC_CONSTANT_MACROS#ifdef _WIN32 #define snprintf _snprintf //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#pragma comment(lib,"avcodec.lib") #pragma comment(lib,"avformat.lib") #pragma comment(lib,"avutil.lib") #pragma comment(lib,"avfilter.lib") #pragma comment(lib,"swscale.lib") #pragma comment(lib,"SDL2.lib") #pragma comment(lib,"SDL2main.lib")int main(int argc, char* argv[]) {getchar();int ret;AVFrame *frame_in;AVFrame *frame_out;unsigned char *frame_buffer_in;unsigned char *frame_buffer_out;AVFilterContext *buffersink_ctx;AVFilterContext *buffersrc_ctx;AVFilterGraph *filter_graph;static int video_stream_index = -1;//Input YUVFILE *fp_in = fopen("trans.yuv", "rb+");if (fp_in == NULL) {printf("Error open input file.\n");return -1;}int in_width = 1588;int in_height = 900;//Output YUVFILE *fp_out = fopen("output.yuv", "wb+");if (fp_out == NULL) {printf("Error 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=red:fontsize=30:text='Lei Xiaohua':x=50:y=50";avfilter_register_all();char args[512];AVFilter *buffersrc = avfilter_get_by_name("buffer");AVFilter *buffersink = avfilter_get_by_name("buffersink");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;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);ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",args, NULL, filter_graph);if (ret < 0) {printf("Cannot 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;ret = avfilter_graph_create_filter(&buffersink_ctx, buffersink, "out",NULL, buffersink_params, filter_graph);av_free(buffersink_params);if (ret < 0) {printf("Cannot 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;if ((ret = avfilter_graph_parse_ptr(filter_graph, filter_descr,&inputs, &outputs, NULL)) < 0)return ret;if ((ret = avfilter_graph_config(filter_graph, NULL)) < 0)return ret;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,Vframe_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;if (av_buffersrc_add_frame(buffersrc_ctx, frame_in) < 0) {printf("Error while add frame.\n");break;}/* pull filtered pictures from the filtergraph */ret = av_buffersink_get_frame(buffersink_ctx, frame_out);if (ret < 0)break;//output Y,U,Vif (frame_out->format == AV_PIX_FMT_YUV420P) {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);}}printf("Process 1 frame!\n");av_frame_unref(frame_out);}fclose(fp_in);fclose(fp_out);av_frame_free(&frame_in);av_frame_free(&frame_out);avfilter_graph_free(&filter_graph);return 0; }

?

5.效果圖

?

6.參考資料

http://blog.csdn.net/leixiaohua1020/article/details/50618190

?

總結(jié)

以上是生活随笔為你收集整理的最简单的基于FFmpeg的AVfilter的例子-修正版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性猛交ⅹxxx富婆视频 | 免费的黄色av | 亚洲精品国产福利 | 天天透天天干 | 天天干狠狠插 | 天天摸天天做天天爽水多 | 久久综合欧美 | 亚洲一区不卡在线 | 精品无码人妻一区二区免费蜜桃 | 欧美一级啪啪 | 日韩中文字幕二区 | 免费无码国产精品 | av成人在线网站 | 黑丝av在线 | 欧美日韩成人一区二区三区 | 欧美人妻精品一区二区三区 | 中国性猛交 | 精品无码av一区二区三区 | 人妻精品久久久久中文字幕69 | 三上悠亚在线播放 | 日韩资源 | av免播放器 | 亚洲av毛片成人精品 | 男女污网站 | 手机看片福利视频 | 国产91热爆ts人妖在线 | 欧美日本韩国一区二区 | 国产视频在 | 黄色av播放| 婷婷丁香激情 | 国模小黎自慰gogo人体 | 久久综合久久综合久久 | va免费视频| 国产91九色 | 国产精品久久久久久久久久久久久久久久 | 91丝袜呻吟高潮美腿白嫩 | 国产视频最新 | 免费裸体美女网站 | 丝袜老师让我了一夜网站 | 欧美成人生活片 | 毛片www | 日韩黄色片子 | 无码精品人妻一区二区 | 日本在线不卡一区二区三区 | 欧美 亚洲 另类 偷偷 自拍 | 亚洲精品偷拍视频 | 日日夜夜噜 | 国产成人精品免高潮在线观看 | 日本久久一区二区 | 美国av毛片 | 二男一女一级一片 | 色七七久久 | 亚洲欧美经典 | 免费国产a | 黄视频在线观看免费 | 日韩精品视频在线观看免费 | 欧美亚洲影院 | 超碰91在线观看 | 黄色片视频免费观看 | 一级特黄妇女高潮2 | 国产在线观 | 日韩 国产 一区 | 视频一区二区视频 | 久久6精品| 欧美人与动物xxx | 丁香亚洲 | 无码黑人精品一区二区 | 久久久老熟女一区二区三区91 | 久久久久久久国产 | 在线播放黄色网址 | 精品一性一色一乱农村 | 免费在线观看av网址 | 夜夜草网站 | 51ⅴ精品国产91久久久久久 | 亚洲欧洲日韩国产 | 伊人开心网| 免费看黄视频的网站 | 四虎精品成人免费网站 | 免费三级黄 | 亚洲美女在线观看 | 精品福利一区二区三区 | 男人av资源网 | www性 | 天堂中文字幕av | a√在线视频 | 色欲狠狠躁天天躁无码中文字幕 | 97久久人人超碰caoprom欧美 | 中文字幕在线观看三区 | 青草青草久热 | 国产色在线 | 麻豆免费av| 四虎永久在线精品免费一区二区 | 亚洲美女黄色片 | a级片在线免费观看 | 午夜资源| 免费午夜网站 | 欧美日韩精品久久久免费观看 | 久久精品韩国 | 九色在线观看 |