971108 - ffmpeg не использует графический процессор
Я получил последнюю версию двоичных файлов ffmpeg от здесь[^]. Когда я изучаю использование CPU и GPU при воспроизведении видео с помощью его ffplay, я вижу, что GPU используется во время воспроизведения. Не слишком большое использование процессора также указывает на это. Но когда я получаю исходники последней версии с исходного сайта, я не могу использовать GPU. Чтобы уточнить, я включаю программу тестирования игроков, которую я писал до сих пор. Когда я раскомментирую строку, которая включает avcodec_find_decoder_by_name("h264_cuvid"), я получаю ошибку -1. Ошибка происходит в avcodec_open2 с описанием операции не разрешена.
CString format(const char *fmt, ...) { va_list ap; va_start(ap, fmt); char buf[512]; vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return buf; } int CplayerDlg::play() { FILE *fp = fopen("video_files/1010.brf", "rb"); if (!fp) { AfxMessageBox("can't open video file"); return -1; } RecordFrame frame; RecordHeader hdr; fread(&frame, sizeof(frame), 1, fp); if (frame.frameType != FRAME_TYPE_HEADER) { AfxMessageBox("record file doesn't begin with header"); return -1; } fread(&hdr, sizeof(hdr), 1, fp); GetDlgItem(IDC_DIM)->SetWindowText(format("%dx%d", hdr.width, hdr.height)); GetDlgItem(IDC_CODEC_ID)->SetWindowText(format("%d", hdr.codecId)); GetDlgItem(IDC_PIXEL_FORMAT)->SetWindowText(format("%d", hdr.pixelFormat)); GetDlgItem(IDC_TIMEBASE)->SetWindowText(format("%d/%d", hdr.timebaseNum, hdr.timebaseDen)); AVCodec *pCodec; #if 0 #define CHECK(decoder)\ pCodec = avcodec_find_decoder_by_name(#decoder);\ AfxMessageBox(pCodec ? #decoder " found" : "can't find " #decoder); CHECK(h264_cuvid); #undef CHECK #endif pCodec = avcodec_find_decoder(AV_CODEC_ID_H264); //pCodec = avcodec_find_decoder_by_name("h264_cuvid"); if (!pCodec) { AfxMessageBox("can't find h264 decoder"); return -1; } AVCodecContext *pCodecContext = avcodec_alloc_context3(pCodec); if (!pCodecContext) { AfxMessageBox("can't allocate codec context"); return -1; } #if 0 // enumerating available codecs //av_register_all(); avcodec_register_all(); AVCodec *current_codec = av_codec_next(NULL); while (current_codec != NULL) { TRACE("%s\n", current_codec->name); current_codec = av_codec_next(current_codec); } #endif int err = avcodec_open2(pCodecContext, pCodec, NULL); if (err != 0) { char buf[AV_ERROR_MAX_STRING_SIZE]; av_make_error_string(buf, AV_ERROR_MAX_STRING_SIZE, err); char buf2[AV_ERROR_MAX_STRING_SIZE]; sprintf(buf2, "%d (%x): %s\n", err, err, buf); AfxMessageBox(buf2); return -1; } AfxMessageBox("operation completed successfully"); fclose(fp); return 0; }
Что я уже пробовал:
Как видите, чтобы убедиться, что кодек h264_cuvid доступен, в инактивированном блоке я перечислил доступные кодеки.