Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LibAV/FFMpeg中的覆盖过滤器返回C中的奇怪(三倍)帧_C_Image Processing_Ffmpeg_Libav - Fatal编程技术网

LibAV/FFMpeg中的覆盖过滤器返回C中的奇怪(三倍)帧

LibAV/FFMpeg中的覆盖过滤器返回C中的奇怪(三倍)帧,c,image-processing,ffmpeg,libav,C,Image Processing,Ffmpeg,Libav,我试图制作一个程序,它合并了两个帧。我在Windows764和VisualStudio2013下使用LibAV(LibAV-win32-20140428)。 但结果很奇怪 使用的过滤器是覆盖的。当我将图形更改为只使用一个流并添加淡入淡出效果的图形时,一切都像一种魅力。但覆盖层和抽屉给了我奇怪的变形(一个三帧,黑白效果)。代码如下: static int init_filter_graph(AVFilterGraph **pGraph, AVFilterContext **pSrc1, AVFi

我试图制作一个程序,它合并了两个帧。我在Windows764和VisualStudio2013下使用LibAV(LibAV-win32-20140428)。 但结果很奇怪

使用的过滤器是覆盖的。当我将图形更改为只使用一个流并添加淡入淡出效果的图形时,一切都像一种魅力。但覆盖层和抽屉给了我奇怪的变形(一个三帧,黑白效果)。代码如下:

static int init_filter_graph(AVFilterGraph **pGraph, AVFilterContext **pSrc1, AVFilterContext **pSink)
{
    AVFilterGraph* tFilterGraph;
    AVFilterContext* tBufferContext1;
    AVFilter* tBuffer1;
    AVFilterContext* tColorContext;
    AVFilter* tColor;
    AVFilterContext* tOverlayContext;
    AVFilter* tOverlay;
    AVFilterContext* tBufferSinkContext;
    AVFilter* tBufferSink;

    int tError;

    /* Create a new filtergraph, which will contain all the filters. */
    tFilterGraph = avfilter_graph_alloc();

    if (!tFilterGraph) {
        return -1;
    }

    { // BUFFER FILTER 1
        tBuffer1 = avfilter_get_by_name("buffer");
        if (!tBuffer1) {
            return -1;
        }
        tBufferContext1 = avfilter_graph_alloc_filter(tFilterGraph, tBuffer1, "src1");
        if (!tBufferContext1) {
            return -1;
        }

        av_dict_set(&tOptionsDict, "width", "320", 0);
        av_dict_set(&tOptionsDict, "height", "240", 0);
        av_dict_set(&tOptionsDict, "pix_fmt", "bgr24", 0);
        av_dict_set(&tOptionsDict, "time_base", "1/25", 0);
        av_dict_set(&tOptionsDict, "sar", "1", 0);
        tError = avfilter_init_dict(tBufferContext1, &tOptionsDict);
        av_dict_free(&tOptionsDict);
        if (tError < 0) {
            return tError;
        }
    }

    { // COLOR FILTER
        tColor = avfilter_get_by_name("color");
        if (!tColor) {
            return -1;
        }
        tColorContext = avfilter_graph_alloc_filter(tFilterGraph, tColor, "color");
        if (!tColorContext) {
            return -1;
        }

        av_dict_set(&tOptionsDict, "color", "white", 0);
        av_dict_set(&tOptionsDict, "size", "20x120", 0);
        av_dict_set(&tOptionsDict, "framerate", "1/25", 0);
        tError = avfilter_init_dict(tColorContext, &tOptionsDict);
        av_dict_free(&tOptionsDict);
        if (tError < 0) {
            return tError;
        }
    }

    { // OVERLAY FILTER
        tOverlay = avfilter_get_by_name("overlay");
        if (!tOverlay) {
            return -1;
        }
        tOverlayContext = avfilter_graph_alloc_filter(tFilterGraph, tOverlay, "overlay");
        if (!tOverlayContext) {
            return -1;
        }

        av_dict_set(&tOptionsDict, "x", "0", 0);
        av_dict_set(&tOptionsDict, "y", "0", 0);
        av_dict_set(&tOptionsDict, "main_w", "120", 0);
        av_dict_set(&tOptionsDict, "main_h", "140", 0);
        av_dict_set(&tOptionsDict, "overlay_w", "320", 0);
        av_dict_set(&tOptionsDict, "overlay_h", "240", 0);
        tError = avfilter_init_dict(tOverlayContext, &tOptionsDict);
        av_dict_free(&tOptionsDict);
        if (tError < 0) {
            return tError;
        }
    }

    { // BUFFERSINK FILTER
        tBufferSink = avfilter_get_by_name("buffersink");
        if (!tBufferSink) {
            return -1;
        }

        tBufferSinkContext = avfilter_graph_alloc_filter(tFilterGraph, tBufferSink, "sink");
        if (!tBufferSinkContext) {
            return -1;
        }

        tError = avfilter_init_str(tBufferSinkContext, NULL);
        if (tError < 0) {
            return tError;
        }
    }

    // Linking graph
    tError = avfilter_link(tBufferContext1, 0, tOverlayContext, 0);
    if (tError >= 0) {
        tError = avfilter_link(tColorContext, 0, tOverlayContext, 1);
    }
    if (tError >= 0) {
        tError = avfilter_link(tOverlayContext, 0, tBufferSinkContext, 0);
    }
    if (tError < 0) {
        return tError;
    }

    tError = avfilter_graph_config(tFilterGraph, NULL);
    if (tError < 0) {
        return tError;
    }

    *pGraph = tFilterGraph;
    *pSrc1 = tBufferContext1;
    *pSink = tBufferSinkContext;

    return 0;
}
static int init\u filter\u图(AVFilterGraph**pGraph,AVFilterContext**pSrc1,AVFilterContext**pSink)
{
AVFilterGraph*tFilterGraph;
AVFilterContext*tBufferContext1;
AVFilter*tBuffer1;
AVFilterContext*t颜色上下文;
AVFilter*t彩色;
AVFilterContext*到VerlayContext;
AVFilter*tOverlay;
AVFilterContext*tBufferSinkContext;
AVFilter*tBufferSink;
国际恐怖主义;
/*创建一个新的filtergraph,它将包含所有过滤器*/
tFilterGraph=avfilter_graph_alloc();
if(!tFilterGraph){
返回-1;
}
{//缓冲区筛选器1
tBuffer1=avfilter_get_by_name(“缓冲区”);
如果(!tBuffer1){
返回-1;
}
tBufferContext1=avfilter_graph_alloc_filter(tFilterGraph,tBuffer1,“src1”);
如果(!tBufferContext1){
返回-1;
}
av指令集(&TopionsDict,“宽度”,“320”,0);
av指令集(&TopionsDict,“高度”,“240”,0);
视听指令集(&TopionsDict,“pix\U fmt”,“bgr24”,0);
视听指令集(&TopionsDict,“时基”,“1/25”,0);
视听指令集(&TopionsDict,“sar”,“1”,0);
恐怖=avfilter_init_dict(tBufferContext1和TopionsDict);
av_dict_free(&TopionsDict);
如果(恐怖<0){
回归恐怖;
}
}
{//彩色滤光片
tColor=avfilter\u按名称(“颜色”)获取;
如果(!t颜色){
返回-1;
}
tColorContext=avfilter\u graph\u alloc\u filter(tFilterGraph,tColor,“color”);
if(!tColorContext){
返回-1;
}
av指令集(&TopionsDict,“颜色”,“白色”,0);
av指令集(顶部尺寸为“20x120”,0);
av指令集(&TopionsDict,“帧速率”,“1/25”,0);
恐怖=avfilter\u init\u dict(tColorContext和TopionsDict);
av_dict_free(&TopionsDict);
如果(恐怖<0){
回归恐怖;
}
}
{//覆盖过滤器
tOverlay=avfilter_get_by_name(“覆盖”);
如果(!tOverlay){
返回-1;
}
tOverlayContext=avfilter\u graph\u alloc\u filter(tFilterGraph,tOverlay,“覆盖”);
如果(!tOverlayContext){
返回-1;
}
视听指令集(&TopionsDict,“x”,“0”,0);
视听指令集(&TopionsDict,“y”,“0”,0);
视听指令集(&TopionsDict,“主视图”,“120”,0);
视听指令集(&TopionsDict,“主”、“140”和“0”);
av指令集(&TopionsDict,“叠加w”,“320”,0);
av指令集(&TopionsDict,“叠加”,“240”,0);
恐怖=avfilter\u init\u dict(tOverlayContext和TopionsDict);
av_dict_free(&TopionsDict);
如果(恐怖<0){
回归恐怖;
}
}
{//BUFFERSINK过滤器
tBufferSink=avfilter_get_by_name(“buffersink”);
如果(!tBufferSink){
返回-1;
}
tBufferSinkContext=avfilter\u graph\u alloc\u filter(tFilterGraph,tBufferSink,“sink”);
如果(!tBufferSinkContext){
返回-1;
}
tError=avfilter\u init\u str(tBufferSinkContext,NULL);
如果(恐怖<0){
回归恐怖;
}
}
//链接图
恐怖=avfilter_链接(tBufferContext1,0,tOverlayContext,0);
如果(恐怖>=0){
tError=avfilter\u链接(tColorContext,0,tOverlayContext,1);
}
如果(恐怖>=0){
恐怖=avfilter_链接(tOverlayContext,0,tBufferSinkContext,0);
}
如果(恐怖<0){
回归恐怖;
}
恐怖=avfilter\u graph\u config(tFilterGraph,NULL);
如果(恐怖<0){
回归恐怖;
}
*pGraph=tFilterGraph;
*pSrc1=tBufferContext1;
*pSink=tBufferSinkContext;
返回0;
}

你认为原因是什么?

我从卢卡·巴巴托那里得到一个提示:

你能试着用avconv复制吗?从图像上看,你看起来很像 正在得到一种你并不真正期望的像素格式

我发现,我需要使用,来保持像素的格式不变。 所以我补充说:

{ // FORMAT FILTER
    tFormat = avfilter_get_by_name("format");
    if (!tFormat) {
        // Could not find the tFormat filter.
        return -1;
    }

    tFormatContext = avfilter_graph_alloc_filter(tFilterGraph, tFormat, "format");
    if (!tFormatContext) {
        // Could not allocate the tFormat instance.
        return -1;
    }

    av_dict_set(&tOptionsDict, "pix_fmts", "bgr24", 0);
    tError = avfilter_init_dict(tFormatContext, &tOptionsDict);
    av_dict_free(&tOptionsDict);
    if (tError < 0) {
        // Could not initialize the tFormat filter.
        return tError;
    }
}
{//格式过滤器
tFormat=avfilter_get_by_name(“格式”);
如果(!t格式){
//找不到tFormat筛选器。
返回-1;
}
tFormatContext=avfilter\u graph\u alloc\u filter(tFilterGraph,tFormat,“格式”);
如果(!tFormatContext){
//无法分配tFormat实例。
返回-1;
}
av_dict_集(&TopionsDict,“pix_fmts”,“bgr24”,0);
恐怖=avfilter\u init\u dict(tFormatContext和TopionsDict);
av_dict_free(&TopionsDict);
如果(恐怖<0){
//无法初始化tFormat筛选器。
回归恐怖;
}
}
初始化过滤器图函数中

现在我的过滤器图如下所示:

tError = avfilter_link(tBufferContext1, 0, tOverlayContext, 0);
if (tError >= 0)
{
    tError = avfilter_link(tColorContext, 0, tOverlayContext, 1);
}
if (tError >= 0)
{
    tError = avfilter_link(tOverlayContext, 0, tFormatContext, 0);
}
if (tError >= 0)
{
    tError = avfilter_link(tFormatContext, 0, tBufferSinkContext, 0);
}
if (tError < 0) { // Error connecting filters.
    return tError;
}
tError=avfilter_链接(tBufferContext1,0,tOverlayContext,0);
如果(恐怖>=0)
{
tError=avfilter\u链接(tColorContext,0,tOverlayContext,1);
}
如果(恐怖>=0)
{
tError=avfilter\u链接(tOverlayContext,0,tFormatContext,0);
}
如果(恐怖>=0)
{
恐怖=avfilter_链接(tFormatContext,0,tBufferSinkContext,0);
}
如果(错误<0){//连接筛选器时出错。
回归恐怖;
}
失真消失了,颜色恢复了


您也尝试过FFmpeg,还是只是添加了它的标签?@LordNeckbeard嗨,Lord。我还尝试了FFMpeg,效果甚至最差。框架顶部甚至没有白色矩形。这是全部文件