微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Ubuntu上使用ffmpeg,如何录制影音USB采集设备的音视频?

如何解决在Ubuntu上使用ffmpeg,如何录制影音USB采集设备的音视频?

我有一个 USB 音频-视频捕获设备,用于将录像带数字化。我想将设备中的视频和音频都录制到尺寸为 720x576、视频编解码器为 H.264 且音频质量良好的视频文件中。

我能够使用 ffmpeg 从设备录制视频,并且能够使用 MPlayer 从设备观看视频。通过查看“声音首选项”窗口的“输入”选项卡或使用 Audacity 录制音频,我还能够看到音频正在从设备传送到计算机,但是音频显然是从设备传送的 当使用 ffmpeg 或 MPlayer 访问视频时。

我尝试让 ffmpeg 录制音频,我尝试让 MPlayer 播放音频,但我的努力没有成功。

设备是“Pinnacle Dazzle DVC 90/100/101”(由 v4l2-ctl --list-devices 返回)。声卡列表显示为“DVC100”:

$ cat /proc/asound/cards 
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0x601d118000 irq 171
 1 [DVC100         ]: USB-Audio - DVC100
                      Pinnacle Systems GmbH DVC100 at usb-0000:00:14.0-4,high speed
29 [ThinkPadEC     ]: ThinkPad EC - ThinkPad Console Audio Control
                      ThinkPad Console Audio Control at EC reg 0x30,fw N2LHT33W

该设备的 pulseAudio 列表如下:

$ pactl list cards short
0   alsa_card.pci-0000_00_1f.3  module-alsa-card.c
14  alsa_card.usb-Pinnacle_Systems_GmbH_DVC100-01   module-alsa-card.c

以下 ffmpeg 命令成功录制视频,但录制的音频严重失真、损坏和不同步:

ffmpeg -y -f rawvideo -f alsa -thread_queue_size 2048 -ar 48000 -i hw:0 \
    -c:a aac -video_size 720x576 -pixel_format uyvy422 -i /dev/video2 out.mp4

以下 MPlayer 命令成功显示视频但不播放音频

mplayer -tv driver=v4l2:norm=PAL:device=/dev/video2:width=720:height=576 \
    -ao alsa:device=hw=1.0 -vf pp=lb tv://

现在,当上面的 MPlayer 命令正在运行(不是 ffmpeg 命令)并在窗口中显示输入的视频时,可以打开 Audacity 并设置录制音频,并且它可以清晰且高质量地记录来自设备的音频。在 Audacity 执行此操作时,输入设备在 pavucontrol 中列为“Dazzle DVC 音频设备模拟立体声”。同样,也可以使用 arecord 使用以下命令录制音频(显示输出):

$ arecord -vv -D plughw:DVC100 -fdat out.wav
Recording WAVE 'out.wav' : Signed 16 bit Little Endian,Rate 48000 Hz,Stereo
Plug PCM: Hardware PCM card 1 'DVC100' device 0 subdevice 0
Its setup is:
  stream       : CAPTURE
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 48000
  exact rate   : 48000 (48000/1)
  msbits       : 16
  buffer_size  : 24000
  period_size  : 6000
  period_time  : 125000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 6000
  period_event : 0
  start_threshold  : 1
  stop_threshold   : 24000
  silence_threshold: 0
  silence_size : 0
  boundary     : 6755399441055744000
  appl_ptr     : 0
  hw_ptr       : 0

查看 arecord -L输出,我用 ffmpeg 尝试了各种音频设备输入名称,但似乎没有一个起作用。因此,例如,我尝试了如下命令:

ffmpeg -y -f rawvideo -f alsa -i plughw:DVC100 \
    -video_size 720x576 -pixel_format uyvy422 -i /dev/video2 out.mp4

并尝试了以下音频设备名称

plughw:DVC100
plughw:CARD=DVC100,DEV=0
hw:CARD=DVC100,DEV=0
plughw:CARD=DVC100
sysdefault:CARD=DVC100
iec958:CARD=DVC100,DEV=0
dsnoop:CARD=DVC100,DEV=0

那么,我如何才能让 ffmpeg 将音频成功录制到视频文件中?有没有其他方法可以解决这个问题?


编辑:命令 pactl list sources 的相关输出如下:

Source #20
    State: SUSPENDED
    Name: alsa_input.usb-Pinnacle_Systems_GmbH_DVC100-01.analog-stereo
    Description: Dazzle DVC100 Audio Device Analogue Stereo
    Driver: module-alsa-card.c
    Sample Specification: s16le 2ch 48000Hz
    Channel Map: front-left,front-right
    Owner Module: 45
    Mute: no
    Volume: front-left: 99957 / 153% / 11.00 dB,front-right: 99957 / 153% / 11.00 dB
            balance 0.00
    Base Volume: 35466 /  54% / -16.00 dB
    Monitor of Sink: n/a
    Latency: 0 usec,configured 0 usec
    Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY 
    Properties:
        alsa.resolution_bits = "16"
        device.api = "alsa"
        device.class = "sound"
        alsa.class = "generic"
        alsa.subclass = "generic-mix"
        alsa.name = "USB Audio"
        alsa.id = "USB Audio"
        alsa.subdevice = "0"
        alsa.subdevice_name = "subdevice #0"
        alsa.device = "0"
        alsa.card = "1"
        alsa.card_name = "DVC100"
        alsa.long_card_name = "Pinnacle Systems GmbH DVC100 at usb-0000:00:14.0-4,high speed"
        alsa.driver_name = "snd_usb_audio"
        device.bus_path = "pci-0000:00:14.0-usb-0:4:1.1"
        sysfs.path = "/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.1/sound/card1"
        udev.id = "usb-Pinnacle_Systems_GmbH_DVC100-01"
        device.bus = "usb"
        device.vendor.id = "2304"
        device.vendor.name = "Pinnacle Systems,Inc."
        device.product.id = "021a"
        device.product.name = "Dazzle DVC100 Audio Device"
        device.serial = "Pinnacle_Systems_GmbH_DVC100"
        device.string = "front:1"
        device.buffering.buffer_size = "352800"
        device.buffering.fragment_size = "176400"
        device.access_mode = "mmap+timer"
        device.profile.name = "analog-stereo"
        device.profile.description = "Analogue Stereo"
        device.description = "Dazzle DVC100 Audio Device Analogue Stereo"
        alsa.mixer_name = "USB mixer"
        alsa.components = "USB2304:021a"
        module-udev-detect.discovered = "1"
        device.icon_name = "audio-card-usb"
    Ports:
        analog-input-linein: Line In (priority: 8100)
    Active Port: analog-input-linein
    Formats:
        pcm

我用 ffmpeg(版本 4.3.1,用 -enable-libpulse 编译)以下列方式测试了这个名称

ffmpeg -y -f video4linux2 -f pulse \
    -i alsa_input.usb-Pinnacle_Systems_GmbH_DVC100-01.analog-stereo \
    -video_size 720x576 -pixel_format uyvy422 -i /dev/video2 out.mp4

不幸的是,这不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。