ffmpeg gdigrab 支持预建库

问题描述 投票:0回答:1

我正在使用带有 MSVC 编译器的 Windows 64 的 build,我需要使用

gdigrab
使用 C++ 代码捕获屏幕,但我可以看到:

Error: Input format not found: gdigrab

所以只需使用

gdigrab
的代码进行检查:

const AVInputFormat *fmt = nullptr;
void *opaque = nullptr;

while ((fmt = av_demuxer_iterate(&opaque))) {
    qDebug() << fmt->name;
}

但不打印 gdigrab

然后我使用

检查 ffmpeg 的构建配置
.\ffmpeg.exe -buildconf

不包括

--enable-gdigrab

但是当我检查格式为 arg 的 ffmpeg exe 时

.\ffmpeg.exe -formats

给出结果

D d gdigrab GDI API Windows frame grabber

这表示

gdigrab
与 ffmpeg exe 一起存在。我也可以用这个exe进行屏幕截图。

Windows 的构建是否未启用 gdigrab,如果不是,

ffmpeg.exe
如何捕获屏幕?我假设库和二进制文件是使用相同的配置构建的。

编辑 从这里https://github.com/BtbN/FFmpeg-Builds/issues/428我知道没有配置,

--enable-gdigrab

由于 ffmpeg.exe 适用于 gdigrab,因此与库链接的代码也应该可以工作。

这是我的简单屏幕录制代码。

    avformat_network_init();
    
    AVFormatContext *formatCtx = nullptr;
    AVDictionary *options = nullptr;
    
    const char *inputSource = "desktop";
    const char *inputFormat = "gdigrab";

    // Initialize options
    av_dict_set(&options, "video_size", "800x600", 0);
    av_dict_set(&options, "offset_x", "100", 0);
    av_dict_set(&options, "offset_y", "100", 0);
    av_dict_set(&options, "framerate", "30", 0);

    // Debug options
    char *dump = nullptr;
    av_dict_get_string(options, &dump, '=', ',');
    qDebug() << "Options: " << dump;
    av_free(dump);


    const AVInputFormat *fmt = nullptr;
    void *opaque = nullptr;

    while ((fmt = av_demuxer_iterate(&opaque))) {
        qDebug() << fmt->name;
    }


    // Find input format
   const  AVInputFormat *inputFmt = av_find_input_format(inputFormat);
    if (!inputFmt) {
        qDebug() << "Error: Input format not found:" << inputFormat;
    }

    // Open input
    int ret = avformat_open_input(&formatCtx, inputSource, inputFmt, &options);
    if (ret < 0) {
        char errbuf[AV_ERROR_MAX_STRING_SIZE];
        av_strerror(ret, errbuf, sizeof(errbuf));
        qDebug() << "Error: Unable to open input source:" << inputSource << ", " << errbuf;
        return;
    }

它总是打印

Error: Input format not found: gdigrab
Error: Unable to open input source: desktop ,  No such file or directory
c++ ffmpeg
1个回答
0
投票

我没有初始化avdevice。添加以下代码后,它就起作用了。

avdevice_register_all();
© www.soinside.com 2019 - 2024. All rights reserved.