[WITH PARTIAL ANTWORT AKTUALISIERT]
Hier ist mein Code:Get Frame von Video mit libvlc smem und konvertieren Sie es zu opencv Mat. (C++)
void cbVideoPrerender(void *p_video_data, uint8_t **pp_pixel_buffer, int size) {
// Locking
imageMutex.lock();
videoBuffer = (uint8_t *)malloc(size);
*pp_pixel_buffer = videoBuffer;
}
void cbVideoPostrender(void *p_video_data, uint8_t *p_pixel_buffer
, int width, int height, int pixel_pitch, int size, int64_t pts) {
// Unlocking
imageMutex.unlock();
Mat img = Mat(Size(width,height), CV_8UC3, p_pixel_buffer);
//cvtColor(img,img,CV_RGB2BGR);
}
int main(int argc, char ** argv)
{
libvlc_instance_t * inst;
char smem_options[1000];
sprintf(smem_options
, "#transcode{vcodec=RV24}:smem{"
"video-prerender-callback=%lld,"
"video-postrender-callback=%lld,"
"video-data=%lld,"
"no-time-sync},"
, (long long int)(intptr_t)(void*)&cbVideoPrerender
, (long long int)(intptr_t)(void*)&cbVideoPostrender //This would normally be useful data, 100 is just test data
, (long long int)200 //Test data
);
const char * const vlc_args[] = {
"-I", "dummy", // Don't use any interface
"--ignore-config", // Don't use VLC's config
"--extraintf=logger", // Log anything
"--verbose=1", // Be verbose
"--sout", smem_options // Stream to memory
};
// We launch VLC
inst = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
...
return 0;
}
FRAGE AKTUALISIERT
Ich habe meine zwei Callback-Funktionen korrekt ausgeführt zu sein scheinen.
_Welche Daten werden von RV32 genau ausgegeben? Ist es die CV_8U3C passen (unsigned 8bits int 3-Kanal hier erforderlich _DO Ich brauche einen Schritt auf meine Matte Klasse hinzuzufügen (Schritt? - Anzahl der Bytes jeder Matrixzeile belegt)
Aktualisiertvor 2
Ich änderte RV32 zu RV24 Das macht mehr Sinn.Ich füge cvtColor hinzu, weil die MAT-Matrix BGR-Pixel und nicht RGB zu brauchen scheint, aber das Bild nicht korrekt angezeigt wird
_Ist da ein Vcodec, der mir ein YUV-Format als Ausgabe geben würde, damit ich das Pixel testen kann Daten vor dem Versuch, eine opencv ausgeben :: Mat img?
[EDIT OUTPUT IMG] (Durch Ändern vlc Typ zu CV_8UC4 vier Kanal (weiß nicht warum) können wir fast den Rahmen sehen, aber in wirklich schlechter Qualität Warum ist das so?
[SOLUTION]
fand ich heraus, dass die Bilder am Anfang meines Videos von schlechter Qualität waren, deshalb ist meine Mat imshow() hat mir gezeigt, so hässlich, was der Code oben sollte nun funktionieren (Apperently nicht nötig cvtColor)
afaik, die Pixel sind in p_pixel_buffer, nicht in p_video_data. auch, sollte nicht die Entsperrung() gehen * nach * Setzen der Mat-Pixel? – berak
Ich hatte auch diesen Gedanken, aber wie gebe ich mein Pixel-Array an den Mat-Konstruktor? – grll
auf die gleiche Weise, Sie tun es jetzt. Ändere einfach die Variablen – berak