FFmpeg-avcodec_receive_frame返回0,但帧无效

时间:2019-07-09 02:53:33

标签: ffmpeg decode

我一直在尝试从视频中提取图像,但不是从具有PNG编解码器的图像中提取图像。我的代码与使用JPEG的代码一起正常工作。 avcodec_receive_frame工作成功,但是帧的数据就像垃圾一样?在处理PNG时,是否需要对脱胶做一些特殊的事情?

在Program.exe中的0x00007FFF7DF34B9A(msvcrt.dll)上引发的异常:0xC0000005:在我的avcodec_send_frame函数中调用saveImage时访问冲突读取位置0x00000000000003F0,这意味着我正在访问无效或未分配的内存猜测。这是怎么发生的?

enter image description here

假设所有函数调用都返回0,直到引发异常为止。

解码:

bool ImageExtractor::decode() {
    // some other code here
    ret = avcodec_send_packet(codec_ctx, packet); // returned 0
    ret = avcodec_receive_frame(codec_ctx, frame); // returned 0
    if (ret == 0) {
        if (count >= target_frame) {
            snprintf(buf, sizeof(buf), "%s/%d.png", destination.toLocal8Bit().data(), count);
            saveImage(frame, buf); // a function that writes images on disk 
       }
    // some other code here
}


bool ImageExtractor::saveImage(AVFrame *frame, char *destination) {
     AVFormatContext *imgFmtCtx = avformat_alloc_context();
     pFormatCtx->oformat = av_guess_format("mjpeg", NULL, NULL);

     // some other code here

    if (!frame)
        std::cout << "invalid frame \n";

    if (!imgCodecCtx) // AV_CODEC_ID_MJPEG(7)
        std::cout << "invalid codec ctx \n";

    ret = avcodec_send_frame(imgCodecCtx, frame); // everything stopped here
}

解复用:

avformat_open_input(&format_ctx, source.toLocal8Bit(), nullptr, nullptr);
vsi = av_find_best_stream(format_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
codec_par = avcodec_parameters_alloc();
avcodec_parameters_copy(codec_par, format_ctx->streams[vsi]->codecpar);

AVCodec* codec = avcodec_find_decoder(codec_par->codec_id); // AV_CODEC_ID_PNG(61)
codec_ctx = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codec_ctx, codec_par);
avcodec_parameters_free(&codec_par);
avcodec_open2(codec_ctx, codec, 0);

0 个答案:

没有答案