2

我正在尝试使用JUCE库开发一个可以录制音频或打开音频文件的应用程序。音频文件将被传递到openSMILE程序中以提取其特征值。所有音频文件均为波形格式,最终将针对 iPhone 平台构建应用程序。

我已经开发了允许应用程序录制音频并从文件目录打开音频文件的应用程序部分。我可以将一些音频文件传递到 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 提取了有关可通过和不可通过音频文件的波头的信息。

在可传入openSMILE程序的音频文件中,波形文件头信息如下:

音频 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)

而不能通过的如下:

音频 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)

我猜测(如果我错了,请纠正我)如果我可以从记录的波形文件(即音频 3)中删除 JUNK 子块,则错误将被删除,这样标题将与可通过的音频文件中的标题相似。

我想到了两种可能解决这个问题的方法:

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

  2. 录制后转换音频文件,以便标题相似(我已经阅读过使用 libsndfile 和音频压缩管理器(ACM)可能会工作,但我不确定它们是否适用于 JUCE 可以构建的跨平台,例如苹果手机)

对于第一种方式,有什么方法可以像可传递的音频文件一样以“正确”格式录制音频?

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

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

谢谢!

4

1 回答 1

0

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

为任何想要以 wavAudioFormat 录制音频但拥有无法读取填充录制音频的“糟糕的 wav 播放器”的人留下这些步骤:

  1. 转到调试 > 项目属性 > 配置属性 > C/C++ > 预处理器 > 预处理器定义。
  2. 单击编辑
  3. 添加JUCE_WAV_DO_NOT_PAD_HEADER_SIZE到列表中。
于 2015-02-05T10:04:37.220 回答