我正在使用带有 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
我没有初始化avdevice。添加以下代码后,它就起作用了。
avdevice_register_all();