Kodierung mehrerer Videoströme mit einem einzigen avconv-Aufruf

3151
automatthias

Ich habe mit avconv auf Ubuntu gespielt und kann jetzt zB den Desktop mit Sound von einer Soundkarte aufnehmen. Ich wollte zwei Videoeingänge gleichzeitig aufnehmen, zum Beispiel den Desktop und von der Webcam. Ich dachte daran, so etwas zu tun:

avconv \ -f alsa \ -i default \ -acodec flac \ -f video4linux2 \ -r 6 \ -i /dev/video0 \ -f x11grab \ -i :0.0 \ out.mkv 

Ich denke, wenn Sie mehrere Videoeingänge definieren und das .mkv-Format mehrere Videoströme verarbeiten kann, codiert avconv 2 Videoströme und 1 Audiostrom in eine Datei. Aber das passiert nicht:

avconv version 0.8.4-6:0.8.4-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:11 with gcc 4.7.2 [alsa @ 0x1091bc0] capture with some ALSA plugins, especially dsnoop, may hang. [alsa @ 0x1091bc0] Estimating duration from bitrate, this may be inaccurate Input #0, alsa, from 'default': Duration: N/A, start: 1354364317.020350, bitrate: N/A Stream #0.0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s [video4linux2 @ 0x10923e0] Estimating duration from bitrate, this may be inaccurate Input #1, video4linux2, from '/dev/video0': Duration: N/A, start: 100607.724745, bitrate: 29491 kb/s Stream #1.0: Video: rawvideo, yuyv422, 640x480, 29491 kb/s, 6 tbr, 1000k tbn, 6 tbc [x11grab @ 0x107b2a0] device: :0.0+83,87 -> display: :0.0 x: 83 y: 87 width: 854 height: 480 [x11grab @ 0x107b2a0] shared memory extension found [x11grab @ 0x107b2a0] Estimating duration from bitrate, this may be inaccurate Input #2, x11grab, from ':0.0+83,87': Duration: N/A, start: 1354364318.488382, bitrate: 196761 kb/s Stream #2.0: Video: rawvideo, bgra, 854x480, 196761 kb/s, 15 tbr, 1000k tbn, 15 tbc Incompatible pixel format 'bgra' for codec 'mpeg4', auto-selecting format 'yuv420p' [buffer @ 0x107fcc0] w:854 h:480 pixfmt:bgra [avsink @ 0x10bdf00] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out' [scale @ 0x10dc680] w:854 h:480 fmt:bgra -> w:854 h:480 fmt:yuv420p flags:0x4 Output #0, matroska, to '.../out.mkv': Metadata: encoder : Lavf53.21.0 Stream #0.0: Video: mpeg4, yuv420p, 854x480, q=2-31, 4000 kb/s, 1k tbn, 15 tbc Stream #0.1: Audio: libvorbis, 48000 Hz, 2 channels, s16 Stream mapping: Stream #2:0 -> #0:0 (rawvideo -> mpeg4) Stream #0:0 -> #0:1 (pcm_s16le -> libvorbis) Press ctrl-c to stop encoding [mpeg4 @ 0x10bd800] rc buffer underflow ^Cframe= 160 fps= 15 q=2.0 Lsize= 3414kB time=10.66 bitrate=2623.0kbits/s  video:3273kB audio:131kB global headers:4kB muxing overhead 0.165600% Received signal 2: terminating. 

Ich bin mir nicht sicher, ob es sich um das Mapping handelt (einige -map-Optionen zum Hinzufügen?) Oder dass avconv nicht mehr als einen Videostream auf einmal codieren kann. Ist es also eine tatsächliche Einschränkung von avconv oder eine Einschränkung der verfügbaren Container, oder finde ich einfach nicht die richtige Kombination von Befehlszeilenoptionen?

1
Versuchen Sie `-map 0: 0 -map 1: 0 -map 2: 0` und sehen Sie, was es tut. Grundsätzlich müssen Sie alle Eingabeströme (Eingabe "0", "1", "2") dem Ausgabestrom zuordnen. Ich kann es nicht testen, da ich weder avconv noch ein Linux-System zu x11grab habe, aber es sieht so aus, als würde es gerade x11grab und das Audio aufnehmen. slhck vor 11 Jahren 0

1 Antwort auf die Frage

0
evilsoup

Es ist keine gute Idee, Eingabe- und Ausgabeoptionen zu mischen. Hoffentlich stellen Sie fest, dass avconv Ihre Audiodaten in Vorbis statt in FLAC konvertiert. Dies liegt daran, dass Sie den Audiocodec Ihres video4linux-Geräts als ungültig eingestuft haben und dies als ungültige Option ignorieren. Sie können auch x264 als Video-Encoder verwenden. Da Sie Ubuntu, IIRC verwenden, sollten Sie es als Teil von Ubuntu-eingeschränkten Extras haben.

avconv -f alsa -i default -f video4linux2 -r 6 -i /dev/video0 -f x11grab -i 0:0 \ -map 1 -map 2 -map 0 \ -c:a flac -c:v libx264 -crf 23 -preset veryfast output.mkv 

Standardmäßig wählt avconv nur einen Videostrom und einen Audiostrom (und einen Untertitelstrom, falls vorhanden) für die Ausgabe aus. -map 1 -map 2 -map 0Bittet ihn, jeden Stream von den ersten drei Eingängen zu nehmen (beginnt mit 0 zu zählen).

Dies ist nicht direkt relevant (da jede Ihrer Eingaben nur einen Stream enthält), Sie können jedoch auch einzelne Streams aus den Eingängen auswählen mit -map: -map 0:1Der zweite Stream wird aus dem ersten Audio zugeordnet, -map 1:ajeder Audio-Stream wird aus dem zweiten Eingang zugeordnet. -map 2:v:1ordnet den zweiten Videostrom vom dritten Eingang und -map 3:salle Untertitel vom vierten Eingang zu.

Die Reihenfolge, in der Sie die -mapFlaggen verwenden, ist wichtig. Im obigen Beispiel habe ich es so gemacht, dass der Audioeingang durch das Platzieren als -mapletztes zugewiesen wird .

Wenn Sie mit x264 Probleme haben, Ihre Bildschirmaufnahme zu verlangsamen (dies sollte nur möglich sein, wenn Sie einen Computer mit Borderline-Obsolet-Funktion haben), können Sie versuchen, die Einstellung -presetauf superschnell oder ultraschnell zu ändern. Beides führt zu einer schnelleren / weniger CPU-intensiven Codierung Wenn dies nicht funktioniert, können Sie es ausprobieren. Dies -c:v huffyuvist ein verlustfreier Videocodec, das Video-Äquivalent von FLAC, und Sie erhalten wirklich lächerliche Dateigrößen. Sie können jedoch später in einen weniger schmerzhaften Codec codieren.