Alsa 无法设置样本格式[FFMPEG]
Alsa cannot set sample format[FFMPEG]
我正在尝试使用 ffmpeg 从 Roland USB 设备捕获 pcm 流并使用 wav 对其进行包装。我使用的命令行如下:
ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav
符合硬件的设置。我还可以使用 Audacity 捕获流。问题是 FFMPEG 抛出 "cannot set sample format error"。知道可能会发生什么以及如何解决这个问题吗?
提前致谢。
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
记录输出:
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 使用了正确的行(注意我已经更改了硬件上的捕获频率)。
记录输出
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
使用 arecord
工具的 --dump-hw-params
选项检查支持的示例格式。
Man arecord
页
然后您可以使用 ffmpeg
的 -sample_fmt
选项来指定格式,例如。 s32
ffmpeg 的音频选项是 here
参考 arecord --dump-hw-params -D hw:2,0
的输出,其中 hw:2,0
是您的目标设备。
arecord
输出将在 FORMAT
和 Available formats
下显示可用的示例格式。还显示了其他有用的信息,例如 CHANNELS
和 RATE
。示例:
--------------------
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
在您的 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 -decoders
和 FFmpeg Documentation: ALSA input。
我正在尝试使用 ffmpeg 从 Roland USB 设备捕获 pcm 流并使用 wav 对其进行包装。我使用的命令行如下:
ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav
符合硬件的设置。我还可以使用 Audacity 捕获流。问题是 FFMPEG 抛出 "cannot set sample format error"。知道可能会发生什么以及如何解决这个问题吗?
提前致谢。
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
记录输出:
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 使用了正确的行(注意我已经更改了硬件上的捕获频率)。
记录输出
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
使用 arecord
工具的 --dump-hw-params
选项检查支持的示例格式。
Man arecord
然后您可以使用 ffmpeg
的 -sample_fmt
选项来指定格式,例如。 s32
ffmpeg 的音频选项是 here
参考
arecord --dump-hw-params -D hw:2,0
的输出,其中hw:2,0
是您的目标设备。arecord
输出将在FORMAT
和Available formats
下显示可用的示例格式。还显示了其他有用的信息,例如CHANNELS
和RATE
。示例:-------------------- 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
在您的
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 -decoders
和 FFmpeg Documentation: ALSA input。