Как данные кадра хранятся в libav? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь научиться пользоваться libav. Я следил за самым первым уроком на dranger.com, но в какой-то момент меня немного запутал.

// Write pixel data
for(y=0; y<height; y++)
fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);

Этот код явно работает, но я не совсем понимаю, почему, особенно я не понять, как хранятся данные кадра в pFrame->data, зависит ли это от используемого формата / кода c, почему pFrame->data и pFrame->linesize всегда ссылаются на индекс 0, и почему мы добавляем y к pFrame->data[0].

В учебнике написано

Мы собираемся немного схематично описывать сам формат PPM; поверьте нам, это работает.

Я не уверен, что запись в формате ppm является причиной того, что этот процесс кажется мне таким странным. Было бы очень полезно разъяснить, почему этот код такой и как libav хранит данные кадра. Я не очень хорошо знаком с кодированием / декодированием мультимедиа в целом, поэтому я пытаюсь учиться.

1 Ответ

1 голос
/ 09 июля 2020

в частности, я не понимаю, как хранятся данные кадра в pFrame-> data, независимо от того, зависит ли это от формата / кода c в использовании

Да, это зависит от значения pix_fmt. Некоторые форматы плоские, а другие нет.

почему pFrame-> data и pFrame-> lineize всегда ссылаются на индекс 0,

Если вы посмотрите на структуру , вы увидите, что data - это массив указателей / указатель на указатель. Итак, pFrame->data[0] - это указатель на данные в первой «плоскости». Некоторые форматы, такие как RGB, имеют одну плоскость, где все данные хранятся в одном буфере. Другие форматы, такие как YUV, используют отдельный буфер для каждой плоскости. например, Y = pFrame->data[0], U = pFrame->data[1], pFrame->data[3] Аудио может использовать одну плоскость на канал, et c.

и почему мы добавляем y к pFrame-> data [0].

Поскольку в примере выполняется цикл по изображению построчно, сверху вниз. Чтобы получить указатель на первый пиксель любой строки, вы умножаете размер строки на номер строки, а затем прибавляете его к указателю.

...