问题描述
我想使用 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*