encoding - 如何将 AVFrame 写为 JPEG 图像

标签 encoding ffmpeg jpeg libavcodec libavformat

我正在编写一个程序来从视频流中提取图像。到目前为止,我已经弄清楚如何寻找正确的帧、解码视频流并将相关数据收集到 AVFrame 结构中。我现在正试图将数据写成 JPEG 图像,但我的代码不起作用。我得到的代码来自这里:https://gist.github.com/RLovelett/67856c5bfdf5739944ed

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;
}

如果我使用该代码,我得到的第一个错误是关于 time_baseAVCodecContext没有被设置。我将其设置为视频解码的时基 AVCodecContext结构。现在我收到另一个错误
[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

并且图像仍然没有被写入。从那个 Github Gist 中,一位评论者声称元数据没有被写入 JPEG 图像,但是我应该如何编写这个元数据呢?我确实设置了编码上下文的宽度和高度,所以我不确定为什么它声称没有设置尺寸。

最佳答案

JPEG2000 不是 jpeg。要编码 JPEG 图像,请使用 AV_CODEC_ID_MJPEG。 MJPEG 代表“运动 JPEG”,通常称为组成视频流的 JPEG 图片序列。

关于encoding - 如何将 AVFrame 写为 JPEG 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40472653/

相关文章:

date - 使用文件名将 exif 日期添加到 jpeg

asp.net - 编码问题asp.net

python - 如何处理 Selenium 中的奇怪字符? 'utf8' 编解码器无法解码位置 0 中的字节 0xc3 :

delphi - 是否有 Delphi EncodeDate/DecodeDate 函数版本可以处理 B.C.日期?

ffmpeg - 如何让 strftime 工作?到目前为止没有任何工作

python - FFMPEG Loudnorm 读取 JSON 数据

python - OpenCV 中保存的 webp 图像比 jpg 大 3 倍

java - 如何在Javafx应用程序中显示特殊字符

python - 杀死 python ffmpeg 子进程会破坏 cli 输出

java - 如何实现jpeg无损?