2012-03-26 4 views
3

Ich habe ein Array von RGB-Daten von glReadPixels() generiert.
Beachten Sie, dass RGB-Daten pixelgepackt sind (r1, g1, b1, r2, g2, b2, ...).Wie schreibe ich YUV 420 Video Frames von RGB-Daten mit OpenCV oder anderen Bildverarbeitungs-Bibliothek?

Wie kann ich schnell einen YUV-Videoframe mit OpenCV oder einer anderen C++ - Bibliothek schreiben, sodass ich sie zu FFMPEG streamen kann? Das Konvertieren von RGB-Pixeln in YUV-Pixel ist kein Problem, da viele Konvertierungsformeln online verfügbar sind. Allerdings ist das Schreiben des YUV-Frames das Hauptproblem für mich. Ich habe seit den letzten Tagen versucht, den YUV-Videoframe zu schreiben und war dabei nicht erfolgreich.

Dies ist eine meiner anderen Frage über das Schreiben YUV-Frame und die Probleme, die ich begegnete: Issue with writing YUV image frame in C/C++ Ich weiß nicht, was ist falsch mit meinem aktuellen Ansatz beim Schreiben der YUV-Frame in eine Datei.

Jetzt möchte ich vielleicht vorhandene Bibliothek (falls vorhanden) verwenden, die eine RGB-Daten akzeptiert, und konvertieren Sie sie in YUV und schreiben Sie den YUV-Frame direkt in eine Datei oder eine Rohrleitung. Natürlich wäre es viel besser, wenn ich mein vorhandenes Programm reparieren könnte, um den YUV-Frame zu schreiben, aber Sie wissen, es gibt auch einen Termin in jedem Software-Entwicklungsprojekt, also ist Zeit auch eine Priorität für mich und meine Projektteammitglieder.

+0

Haben Sie swscale in FFMPEG versucht? Konvertieren von Pixelformat und Skalieren von Bildern mit swscale benötigt nur 3 Zeilen Code. – BlueWanderer

+1

Warum müssen Sie YUV Daten zu FFmpeg streamen? Warum füttern Sie nicht einfach die RGB-Daten? – TheJuice

+0

Zum Schreiben eines YUV-Rahmens ist keine Bibliothek erforderlich. Sie haben gesagt, Sie können die RGB-Daten in Y, U und V konvertieren. Schreiben Sie diese Daten einfach in eine Datei in der gleichen Reihenfolge. Sie können das U & V-Subsampling durchführen, indem Sie die alternativen Werte verwenden. Dann brauchen Sie nur einen guten YUV-Player, um diese Datei anzuzeigen. Ich habe das mehrere Male gemacht, es ist sehr einfach. – nac

Antwort

0

OpenCV unterstützt nicht das YUV-Format direkt, wie Sie wissen, es ist also wirklich an Ihnen, einen Weg zu finden RGB < zu tun -> YUV Konvertierungen.

This is a very interesting post wie es zeigt, wie YUV-Frames auf der Platte, laden und zu erstellen, während die Daten als IplImage speichern.

0

ffmpeg schreibt eine AVI-Datei mit YUV, aber wie Karl sagt, gibt es in openCV keine direkte Unterstützung dafür.

Alternativ (und möglicherweise einfacher) können Sie einfach die rohen UYVY-Werte in eine Datei schreiben und dann mit ffmpeg in ein beliebiges Format konvertieren, das in AVI/MP4 konvertiert werden soll. Es ist auch möglich, direkt in eine Pipe zu schreiben und ffmpeg direkt von Ihrer App aus aufzurufen. Vermeiden Sie die temporäre yuv-Datei

zB. einen HD YUV422 Strom zu einem h264 MP4-Datei mit 30fps

ffmpeg -pix_fmt yuyv422 -s 1920x1080 -i input.yuv -vcodec libx264 -x264opts -r 30 output.mp4

+0

Also habe ich eine OpenGL-Anwendung ausgeführt, und ich möchte die Animationsanzeige erfassen (mit glReadPixels), dann möchte ich diese Daten zu FFMPEG pipe und verwenden Sie Red5, um es als RTMP-Live-Streaming zu einem Webbrowser zu streamen. Ich erfuhr von kylecodes.com/2007/pipe-ffmpeg und anderen verwandten Websites, dass FFMPEG RTMP Streaming-Daten über Pipe empfangen kann, aber die Daten müssen in YUV-Video-Frames-Format codiert werden. Könnten Sie mich in die richtige Richtung führen? Hier ist mein aktueller Ansatz http://stackoverflow.com/questions/9858388/ den ich von http://wiki.multimedia.cx/index.php?title=YUV4MPEG2 –

+0

@all_by_grace verwiesen - wenn Sie einen Bildschirm in RGB lesen Wäre es nicht einfacher, diese Werte direkt zu schreiben? ffmpeg und openCV können beide Videos aus RGB-Pixelformaten erstellen. PS: Sie werden in keinem Fall in der Lage sein, eine sehr hohe Framerate zu bewältigen, es sei denn, Sie haben ein sehr ausgefallenes Raid-System –

2

FFmpeg erhalten glücklich RGB-Daten in Sie können sehen, welche Pixelformate FFmpeg unterstützt, indem Sie zu konvertieren.

ffmpeg -pix_fmts 

Jeder Eintrag mit einem I in der ersten Spalte kann als Eingabe verwendet werden.

Da Sie die Pixel-Bittiefe nicht angegeben haben, gehe ich davon aus, dass es sich um 8-Bit handelt und verwenden Sie das rgb8 Pixelformat. So bekommen FFmpeg RGB8 Daten lesen von stdin Sie den folgenden Befehl verwenden würde (ich bin cat ing Daten in, aber Sie würden über die Pfeife beliefern):

cat data.rgb | ffmpeg -f rawvideo -pix_fmt rgb8 -s WIDTHxHEIGHT -i pipe:0 output.mov 

Da es sich um ein rohes Pixelformat ohne Framing , müssen Sie WIDTH und HEIGHT für die entsprechenden Werte Ihrer Bilddimensionen subsititieren, damit FFmpeg weiß, wie die Daten zu umrahmen sind.

Ich habe die Ausgabe als eine MOV-Datei angegeben, aber Sie müssten Ihre FFmpeg/Red5-Ausgabe entsprechend konfigurieren.