Alsa无法设置采样格式[FFMPEG]

4
我想使用ffmpeg捕获Roland USB设备的pcm流并用wav格式包装它。我正在使用以下命令行:
ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav

要符合硬件设置。我还可以使用Audacity捕获流。问题是FFMPEG会抛出"无法设置采样格式错误"。你有什么想法,我该如何解决?

提前致谢。

FFMPEG输出

user@user:~$ ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav
    ffmpeg version N-85548-g3390a2b Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
      configuration: --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libvorbis --enable-libopus --enable-ffplay
      libavutil      55. 61.100 / 55. 61.100
      libavcodec     57. 92.100 / 57. 92.100
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 84.101 /  6. 84.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    [alsa @ 0x34b6780] cannot set sample format 0x10008 10 (Invalid argument)
    hw:2,0: Input/output error

ARECORD输出:

user@user:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3236 Analog [ALC3236 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: DUOCAPTURE [DUO-CAPTURE], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

在Deimus的帮助下,我检查了arecord中我的卡的设置,并使用了正确的FFMPEG线路(请注意,我已经更改了硬件的捕获频率)。
ARECORD输出
user@user:~$ arecord --dump-hw-params -D hw:2,0
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:2,0":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  S24_3LE
SUBFORMAT:  STD
SAMPLE_BITS: 24
FRAME_BITS: 48
CHANNELS: 2
RATE: 44100
PERIOD_TIME: (1020 1981429)
PERIOD_SIZE: [45 87381]
PERIOD_BYTES: [270 524286]
PERIODS: [2 1024]
BUFFER_TIME: (2040 3962858)
BUFFER_SIZE: [90 174762]
BUFFER_BYTES: [540 1048572]
TICK_TIME: ALL
--------------------
arecord: set_params:1233: Sample format non available
Available formats:
- S24_3LE

正确的命令行

ffmpeg -f alsa -acodec pcm_s24le -ac 2 -ar 44100 -i hw:2,0 out.wav

1
请提供完整的错误信息,并格式化您的问题以使其更易读。 - deimus
1
你确定那个设备支持32位采样吗? - CL.
我不确定,但我已经尝试了24位采样,它给出了相同的错误。当Audacity进行捕获时,它显示32位。 - caiomcg
如果我没记错的话,这是Audacity默认使用的——这并不意味着输入是32。 - llogan
没错!我不知道这个。 - caiomcg
2个回答

5
请使用arecord工具的--dump-hw-params选项检查支持的采样格式。 arecord手册页面。
然后,您可以使用ffmpeg-sample_fmt选项指定格式,例如s32
有关ffmpeg的音频选项,请参见此处

太好了!这就是我需要的信息。arecord为我的设备建议的格式是:S24_3LE,它支持24位。我将调整我的命令行以适应我的设备。非常感谢。 - caiomcg

0
  1. 请参考 arecord --dump-hw-params -D hw:2,0 的输出,其中 hw:2,0 是您的目标设备。

  2. arecord 的输出将显示可用的采样格式,包括 FORMATAvailable formats。还会显示其他有用的信息,例如 CHANNELSRATE。例如:

    --------------------
    ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
    FORMAT:  S16_LE S32_LE
    SUBFORMAT:  STD
    SAMPLE_BITS: [16 32]
    FRAME_BITS: [32 64]
    CHANNELS: 2
    RATE: [44100 192000]
    PERIOD_TIME: (83 11888617)
    PERIOD_SIZE: [16 524288]
    PERIOD_BYTES: [128 4194304]
    PERIODS: [2 32]
    BUFFER_TIME: (166 23777234)
    BUFFER_SIZE: [32 1048576]
    BUFFER_BYTES: [128 4194304]
    TICK_TIME: ALL
    --------------------
    Available formats:
    - S16_LE
    - S32_LE
    
  3. 在您的 ffmpeg 命令中选择适当的解码器以匹配采样格式。您还可以选择通道和采样率:

    ffmpeg -f alsa -c:a pcm_s32le -channels 2 -sample_rate 44100 -i hw:2,0 output.wav
    

使用的解码器示例:

  • S16LE = -c:a pcm_s16le
  • S24LE = -c:a pcm_s24le
  • S32LE = -c:a pcm_s32le

还可以查看ffmpeg -decodersFFmpeg文档:ALSA输入


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接