ilostmyid2 Ответов: 1

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 доступен, в инактивированном блоке я перечислил доступные кодеки.

1 Ответов

Рейтинг:
2

ilostmyid2

Я использую встроенную видеокарту intel в некоторых системах, и мне нужно, чтобы моя программа также работала на них. Возможно ли это?

ilostmyid2

Ссылка, которую вы ввели, не отвечает на мой вопрос. Пожалуйста, будьте более конкретны. Спасибо

RickZeeland

Я думаю, что вы можете лучше разместить свой вопрос на форуме ffmpeg, так как это кажется конкретной проблемой ffmpeg.

ilostmyid2

К сожалению нет видео, форум! Вы верите? По крайней мере, я их не нашел. Для ffmpeg есть чат или список рассылки, но я не смог найти Форум для этого.

RickZeeland

Это действительно необычно, обычно на GitHub есть опция "проблемы". Однако, похоже, есть IRC-канал: https://ffmpeg.org/contact.html#Forums
Не спрашивайте меня об этом, я никогда не использовал IRC ...
Нашел один здесь: https://ffmpeg.zeranoe.com/forum/