Encodage de plusieurs flux vidéo avec une seule invocation avconv

1

J'ai joué avec avconv sur Ubuntu et je peux maintenant, par exemple, enregistrer le bureau avec le son d'une carte son. Une chose que je voulais faire était d'enregistrer deux entrées vidéo en même temps, par exemple le bureau et la webcam. J'ai pensé à faire quelque chose comme ça:

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

Je pensais que si vous définissez plusieurs entrées vidéo et que le format .mkv peut gérer plusieurs flux vidéo, avconv encodera deux flux vidéo et un flux audio dans un seul fichier. Mais ce n'est pas ce qui se passe:

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.

Je ne suis pas sûr qu'il s'agisse d'une question de mappage (quelques options -map à ajouter?) Ou que avconv ne peut tout simplement pas encoder plus d'un flux vidéo à la fois. Donc, est-ce une limitation avconv réelle, ou une limitation des conteneurs disponibles, ou bien je ne trouve tout simplement pas la bonne combinaison d'options de ligne de commande?

automates
la source
Essayez de -map 0:0 -map 1:0 -map 2:0voir ce qu'il fait. Vous avez besoin essentiellement de retrouver tous les flux d'entrée (entrée 0, 1, 2) dans le flux de sortie. Je ne peux pas le tester car je n'ai ni avconvni un système Linux à partir duquel x11grab, mais il semble qu'il n'enregistre que x11grab et l'audio pour le moment.
slhck

Réponses:

0

Ce n'est pas une bonne idée de mélanger les options d'entrée et de sortie. Espérons que vous remarquerez qu'avconv convertit votre audio en Vorbis plutôt qu'en FLAC - c'est parce qu'il pense que vous essayez de le définir comme codec audio de votre périphérique video4linux et qu'il l'ignore comme une option non valide. Vous seriez également mieux servi en utilisant x264 comme encodeur vidéo. Puisque vous utilisez Ubuntu, IIRC, vous devriez l'avoir dans les extras ubuntu-restricted.

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

Par défaut, avconv sélectionne un seul flux vidéo et un seul flux audio (et un seul sous-titre s'il en existe un) à générer. -map 1 -map 2 -map 0lui dit de prendre chaque flux des trois premières entrées (il commence à compter à partir de 0).

Ce n'est pas directement pertinent (puisque chacune de vos entrées ne contiendra qu'un seul flux), mais vous pouvez également sélectionner des flux individuels à partir des entrées avec -map: -map 0:1mappera le deuxième flux du premier fichier audio, -map 1:amappera chaque flux audio de la deuxième entrée, -map 2:v:1mappera le deuxième flux vidéo de la troisième entrée et -map 3:smappera tous les sous-titres de la quatrième entrée.

L'ordre dans lequel vous utilisez les -mapdrapeaux est important. dans l'exemple ci-dessus, j'ai fait en sorte que l'entrée audio soit mappée en troisième, en plaçant ce -mapdernier.

Si vous rencontrez des problèmes de ralentissement de l'enregistrement sur votre écran x264 (il ne devrait pas l'être à moins que vous n'ayez un ordinateur très à la limite de la limite), vous pouvez essayer de le changer -preseten ultra-rapide ou ultra-rapide, ce qui vous donnera un encodage plus rapide et moins gourmand en ressources processeur. Si cela ne fonctionne pas, vous pouvez utiliser -c:v huffyuv- c'est un codec vidéo sans perte, l'équivalent vidéo de FLAC, et vous donnera une taille de fichier vraiment ridicule; mais vous pouvez ré-encoder plus tard avec un codec moins pénible.

vilsoup
la source