2012-03-28 2 views
3

Я получаю Frames в цикле и декодирую его с ffmpeg, получая AVFrame в качестве результата.ffmpeg AVFrame получить полные декодированные данные в char *

Поэтому я должен получить необходимые пиксельные данные кадра в char * и указать в качестве параметра функции обратного вызова. Итак, как я могу создать такой массив char *? В интернете я видел несколько примеров, таких как:

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

или что-то вроде этого. Это правда? И какой размер будет моим символом *? Как я вижу, мы пишем ширину * 3 * высоты байтов?

+0

В зависимости от формата рамки. В каком формате? – mattjgalloway

ответ

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

Да, это правильно.
Это запись строки 3 байт/пиксель (предположительно RGB) из указателя AVFrame-> data.

пс. Причина этого заключается в том, что начало каждой строки данных начинается с новой границы памяти 4 байта - компьютер более эффективен при доступе к памяти в виде кратных 32 бит (4 байта). Итак, если ваш размер пикселя (3 байта) и ширина не кратные 4, вам нужно сделать это, а не просто скопировать width*height*3 байтов данных.

+0

Как я понял, это формат PPM пиксельных данных. Как я могу сохранить данные полного пикселя в BMP, например ...? – mmmaaak

+0

@mmmaaak - PPM - это самый простой формат для записи напрямую. BMP по сути то же самое, но с более сложным заголовком, если вы на окнах, lib уже содержит код для записи bmps, просто найдите msdn –

+0

Связанный ответ: http://stackoverflow.com/questions/1047200/extract-rgb-values -из-а-avframe-FFmpeg-в-C – Nav

Смежные вопросы