我如何在 JUCE 中录制 headers 而没有 'JUNK' 子块的音频?

How do I record an audio in JUCE that have headers without the 'JUNK' subchunk?

我正在尝试使用 JUCE library that can record an audio or open an audio file. The audio file is to be passed into the openSMILE 程序开发一个应用程序以提取其特征值。所有音频文件均为 wave 格式,应用程序最终将针对 iPhone 平台构建。

我已经开发了允许应用程序录制音频并从文件目录打开音频文件的应用程序部分。我能够将一些音频文件传递到 openSMILE 中以提取其特征值,但不能将其他音频文件传递给 openSMILE。 JUCE应用本身记录的都不能传入。

传递无法传递的音频文件时产生的错误如下:

smilePcm: Riff: 46464952
  Format: 45564157
  Subchunk1ID: 4b4e554a
  Subchunk2ID: 0
  AudioFormat: 0
  Subchunk1Size: 34smilePcm: bogus wave/riff header or file in wrong format ('Audio/Audio Recording.wav')! (maybe you are trying to read a 32-bit wave file which is not yet supported (new header type...)?)(ERROR) [1] in cWaveSource: failed reading wave header from file 'Audio/Audio Recording.wav'! Maybe this is not a WAVE file?

为了找出错误的原因,我随后使用 Riffpad 提取了有关可通过的 header 和 non-passable 音频文件的 wave 的信息。

可以传入openSMILE程序的音频文件中,wave文件header信息如下:

音频 1

RIFF-WAVE - (len= 180260, off= 12)
   fmt - (len=16, off=20)
   data - (len=180224, off=44)

音频 2

RIFF-WAVE - (len= 19236, off= 12)
   fmt - (len=16, off=20)
   data - (len=19200, off=44)

而non-passable的如下:

音频 3 <---从我的 JUCE 应用程序中录制

RIFF-WAVE - (len= 128096, off= 12)
   JUNK - (len=52, off=20)
   fmt - (len=16, off=80)
   data - (len=128000, off=104)

Audio 4 <---随机音频文件也不能传入 openSMILE

RIFF-WAVE - (len= 21289308, off= 12)
   fmt - (len=40, off=20)
   fact - (len = 4, off=68)
   data - (len=21289248, off=80)

我猜(如果我错了请纠正我)如果我可以从录制的 wave 文件中删除 JUNK 子块,即音频 3,那么错误将被删除,这样 headers 将是类似于可通过的音频文件。

我想到了可能能够解决此问题的 2 种可能性:

  1. 使用类似于可通过的音频文件headers 的header 格式录制 Juce 音频(最直接和首选的方法,如果可行的话)

  2. 录制后转换音频文件,这样 headers 就会相似(我读过使用 libsndfile 和音频压缩管理器(ACM)可能有效,但我不是确定它们是否适用于 JUCE 可以构建的跨平台,例如 iPhone)

对于第一种方式,有什么方法可以像可通过的音频文件一样以 'right' 格式录制音频?

对于第二种方式,我可以使用一个可以为跨平台构建的库,或者以某种方式取出录制音频的数据块,并添加一个 header 和 'right'格式吗? (我从我读到的内容中收集到的是,JUNK 允许包含信息,如果不需要,可以跳过。我认为删除它不会有问题,只要我编辑总长度来自 RIFF-WAVE 子块。)

以上方法是否可行,如果可行,我应该如何执行?

谢谢!

已解决:显然 wavAudioFormat.cpp 中有关于启用 JUCE_WAV_DO_NOT_PAD_HEADER_SIZE 删除垃圾填充的评论。

为想要以 wavAudioFormat 格式录制音频但 "crappy wav players" 无法读取填充的录制音频的任何人留下这些步骤:

  1. 转到调试 > 项目属性 > 配置属性 > C/C++ > 预处理器 > 预处理器定义。
  2. 点击编辑
  3. JUCE_WAV_DO_NOT_PAD_HEADER_SIZE 添加到列表中。