Encoding 如何将AVFrame输出为JPEG图像

Encoding 如何将AVFrame输出为JPEG图像,encoding,ffmpeg,jpeg,libavcodec,libavformat,Encoding,Ffmpeg,Jpeg,Libavcodec,Libavformat,我正在写一个从视频流中提取图像的程序。到目前为止,我已经知道了如何寻找正确的帧,解码视频流,并将相关数据收集到AVFrame结构中。我现在正试图将数据写成JPEG图像,但我的代码不起作用。我从这里得到的代码是: 而且这些图像仍然没有被写入。根据Github的要点,一位评论员声称元数据没有写入JPEG图像,但我应该如何写入此元数据?我确实设置了编码上下文的宽度和高度,所以我不确定为什么它声称没有设置尺寸。JPEG2000不是jpeg。要对JPEG图像进行编码,请使用AV_CODEC_ID_MJPE

我正在写一个从视频流中提取图像的程序。到目前为止,我已经知道了如何寻找正确的帧,解码视频流,并将相关数据收集到AVFrame结构中。我现在正试图将数据写成JPEG图像,但我的代码不起作用。我从这里得到的代码是:


而且这些图像仍然没有被写入。根据Github的要点,一位评论员声称元数据没有写入JPEG图像,但我应该如何写入此元数据?我确实设置了编码上下文的宽度和高度,所以我不确定为什么它声称没有设置尺寸。

JPEG2000不是jpeg。要对JPEG图像进行编码,请使用AV_CODEC_ID_MJPEG。MJPEG代表“运动JPEG”,这是构成视频流的JPEG图像序列的典型名称。

JPEG2000不是JPEG。要对JPEG图像进行编码,请使用AV_CODEC_ID_MJPEG。MJPEG代表“运动JPEG”,这是构成视频流的JPEG图像序列的典型调用方式。

如果打印出宽度和高度,输出的值有意义吗?你也做了些什么来检查进入的帧是否正确?如果你打印出宽度和高度,输出的值有意义吗?还有,你有没有做过任何检查来检查帧是否正确?谢谢!我最终使用了MJPEG并使其正常工作。谢谢!我最终使用了MJPEG并使其正常工作。
int save_frame_as_jpeg(AVCodecContext *pCodecCtx, AVFrame *pFrame, int FrameNo) {
    AVCodec *jpegCodec = avcodec_find_encoder(AV_CODEC_ID_JPEG2000);
    if (!jpegCodec) {
        return -1;
    }
    AVCodecContext *jpegContext = avcodec_alloc_context3(jpegCodec);
    if (!jpegContext) {
        return -1;
    }

    jpegContext->pix_fmt = pCodecCtx->pix_fmt;
    jpegContext->height = pFrame->height;
    jpegContext->width = pFrame->width;

    if (avcodec_open2(jpegContext, jpegCodec, NULL) < 0) {
        return -1;
    }
    FILE *JPEGFile;
    char JPEGFName[256];

    AVPacket packet = {.data = NULL, .size = 0};
    av_init_packet(&packet);
    int gotFrame;

    if (avcodec_encode_video2(jpegContext, &packet, pFrame, &gotFrame) < 0) {
        return -1;
    }

    sprintf(JPEGFName, "dvr-%06d.jpg", FrameNo);
    JPEGFile = fopen(JPEGFName, "wb");
    fwrite(packet.data, 1, packet.size, JPEGFile);
    fclose(JPEGFile);

    av_free_packet(&packet);
    avcodec_close(jpegContext);
    return 0;
}
[jpeg2000 @ 0x7fd6a4015200] dimensions not set
[jpeg2000 @ 0x7fd6a307c400] dimensions not set
[jpeg2000 @ 0x7fd6a5800000] dimensions not set
[jpeg2000 @ 0x7fd6a307ca00] dimensions not set
[jpeg2000 @ 0x7fd6a3092400] dimensions not set