【问题标题】:How do I dynamically select an available codec for OpenCV's VideoWriter?如何为 OpenCV 的 VideoWriter 动态选择可用的编解码器?
【发布时间】:2025-05-04 08:35:01
【问题描述】:

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

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

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

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

我知道在某些平台上,以下会弹出一个附加编解码器的对话框,如果我能自动解释它,那将是完美的:

cv::Size outputSize = myImage.size();
cv::VideoWriter("output.avi", -1, 30, outputSize);

但这也不适用于每个平台。那么有什么方法可以在运行时从机器上清除可用的编解码器,还是我必须以某种方式提供编解码器才能跨平台编写视频?

【问题讨论】:

  • 您可以尝试将编解码器与您的软件一起提供,但您需要先检查其许可证。另外,请检查您将如何在 *nix/Mac 中获得所有这些。
  • 我相信.avi 容器中的MJPG 编解码器内置于OpenCV 3.0 及更高版本...*.com/a/31401095/2836621

标签: c++ opencv wxwidgets


【解决方案1】:

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`

【讨论】:

    最近更新 更多