如何为OpenCV的VideoWriter动态选择可用的编解码器?

时间:2017-09-01 00:09:41

标签: c++ opencv wxwidgets

我正在编写一个图像处理应用程序来对齐一组图像,我希望能够将这些图像写入视频。图像处理部分在OpenCV 3.2.0(C ++)中完成,并且当前输出的静止图像不会被拼接在一起。

我已成功将VideoWriter与我的机器可用的其中一个编解码器一起用于将输出图像写入.avi,但据我所知,无法保证任何编解码器都可在不同平台上使用。由于我希望能够共享此应用程序,这是一个问题。

如果重要的话,GUI是在wxWidgets 3.1.0中构建的,所以如果有什么东西可以帮助我,那是我找不到的,我很想知道。

我的假设是,如果没有以某种方式在应用程序中发送编解码器,就无法保证成功的视频,但有没有办法在运行时浏览可用的编解码器?

我知道在某些平台上,以下内容会显示一个额外的编解码器对话框,如果我可以自动解释它,那将是完美的:

/api/shipments/withNotes

但这并不适用于每个平台。那么有没有办法在运行时从机器上擦除可用的编解码器,或者我是否必须以某种方式提供编解码器以便跨平台编写视频?

1 个答案:

答案 0 :(得分:0)

OpenCV中没有这样的功能列出所有可用的编解码器。但是,如果您在计算机上设置了ffmpeg或LibAV - 就像构建/安装OpenCV时那样 - 那么您可以使用ffmpeg / LibAV列出所有可用的编解码器。以下是执行此操作的代码:

#include <iostream>

extern "C" {
    #include <libavcodec/avcodec.h>
}

int main(int argc, char **argv)
{
    /* initialize libavcodec, and register all codecs and formats */
    avcodec_register_all();

    // struct to hold the codecs
    AVCodec* current_codec = NULL;

    // initialize the AVCodec* object with first codec
    current_codec = av_codec_next(current_codec);

    std::cout<<"List of codecs:"<<std::endl;

    // loop over all codecs
    while (current_codec != NULL)
    {

        if(av_codec_is_encoder(current_codec) | av_codec_is_decoder(current_codec))
        {
            std::cout<<current_codec->name<<std::endl;
        }
        current_codec = av_codec_next(current_codec);
    }
}

编译:

g ++ listcodecs.cpp -o listcodecs`pkg-config libavcodec --cflags --libs`