2013-10-15 6 views
11

Ich bekomme die allgemeine Idee, dass die frame.data[] je nachdem, welches Pixelformat ist das Video (RGB oder YUV) interpretiert wird. Aber gibt es einen allgemeinen Weg, um alle Pixeldaten vom Rahmen zu erhalten? Ich möchte nur den Hash der Rahmendaten berechnen, ohne ihn zu interpretieren, um das Bild anzuzeigen.Wie bekomme ich rohe Framedaten von AVFrame.data [] und AVFrame.linesize [], ohne das Pixelformat anzugeben?

AVFrame.h Nach:

uint8_t* AVFrame::data[AV_NUM_DATA_POINTERS] 

Zeiger zu den Bild/Kanalebenen.

int AVFrame::linesize[AV_NUM_DATA_POINTERS] 

Für Video, Größe in Bytes jeder Bildzeile.

Bedeutet das, dass, wenn ich nur aus data[i] für linesize[i] Bytes extrahiere, dann bekomme ich die volle Pixelinformationen über den Rahmen?

Antwort

9

linesize[i] enthält Schritt für die i -te Ebene.

den gesamten Puffer zu erhalten, verwenden, um die Funktion von avcodec.h

/** 
* Copy pixel data from an AVPicture into a buffer, always assume a 
* linesize alignment of 1. */ 
int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, 
       int width, int height, 
       unsigned char *dest, int dest_size); 

Verwenden

int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); 

die erforderliche Puffergröße zu berechnen.

+0

Danke, das ist was ich suche: D btw, bedeutet Flugzeug einen Farbkanal wie R/G/B oder Y/U/V? Ich habe versucht, nach der Definition zu suchen, aber mit diesen Schlüsselwörtern habe ich nicht viel Information bekommen. – vivienlwt

+0

siehe meine Antwort auf http://StackOverflow.com/Questions/13286022 – pogorskiy

+0

Wie kommen wir manuell kopieren, ohne 'avpicture_layout', wie' für (Anzahl der vertikalen Zeilen []) {Speicher kopieren bis zu Zeilengröße in einen Puffer und erhöhen Pufferzeiger nach Linesize} 'macht den Job ?? – nmxprime

Verwandte Themen