使用一次 avconv 调用对多个视频流进行编码

使用一次 avconv 调用对多个视频流进行编码

我在 Ubuntu 上使用过 avconv,现在我能够录制带有声卡声音的桌面。我想做的一件事是同时录制两个视频输入,例如桌面和网络摄像头。我想做这样的事情:

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

我的想法是,如果您定义多个视频输入,并且 .mkv 格式可以处理多个视频流,则 avconv 会将 2 个视频流和 1 个音频流编码为一个文件。但事实并非如此:

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.

我不确定这是映射问题(需要添加一些 -map 选项吗?)还是 avconv 无法一次编码多个视频流。所以这是 avconv 的实际限制,还是可用容器的限制,或者我只是没有找到正确的命令行选项组合?

答案1

混合输入和输出选项并不是一个好主意。希望您会注意到 avconv 正在将您的音频转换为 Vorbis 而不是 FLAC - 这是因为它认为您正在尝试将其设置为 video4linux 设备的音频编解码器,并将其忽略为无效选项。您最好使用 x264 作为视频编码器。由于您使用的是 Ubuntu,如果我没记错的话,您应该将其作为 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

默认情况下,avconv 仅选择一个视频流和一个音频流(如果有的话,还有一个字幕流)进行输出。-map 1 -map 2 -map 0告诉它从前三个输入中获取每个流(从 0 开始计数)。

这与此没有直接关系(因为您的每个输入只包含一个流),但您也可以从输入中选择单独的流-map-map 0:1将从第一个音频映射第二个流,-map 1:a将从第二个输入映射每个音频流,-map 2:v:1将从第三个输入映射第二个视频流并将-map 3:s映射第四个输入中的所有字幕。

使用-map标志的顺序很重要;在上面的例子中,我已将音频输入放置在第三个映射位置(最后)-map

如果如果你遇到 x264 减慢屏幕录制速度的问题(除非你的电脑已经过时,否则不会出现这种情况),你可以尝试将其更改-preset为超快或极快,这两种方式都可以让你获得更快/更少 CPU 密集型的编码。如果这不起作用,你可以尝试使用-c:v huffyuv- 这是一个无损视频编解码器,相当于 FLAC 的视频,并且会给你真正荒谬的文件大小;但你可以稍后重新编码为一个不那么痛苦的编解码器。

相关内容