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, когда вы получаете эту ошибку?