我一直在尝试从视频中提取图像,但不是从具有PNG编解码器的图像中提取图像。我的代码与使用JPEG的代码一起正常工作。 avcodec_receive_frame
工作成功,但是帧的数据就像垃圾一样?在处理PNG时,是否需要对脱胶做一些特殊的事情?
在Program.exe中的0x00007FFF7DF34B9A(msvcrt.dll)上引发的异常:0xC0000005:在我的avcodec_send_frame
函数中调用saveImage
时访问冲突读取位置0x00000000000003F0,这意味着我正在访问无效或未分配的内存猜测。这是怎么发生的?
假设所有函数调用都返回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);