Разница между кадрами и пакетами в FFMPEG

Я пытаюсь декодировать видеофайл mpeg с помощью LibAV. Есть два термина, которые я не могу правильно понять: Фреймы и Пакеты.

Насколько я понимаю, кадры — это несжатые видеокадры, а пакеты — это сжатые кадры.

Вопросы :

  • Пакет имеет несколько фреймов, верно?
  • Может ли кадр быть только частью одного пакета? Я имею в виду случай, когда половина информации кадра находится в пакете 1, а другая половина — в пакете 2? Является ли это возможным?
  • Как мы узнаем, сколько кадров в пакете в LibAV?

person pseudo_teetotaler    schedule 01.12.2018    source источник
comment
вы нашли ответы?   -  person 404pio    schedule 23.10.2019


Ответы (2)


Чтобы ответить на первый и третий вопросы:

  • согласно документу для класса 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);
    }
}
person Rémi Desmartin    schedule 30.05.2020
comment
Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос. Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу, как только у вас будет достаточно репутация. – Из обзора - person Dharman; 30.05.2020

Проще говоря, пакет — это блок данных.

Обычно это определяется пропускной способностью. Если у устройства ограниченная скорость интернета или телефон с прерывистым сигналом, размер пакета будет меньше. Если это настольный компьютер с выделенным сервисом, размер пакета может быть немного больше.

Кадр можно рассматривать как одну ячейку анимации, но, как правило, в наши дни из-за сжатия это не фактическое изображение ключевого кадра, а просто изменения с момента последнего всего ключевого кадра. Они будут отправлять один ключевой кадр, фактическое изображение, примерно раз в несколько секунд, но каждый промежуточный кадр — это просто смешивание данных, указывающих, какие пиксели изменились с момента последнего изображения, дельта.

Итак, допустим, ваш размер пакета составляет 1024 байта, тогда ваше разрешение будет ограничено тем количеством пикселей, для которого поток может нести изменения. Они могут отправлять один кадр на пакет для простоты, но я не думаю, что есть что-то, что абсолютно гарантирует, что, поскольку поток данных реконструируется из этих пакетов, часто не по порядку, а затем дельты кадров генерируются один раз. все эти пакеты собраны вместе.

Аудио занимает гораздо меньше места, чем видео, поэтому им может потребоваться отправить только один аудиопакет на каждые 50 видеопакетов.

Я знаю, что эти ребята сделали несколько роликов о видеопотоках, рекомбинируемых из пакетов, на своем канале -- https://www.youtube.com/watch?v=DkIhI59ysXI

person Doyousketch2    schedule 16.11.2020