FFMPEG中帧与数据包之间的差异

pse*_*ler 5 codec libavcodec libav libavformat

我正在尝试使用LibAV解码mpeg视频文件。我无法正确理解两个术语:FramesPackets

根据我目前的理解,是未压缩的视频帧,数据包是已压缩的帧。

问题

  • 数据包有多个帧,对吗?
  • 一帧只能是一个数据包的一部分吗?我指的是帧信息的一半在数据包1中,另一半在数据包2中的情况?可能吗?
  • 我们如何知道LibAV中一个数据包中有多少帧?

Rém*_*tin 9

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

  • 根据该类的文档AVPacket “对于视频,它通常应包含一个压缩帧。对于音频,它可能包含多个压缩帧。
  • 解码视频示例给出了读取数据包内所有帧的代码;您还可以使用它来计算帧数:
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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*anD 7

基本上,帧是自然的,而数据包是人造的。

\n

帧是重要的,数据包是辅助的\xe2\x80\x93,它们帮助通过可接受大小的较小部分连续处理流(而不是作为一个整体处理流)。\xe2\x80\x9c分而治之。\xe2\x80\x9d

\n

在此输入图像描述

\n
\n

数据包有多个帧,对吗?

\n
\n

数据包可能有多个(编码的)帧,也可能只有一个,甚至不完整。

\n
\n

一帧只能是一个数据包的一部分吗?

\n
\n

不。它可能分布在多个数据包中。参见 框架1见图中的

\n
\n

我指的是一半帧信息在packet1中,另一半在packet2中的情况?是否可以?

\n
\n

是的。参见框架1

\n
\n

我们如何知道 LibAV 中的数据包中有多少帧?

\n
\n

在不同的多媒体文件中,每个数据包的帧可能不同,这取决于特定流的编码方式。

\n

即使在同一个流中,也可能存在具有不同数量(编码)帧的数据包\xe2\x80\x93 比较数据包 0数据包 1

\n

数据包中没有包含其包含多少(编码)帧的信息。

\n

同一数据包中的帧通常具有不同的大小(如上图所示),因此数据包不是相同的元素(帧)的数组。

\n