2009-03-24 7 views
4

Ich versuche gstreamer 0.10 von Python zu verwenden, um gleichzeitig eine v4l2-Videoquelle anzuzeigen und sie in xvid-in-avi aufzunehmen. Über einen langen Zeitraum würde der Computer schnell genug sein, um dies zu tun, aber wenn ein anderes Programm die Platte verwendet, löscht es Frames. Das ist schlimm genug, aber bei der Wiedergabe gibt es im Video Bewegungen, in denen Frames gelöscht wurden, anstatt die Frames anzuzeigen, die wir mit einer niedrigeren Framerate kodieren konnten.Wie kann ich Live-Videos mit gstreamer aufnehmen, ohne Frames zu verlieren?

Die Pipeline ist v4l2src ! capsfilter ! tee ! queue ! xvidenc ! avimux ! filesink und das Tee sinkt auch auf queue ! xvimagesink sync=false. Ich habe versucht, videorate vor xvidenc hinzuzufügen, aber das scheint die Dinge noch schlimmer zu machen.

Ich habe erwogen, das unkomprimierte Video in dieser Pipeline auf die Festplatte zu spulen und es in einem Hintergrund-Thread zu codieren. Was könnte ich noch tun, um dieses Problem zu lösen? Ist xvidenc oder avimux die falsche Sache mit ausgelassenen Rahmen? Könnte ich die Größe der Warteschlange vor meinem Encoder drastisch erhöhen?

Antwort

5

tee wird blockiert, wenn einer der Blöcke blockiert, so ist es wahrscheinlich Ihr Engpass. Ich schlage vor, den Stream zu schreiben, der länger dauert, um auf Platte zu kodieren und von dort zu kodieren.

+0

Wie würden Sie chunk die Ausgabe so kann jeder Chunk so schnell gelöscht werden, da sie umcodiert wurde? – joeforker

+1

Ich habe die Umstellung auf Bewegung jpeg beendet. Die Komprimierung ist schrecklich, aber sie überfordert die CPU nicht. – joeforker

1

und Sie müssen xvimagesink schreiben, xvimagesync nicht

+0

ein einfacher Speling-Fehler – joeforker