Codificando múltiplos streams de vídeo com uma única invocação avconv

1

Joguei com o avconv no Ubuntu e agora posso, por exemplo Grave a área de trabalho com som de uma placa de som. Uma coisa que eu queria fazer era gravar duas entradas de vídeo ao mesmo tempo, por exemplo, a área de trabalho e a webcam. Eu pensei em fazer algo assim:

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

Meu pensamento era que, se você definir várias entradas de vídeo, e o formato .mkv puder manipular vários fluxos de vídeo, o avconv codificará dois fluxos de vídeo e um fluxo de áudio em um arquivo. Mas isso não é o que acontece:

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.

Não tenho certeza se é a questão do mapeamento (algumas opções de mapa para adicionar?) ou se o avconv não pode codificar mais de um fluxo de vídeo ao mesmo tempo. Então, é uma limitação real, ou uma limitação dos contêineres disponíveis, ou simplesmente não encontrar a combinação certa de opções de linha de comando?

    
por automatthias 01.12.2012 / 14:43

1 resposta

0

Não é uma boa ideia misturar opções de entrada e saída. Esperançosamente, você notará que o avconv está convertendo seu áudio para Vorbis ao invés de FLAC - isso porque acha que você está tentando definir isso como o codec de áudio do seu dispositivo video4linux, e está ignorando-o como uma opção inválida. Você também seria melhor servido usando o x264 como seu codificador de vídeo. Como você está usando o Ubuntu, o IIRC, você deve tê-lo como parte do ubuntu-restricted-extras.

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

Por padrão, o avconv seleciona apenas um fluxo de vídeo e um fluxo de áudio (e um fluxo de legenda, se houver um aí) para a saída. -map 1 -map 2 -map 0 diz para tomar todos os fluxos das três primeiras entradas (começa a contar a partir de 0).

Não é diretamente relevante para isso (já que cada uma de suas entradas conterá apenas um fluxo), mas você também pode selecionar fluxos individuais de entradas com -map : -map 0:1 mapeará o segundo fluxo a partir do primeiro áudio, -map 1:a mapeará cada fluxo de áudio da segunda entrada, -map 2:v:1 mapeará o segundo fluxo de vídeo a partir da terceira entrada e -map 3:s mapeará todas as legendas a partir da quarta entrada.

A ordem em que você usa os -map flags é importante; no exemplo acima, eu fiz isso para que a entrada de áudio fosse mapeada em terceiro, colocando esse -map por último.

Se você tiver problemas com o x264 retardar a gravação da sua tela (não deve ser a menos que você tenha um computador obsoleto), você pode tentar alterar o -preset para super-rápido ou ultra-rápido, ambos o que lhe dará codificação mais rápida / menos intensiva de CPU Se isso não funcionar, você pode tentar usar -c:v huffyuv - que é um codec de vídeo sem perdas, o equivalente de vídeo do FLAC, e fornecerá tamanhos de arquivos realmente ridículos; mas você pode recodificar para um codec menos doloroso depois.

    
por 19.12.2012 / 23:00