c++ - 我如何在 JUCE 中录制标题没有 'JUNK' 子 block 的音频?

标签 c++ ios audio wav juce

我正在尝试使用 JUCE 开发应用程序可以录制音频或打开音频文件的库。音频文件将被传递到 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 的信息。

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

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

我猜测(如果我错了请纠正我)如果我可以从录制的 wave 文件(即音频 3)中删除垃圾子 block ,那么错误将被删除,这样标题将与可通过的音频中的标题相似文件。

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

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

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

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

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

上面的方法是否可行,如果可行,应该如何实现?

谢谢!

最佳答案

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

将这些步骤留给任何想要以 wavAudioFormat 格式录制音频但拥有无法读取填充录制音频的“蹩脚 wav 播放器”的人:

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

关于c++ - 我如何在 JUCE 中录制标题没有 'JUNK' 子 block 的音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266391/

相关文章:

c++ - 将矩阵的 segmentation 映射到 vector

ios - 在 Swift 协议(protocol)上应用 self 约束与在协议(protocol)的扩展上应用 self 约束之间的区别

ios - LaunchScreen.xib 不显示我的自定义字体

ios - 我应该如何支持使用 DynamoDB 和 iOS 的离线模式?

android - Android-FATAL EXCEPTION:主要,无法启动 Activity ,setAudioSource

angular - GET http://localhost:9000/content/radios/radio.wav 404(未找到)

php - 将音频从 Swift 应用程序发送到 PHP 服务器,但音频在某处丢失

c++ - 如何删除多维 vector 中的重复 vector ?

C++ string() 与 c 字符串的比较。为什么这行得通?

c++ - 在NCurses CDK Matrix中,单个细胞可以着色吗?