gpt4 book ai didi

ios - Swift : Trying to convert MIDI to Audio File 中的 AudioUnitRender 和 ExtAudioFileWrite 错误 -50

转载 作者:可可西里 更新时间:2023-11-01 06:02:36 27 4
gpt4 key购买 nike

我正在尝试在 Swift 中将 MIDI 文件转换为音频文件 (.m4a)。

现在我正在使用 MIKMIDI作为排序和播放 MIDI 文件的工具,但是它不包括将播放保存到文件中的功能。 MIKMID 的创建者概述了执行此操作的过程 here .为了捕获输出并将其保存到音频文件中,我遵循了 this example尝试用 Swift 中的 GeneralIO 节点替换 MIKMIDI Graph 的 RemoteIO 节点。当我尝试使用 AudioUnitRender 和 ExtAudioFileWrite 将输出保存到文件时,它们都返回错误 -50 (kAudio_ParamError)。

    var channels = 2
var buffFrames = 512
var bufferList = AudioBufferList.allocate(maximumBuffers: 1)

for i in 0...bufferList.count-1{

var buffer = AudioBuffer()
buffer.mNumberChannels = 2
buffer.mDataByteSize = UInt32(buffFrames*sizeofValue(AudioUnitSampleType))
buffer.mData = calloc(buffFrames, sizeofValue(AudioUnitSampleType))

bufferList[i] = buffer

result = AudioUnitRender(generalIOAudioUnit, &flags, &inTimeStamp, busNum, UInt32(buffFrames), bufferList.unsafeMutablePointer)
inTimeStamp.mSampleTime += 1

result = ExtAudioFileWrite(extAudioFile, UInt32(buffFrames), bufferList.unsafeMutablePointer)

}

是什么导致错误 -50,我该如何解决它以将 MIDI(离线)呈现为 .m4a 文件?

更新:我通过将 mNumberChannels 和 channel 更改为 = 1 解决了 ExtAudioFileWrite 错误 -50。现在我得到了一个带有噪音的一秒音频文件。 AudioUnitRender 仍然返回错误 -50。

最佳答案

您的代码有几个问题:

  1. 你的AudioBufferList不符合客户端格式,试试

    let bufferList = AudioBufferList.allocate(maximumBuffers: Int(clientFormat.mChannelsPerFrame)) 
  2. 您正在替换 AUGraph 中的错误节点,并将剩余的节点连接到自身,导致 AudioUnitRender 上的无限循环。

但主要问题是您没有实现 author suggested 的解决方案.你希望你可以用样本时间戳调用 AudioUnitRender,比实时更快,但作者说不行,你必须手动将样本时间转换为主机时间并实现 midi 播放器的更好部分,如果你想要那个。

所以你可以这样做(听起来很难),或者 file a feature request ,或者通过使用 AudioUnitAddRenderNotify 向图形的远程 IO 音频单元添加渲染通知并在 kAudioUnitRenderAction_PostRender 阶段写入样本,在您聆听音乐时实时记录到文件.

关于ios - Swift : Trying to convert MIDI to Audio File 中的 AudioUnitRender 和 ExtAudioFileWrite 错误 -50,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39310065/

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