【发布时间】:2021-04-30 20:53:50
【问题描述】:
我想使用 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’, etc.) 通道数,十进制,后跟 ‘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
【问题讨论】:
-
使用
30_channels_input.wav输入显示命令的完整日志。 -
我建议删除 [ruby] 和 [zsh] 标签。即使您通过 ruby 执行
ffmpeg,我希望答案将集中在ffmpeg而不是 ruby/zsh。 -
@llogan 已编辑。
-
帖子再次编辑。一些进步。