2012-04-15 6 views
3

Ich habe mit der Aufnahme von Screencasts mit FFmpegs X11grab-Modul experimentiert, was bisher mehr oder weniger gut funktioniert hat. Ich verstehe, dass die A/V-Kodierung ein komplexer Prozess mit vielen feinen Details ist, aber ich tue mein Bestes, um zu lernen.FFmpeg Screencast Aufzeichnung: Welche Codecs zu verwenden?

Ich möchte eine "leichte" Aufnahme eines Videostreams machen, die so wenig wie möglich auf das System belastet, während der Stream aufgezeichnet wird. Ich nehme zwei Audiostreams getrennt mit pacat und sox auf. Später wird das Ganze gefiltert, normalisiert, codiert und zu einem Matroska-Container kombiniert.

Im Moment habe ich ffmpeg einen Rawvideo-Stream aufnehmen, um zu x264 yuv4 demuxer gefüttert werden. Ich experimentierte mit ffv1 und straight x264 Aufnahme vor. Mein System kann die Echtzeit-Kodierung mit x264 für die Einstellungen, die ich für den endgültigen Stream benötige, nicht verarbeiten. Daher muss ich nach Abschluss der Aufzeichnung erneut komprimieren. Ich habe festgestellt, dass ffv1 mich schrecklich Frame fallen lässt, und Yuv4 auch, aber weniger. Ich vermute, dass dies auf die Festplattengeschwindigkeit zurückzuführen ist, selbst wenn ich in einem SATA3 Caviar Black sitze, der ausschließlich zum Speichern der aufgezeichneten Daten verwendet wird.

Die Frage ist, welche Kombination von Video-Codecs sollte ich betrachten? Record gerade in x264 und recompress zu "besser" x264 später? Rohes Video, dann komprimieren? Wie gehe ich vor, um Probleme wie die Frame Drops zu identifizieren, die ich erlebt habe?

EDIT: Dies ist die ffmpeg Linie, die ich derzeit verwende.

ffmpeg -v warning -f x11grab -s 1920x1080 -r 30000/1001 -i :0.0\ 
-vcodec rawvideo -pix_fmt yuv420p -s 1280x720\ 
-threads 0\ 
recvideo.y4m 
+0

Wie lautet die Auflösung Ihres Screencasts? –

+0

Ich nehme den gesamten Bildschirm bei 1080p auf und skaliere im laufenden Betrieb auf 720p. – mkaito

+0

https://trac.ffmpeg.org/wiki/StreamingGuide erwähnt einige gute Codecs zu verwenden – rogerdpack

Antwort

3

Haben Sie versucht http://en.wikipedia.org/wiki/Huffyuv?

Wissen Sie, ob Ihr Problem die CPU- oder Festplattenbandbreite ist? Wie hoch ist die Datenrate, die Sie auf die Festplatte schreiben möchten? Wie viel CPU benötigt ffmpeg für deinen Codec bei deiner Bitrate und Einstellungen? Ich nehme an, Sie notieren den Computer nicht im Leerlauf - wie viel Ressourcen hat es für die Aufnahme übrig?

Geben Sie zum Testen der Laufwerkschreibvorschrift einfach 100 MB hinzu, lesen Sie 100 MB von /dev/urandom hinein und schreiben Sie den Puffer in die Datei auf dieser Festplatte, während sich die Festplatte im Leerlauf befindet. Messen Sie, wie lange der Schreibvorgang dauert (das Lesen aus dem Urzustand dauert einige Zeit). Linux hat Writeback, was bedeutet, dass es alle 5 Sekunden schmutzige Seiten auf die Festplatte löscht, nicht sobald Sie schreiben. Mit fdatasync (oder voller fsync) erhalten Sie die Echtzeit, bis die Daten auf der Festplatte sind.

Warum können Sie die CPU-Nutzung von ffmpeg nicht sehen? Wie wäre es mit der Aufnahme einer Minute eines Terminalfensters mit top? Wenn nicht, wie wäre es mit perf record -a sleep 60 in einem Terminal, dann umschalten, was Sie tun, eine Minute aufzeichnen, gefolgt von perf report?

BEARBEITEN: Ich benutzte avconv -v warning -f x11grab -s 1680x1050 -r 30000/1001 -i :0.0 -vcodec ffvhuff -s 1280x720 -threads 0 capture.mkv und es funktionierte großartig, in RGB aufzunehmen. Sie können dann offline in H.264 in YUV umwandeln, Dual-Pass für maximale Qualität usw. Ich habe ungefähr 24MB/Sek., Aber es scheint Single-Threading zu sein. Mein Core2 @ 2.3Ghz ist in Ordnung.

+0

Ja, ich habe versucht, huffyuv. Ich behalte zwei meiner vier Kerne für ffmpeg während der Aufnahme. Außerdem ging es bei meiner Frage darum, die Probleme aufzuzeigen, die ich habe, was bedeutet, dass ich keine Ahnung habe, ob es CPU- oder HDD-bezogen ist. Ich bin mir auch nicht sicher, ob ich die Datenrate finden kann, die zum Schreiben auf die Festplatte verwendet wird. – mkaito

+1

Sie konvertieren RGB (native Pixel) in YUV. Versuchen Sie in RGB aufzunehmen.Die CPU-Nutzung sollte so einfach sein wie das Ausführen von 'top' (oder' htop' oder 'perf record -a sleep 60' aus Linux-Tools) während der Aufnahme. Die Disk-Schreibrate in Bytes pro Sekunde ist die Größe der Datei, die Sie in einer Minute geteilt durch 60 dividieren. Eine Disk sollte in der Lage sein, mit 100 MB/s zu schreiben (sequenziell, wenn sie nur dafür verwendet wird und keine anderen Arbeiten, einschließlich Leseoperationen, ausführt) , das veranlasst es zu suchen). –

+0

YUV4 mag nicht (A) RGB-Pixel-Format. x264 wird außer einem rohen y4m-Stream nichts essen, und ffmpeg wählt automatisch yuv420p, wenn er angibt, x264 zu verwenden. Die Videodateigröße beträgt ungefähr 2,30 GB pro Minute. Was bedeutet, dass es um 40Mb/s schreibt. htop meldet, dass die Kerne, die zu ffmpeg gehören, jeweils zu etwa 30% geladen werden. – mkaito

Verwandte Themen