codec - FFMPEG中帧和包的区别

标签 codec libavcodec libav libavformat

我正在尝试使用 LibAV 解码 mpeg 视频文件。有两个术语我无法正确理解,镜框 数据包 .

按照我目前的理解,镜框 是未压缩的视频帧和 数据包是压缩帧。

问题 :

  • 数据包有多个帧,对吗?
  • 一个帧可以只是一个数据包的一部分吗?我指的是一半的帧信息在packet1中,另一半在packet2中的情况?是否可以?
  • 我们如何知道 LibAV 中一个数据包中有多少帧?
  • 最佳答案

    回答您的第一和第三个问题:

  • 根据 doc for the AVPacket class : "对于视频,它通常应该包含一个压缩帧。对于音频,它可能包含多个压缩帧。
  • decode video example给出了读取数据包中所有帧的代码;你也可以用它来计算帧数:

  • static void decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt,
                       const char *filename)
    {
        char buf[1024];
        int ret;
        ret = avcodec_send_packet(dec_ctx, pkt);
        if (ret < 0) {
            fprintf(stderr, "Error sending a packet for decoding\n");
            exit(1);
        }
        while (ret >= 0) {
            ret = avcodec_receive_frame(dec_ctx, frame);
            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                return;
            else if (ret < 0) {
                fprintf(stderr, "Error during decoding\n");
                exit(1);
            }
            printf("saving frame %3d\n", dec_ctx->frame_number);
            fflush(stdout);
            /* the picture is allocated by the decoder. no need to
               free it */
            snprintf(buf, sizeof(buf), filename, dec_ctx->frame_number);
            pgm_save(frame->data[0], frame->linesize[0],
                     frame->width, frame->height, buf);
        }
    }
    

    关于codec - FFMPEG中帧和包的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53574798/

    相关文章:

    c++ - 在 FFmpeg/Libav 中监听端口

    c - FFMPEG:视频解码器解析器的工作原理

    ffmpeg - 管道视频输出为普通文件

    visual-studio - 扩展 Win Embedded CE 6.0 的媒体功能

    FFMPEG - AVFrame 到每个 channel 数组的转换

    c - 使用ffmpeg c连接视频和音频时如何计算pts和dts

    video - DirectShow - 它是什么?

    php - 如何使用 avconv 连接一系列视频

    iphone - 调用avcodec_encode_video时的EXC_BAD_ACCESS

    go - 链接到libavformat的最小Cgo应用程序意外执行