int main(int argc, char* argv[]) { AVFormatContext *pFormatCtx; AVDeviceInfoList*pDeviceList; AVInputFormat *ifmt; AVDictionary* options = NULL; AVOutputFormat *ofmt; av_register_all(); avdevice_register_all(); pFormatCtx = avformat_alloc_context(); av_dict_set(&options, "list_devices", "true", 0); ifmt = av_find_input_format("gdigrab"); if (avformat_open_input(&pFormatCtx, "title=D:\\project\\fftest\\fftest\\bin\\list_devices.exe", ifmt, &options) != 0) { printf("open dshow error\n"); //return -1; } //pFormatCtx->iformat = ifmt; avdevice_list_devices(pFormatCtx, &pDeviceList); avdevice_list_input_sources(ifmt, "desktop", options, &pDeviceList); ofmt = av_guess_format("dshow", NULL, NULL); avdevice_list_output_sinks(ofmt, NULL, NULL, &pDeviceList); return 0; }
static int list_devices_for_context(AVFormatContext *s, AVDictionary *options, AVDeviceInfoList **device_list) { AVDictionary *tmp = NULL; int ret; av_dict_copy(&tmp, options, 0); if ((ret = av_opt_set_dict2(s, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0) goto fail; ret = avdevice_list_devices(s, device_list); fail: av_dict_free(&tmp); avformat_free_context(s); return ret; }
QVector<QPair<QString, QString>> CameraDevice::getRawDeviceListGeneric() { QVector<QPair<QString, QString>> devices; if (!getDefaultInputFormat()) return devices; // Alloc an input device context AVFormatContext *s; if (!(s = avformat_alloc_context())) return devices; if (!iformat->priv_class || !AV_IS_INPUT_DEVICE(iformat->priv_class->category)) { avformat_free_context(s); return devices; } s->iformat = iformat; if (s->iformat->priv_data_size > 0) { s->priv_data = av_mallocz(s->iformat->priv_data_size); if (!s->priv_data) { avformat_free_context(s); return devices; } if (s->iformat->priv_class) { *(const AVClass**)s->priv_data= s->iformat->priv_class; av_opt_set_defaults(s->priv_data); } } else { s->priv_data = NULL; } // List the devices for this context AVDeviceInfoList* devlist = nullptr; AVDictionary *tmp = nullptr; av_dict_copy(&tmp, nullptr, 0); if (av_opt_set_dict2(s, &tmp, AV_OPT_SEARCH_CHILDREN) < 0) { av_dict_free(&tmp); avformat_free_context(s); } avdevice_list_devices(s, &devlist); if (!devlist) { qWarning() << "avdevice_list_devices failed"; return devices; } // Convert the list to a QVector devices.resize(devlist->nb_devices); for (int i=0; i<devlist->nb_devices; i++) { AVDeviceInfo* dev = devlist->devices[i]; devices[i].first = dev->device_name; devices[i].second = dev->device_description; } avdevice_free_list_devices(&devlist); return devices; }