ilostmyid2 Ответов: 0

971130 - я получаю ошибку недопустимого аргумента в avcodec_send_packet


В следующем коде:
int CplayerDlg::play()
{
	FILE *fp = fopen("video_files/1010.brf", "rb");
	ASSERT(fp);

	RecordFrame rf;
	RecordHeader hdr;
	ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);
	ASSERT(rf.frameType == FRAME_TYPE_HEADER);
	ASSERT(fread(&hdr, sizeof(hdr), 1, fp) == 1);
	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));

	AVHWDeviceType type = av_hwdevice_find_type_by_name("dxva2");
	ASSERT(type != AV_HWDEVICE_TYPE_NONE);
	AVCodec *decoder = avcodec_find_decoder(AV_CODEC_ID_H264);
	ASSERT(decoder);
	for (int i = 0;; i++)
	{
		const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);
		ASSERT(config);
		if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&
			config->device_type == type)
		{
			hw_pix_fmt = config->pix_fmt;
			break;
		}
	}
	AVCodecContext *decoder_ctx = avcodec_alloc_context3(decoder);
	ASSERT(decoder_ctx);
	decoder_ctx->get_format = get_hw_format;
	ASSERT(!av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0));
	decoder_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);
	ASSERT(!avcodec_open2(decoder_ctx, decoder, NULL));
	AVPacket packet;
	av_init_packet(&packet);
	char buf[100000];
	AVFrame *frame = av_frame_alloc();
	ASSERT(frame);
	while (true)
	{
		ASSERT(fread(&rf, sizeof(rf), 1, fp) == 1);
		ASSERT(rf.frameType == FRAME_TYPE_STREAM);
		ASSERT(fread(buf, rf.frameSize, 1, fp) == 1);
		packet.data = (uint8_t *) buf;
		packet.size = rf.frameSize;
		packet.flags = rf.flags;
		packet.dts = packet.pts = rf.timestamp;
		ASSERT(!avcodec_send_packet(decoder_ctx, &packet));
		ASSERT(!avcodec_receive_frame(decoder_ctx, frame));
	}
	fclose(fp);
	av_frame_free(&frame);
	return 0;
}


Что я уже пробовал:

Я получаю ошибку -22 в avcodec_send_packet. Формат файла является пользовательским, но формат кадров такой же, как и то, что я получил ранее от IP-камеры (H264). Я вдохновил код из hw_decode.c из источников ffmpeg. Что я упустил?

Richard MacCutchan

Что означает ошибка -22?

ilostmyid2

Недопустимый аргумент

Richard MacCutchan

Глядя на документацию (FFmpeg: Ссылка На Структуру AVPacket[^]), Я подозреваю, что ваш указатель буфера не является допустимым FFmpeg: Ссылка На Структуру AVBufferRef[^].

ilostmyid2

Прежде чем я пришел сюда, чтобы увидеть ваш комментарий, я попробовал использовать оболочку FFmpegInvoke в проекте C# с той же работой, и на этот раз она сработала!
Моя конечная цель состояла в том, чтобы преобразовать код в C# после получения от него успешного результата. Теперь, когда код C# работает, я не забочусь о коде C++.

ilostmyid2

Но затем возникает другая проблема. Я получаю следующую ошибку при декодировании пакетов:
[h264 @ 007ecf00] ошибка при декодировании MB 68 3, bytestream -6
[кодек H264 @ 007ecf00] сокрытие 3341 постоянного тока, переменного тока 3341, 3341 МВ ошибок в кадр
[h264 @ 007ecf00] ошибка при декодировании MB 67 4, bytestream -9
[кодек H264 @ 007ecf00] сокрытие 3262 постоянного тока, переменного тока, 3262, 3262 ошибок МВ в я кадр
....
Это происходит, когда я вызываю FFmpegInvoke.avcodec_send_packet, а не когда я вызываю FFmpegInvoke.avcodec_receive_frame.

Richard MacCutchan

Извините, но я не знаю ffmpeg. Вам нужно посмотреть документацию для подсказок. Кроме того, поищите сайт поддержки, который специализируется на этом продукте.

ilostmyid2

ладно все равно спасибо

Michael Haephrati

Каково значение frameSize, когда вы получаете эту ошибку?

0 Ответов