gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:19 35 4
gpt4 key购买 nike

我正在尝试使用 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com