本文用libavfilter转换原始视频格式。程序输入一个原始视频文件:yuv文件,yuv420p格式,宽高848x480。输出:rgb文件,rgb24格式,宽高1696x960。
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/opt.h>
#define INPUT_WIDTH 848
#define INPUT_HEIGHT 480
#define INPUT_FORMAT AV_PIX_FMT_YUV420P
static int init_filter_graph(AVFilterGraph **graph, AVFilterContext **src,
AVFilterContext **sink)
{
char *filter_descr = "scale=1696:960";
char args[512];
int ret = 0;
AVFilterGraph *filter_graph;
AVFilterContext *buffer_ctx;
AVFilterContext *buffersink_ctx;
const AVFilter *buffersrc = avfilter_get_by_name("buffer");
const AVFilter *buffersink = avfilter_get_by_name("buffersink");
AVFilterInOut *outputs = avfilter_inout_alloc();
AVFilterInOut *inputs = avfilter_inout_alloc();
enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_RGB24, AV_PIX_FMT_NONE };
AVRational time_base = (AVRational){1, 25};
filter_graph = avfilter_graph_alloc();
if (!outputs || !inputs || !filter_graph) {
ret = AVERROR(ENOMEM);
goto end;
}
snprintf(args, sizeof(args),
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=0/1",
INPUT_WIDTH, I