为具有大量通道的音频文件生成波形

问题描述

我想使用 FFmpeg 库生成显示交错音频 .wav 文件波形的 .png 文件http://ffmpeg.org/documentation.html

如果交错音频文件最多包含 8 个通道,我可以使用以下命令行成功实现这一点:

ffmpeg -i 8_channels_input.wav -y -filter_complex "showwavespic=s=1920x1200:split_channels=1" -frames:v 1 8_channels_waveform_output.png

但是,如果交错音频文件包含超过 8 个声道,FFmpeg 会给出以下内容

输入#0,wav,来自'30_channels_input.wav':持续时间:00:00:02.08, 比特率:31752 kb/s 流 #0:0:音频:pcm_s24le ([1][0][0][0] / 0x0001),44100 Hz,30 个通道,s32(24 位),31752 kb/s 流 映射:流#0:0 (pcm_s24le) -> showwavespic showwavespic -> Stream #0:0 (png) 按 [q] 停止,按 [?] 寻求帮助 [auto_resampler_0 @ 0x7faf5d60a3c0] 无法为之间的链接选择通道布局 过滤器 auto_resampler_0 和 Parsed_showwavespic_0。 [auto_resampler_0 @ 0x7faf5d60a3c0] 不支持未知的通道布局,请尝试 使用“aformat=channel_layouts=something”指定频道布局。 重新初始化过滤器时出错!无法将框架注入过滤器 网络:处理解码数据时出现无效参数错误 流 #0:0 转换失败!

这是相关文档(参见页面底部): https://trac.ffmpeg.org/wiki/AudioChannelManipulation

我的问题是: 我需要生成包含多达 30 个通道的音频文件的可视波形。 到目前为止,我所有的尝试都没有成功(我正在尝试定义自定义频道布局,但我不确定我是否在正确的轨道上)。

为了简化,我需要完成/修改以下命令以使其工作:

ffmpeg -i 30_channels_input.wav -y -filter_complex "showwavespic=s=1920x1200:split_channels=1" -frames:v 1 30_channels_waveform_output.png 

[编辑] 备注:

我设法通过组合现有布局来生成 10 通道输入的波形:

ffmpeg -i 10_channels_input.wav -y -filter_complex "aformat=channel_layouts=7.1+downmix,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 10_channels_waveform_output.png

但是,如果您尝试通过组合 5x 6.0 布局来为 30 个通道输入执行此操作:

ffmpeg -i 30_channels_input.wav -y -filter_complex "aformat=channel_layouts=6.0+6.0+6.0+6.0+6.0,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 30_channels_waveform_output.png

FFmpeg 给出以下内容

[auto_resampler_0 @ 0x7ffd7002a480] [SWR @ 0x7ffd7013a000] Rematrix 是 需要 30 个频道和 6.0 之间,但没有足够的信息 这样做 [auto_resampler_0 @ 0x7ffd7002a480] 配置失败 auto_resampler_0 上的输出焊盘重新初始化过滤器时出错!失败 将帧注入过滤器网络:无效参数错误而 处理流#0:0 的解码数据

我的假设是我需要使用 30 个唯一的频道 ID(参见页面底部https://trac.ffmpeg.org/wiki/AudioChannelManipulation)创建自定义布局,而不是组合现有布局。

不过似乎只有 25 个频道 ID 可用。创建具有 30 个通道的自定义布局可能根本不可能...

[编辑 2] 备注:

我终于找到了我正在寻找的文档。但是看起来还是很难产生30个通道的波形。

以下是创建自定义布局的方法https://ffmpeg.org/ffmpeg-utils.html

自定义通道布局可以指定为一系列术语, 以“+”或“|”分隔。每个术语可以是:

标准通道布局的名称(例如“单声道”、“立体声”、“4.0”、 ‘quad’、‘5.0’等)单个通道的名称(例如‘FL’、‘FR’、 ‘FC’、‘LFE’等)多个通道,十进制,后跟‘c’, 为该数量的通道生成认通道布局(请参阅 av_get_default_channel_layout 函数)。请注意,并非所有频道 计数具有认布局。多个通道,以十进制表示, 后跟“C”,产生具有指定的未知通道布局 通道数。请注意,并非所有通道布局规范 字符串支持未知的通道布局。通道布局掩码,在 以“0x”开头的十六进制(参见 AV_CH_* 中的宏 libavutil/channel_layout.h。在 libavutil 版本 53 之前,尾随 指定通道数的字符“c”是可选的,但现在它 是必需的,而通道布局掩码也可以指定为 十进制数(当且仅当后面没有“c”或“C”)。

另见 av_get_channel_layout 中定义的函数 libavutil/channel_layout.h。

例如

因此,对于 11 通道输入:

ffmpeg -i 11_channels_input.wav -y -filter_complex "aformat=channel_layouts=FL+FR+FC+BL+BR+BC+SL+SR+WL+WR+TBL,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 11_waveform_output.png

--> 为我工作

同时:

ffmpeg -i 11_channels_input.wav -y -filter_complex "aformat=channel_layouts=11c,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 11_waveform_output.png

--> 不起作用

但是:

ffmpeg -i 24_channels_input.wav -y -filter_complex "aformat=channel_layouts=24c,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 24_waveform_output.png

--> 确实有效

最后,我仍在努力实现的目标:

ffmpeg -i 30_channels_input.wav -y -filter_complex "aformat=channel_layouts=30c,showwavespic=s=1920x1200:split_channels=1" -frames:v 1 30_waveform_output.png

--> 不起作用

附上

  • 我通过 Ruby 脚本在子 shell 中执行这些命令(puts %x{...})
  • 我的系统:macOS 10.15.6 | zsh | FFmpeg 4.4 |红宝石 2.6.3

解决方法

未经测试的解决方法是使用 pan 来选择每个通道,每个通道一个 showwavespic,并用 vstack 堆叠它们:

grep*