FFmpeg + cpp, как получить список моих графических процессоров, обрабатывающих h264_nvenc?

Я пишу приложение для использования на ПК с более чем одним графическим процессором, я пытаюсь получить список индексов графического процессора, которые могут декодировать поток в h264, чтобы назначить все новые источники видео поровну между всеми доступными графическими процессорами.

Я нашел, как это сделать в командной строке, но мне нужно написать строку, принадлежащую ей на С ++

ffmpeg -vsync 0 -i input.mp4 -c:v h264_nvenc -gpu list -f null –

Мне нужно, чтобы он динамически передавал его av_hwdevice_ctx_create(AVBufferRef**,char *int)

Кто-нибудь знает как это сделать?

1 ответ

Насколько я знаю, вам не нужно явно передавать устройство в

av_hwdevice_ctx_create  (   
        AVBufferRef **  device_ctx,
        enum AVHWDeviceType     type,
        const char *    device,
        AVDictionary *  opts,
        int     flags 
)   

то device_ctxможет быть NULL, потому что создается здесь. Вам нужно только знать, какой тип вы хотите. напримерAV_HWDEVICE_TYPE_CUDA. Остальные параметры могут быть NULL или 0. По крайней мере, так это сделано в примере hw_decode:

static AVBufferRef *hw_device_ctx = NULL;
//...
static int hw_decoder_init(AVCodecContext *ctx, const enum AVHWDeviceType type)
{
    int err = 0;
    if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
                                  NULL, NULL, 0)) < 0) {
        fprintf(stderr, "Failed to create specified HW device.\n");
        return err;
    }
    ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
    return err;
}

(Примечание: я сам не использовал эту функцию. Я просто основываю свой ответ на том, как это делается в примере.)

Другие вопросы по тегам