【问题标题】:Generate waveforms for audio files with large amount of channels为具有大量通道的音频文件生成波形
【发布时间】: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 已编辑。
  • 帖子再次编辑。一些进步。

标签: audio ffmpeg waveform


【解决方案1】:

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

ffmpeg -i input.wav -filter_complex
  "[0:a]pan=mono|c0=c0,showwavespic=s=1920x40[a0];
   [0:a]pan=mono|c0=c1,showwavespic=s=1920x40[a1];
   ...
   [0:a]pan=mono|c0=c29,showwavespic=s=1920x40[a29];
   [a0][a1]...[a29]vstack=inputs=30" output.png

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2011-06-28
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多