【发布时间】:2016-09-03 18:21:09
【问题描述】:
我正在尝试将 MIDI 文件转换为 Swift 中的音频文件 (.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 和通道更改为 = 1 解决了 ExtAudioFileWrite 错误 -50。现在我得到了一个带有噪音的一秒音频文件。 AudioUnitRender 仍然返回错误 -50。
【问题讨论】:
-
您有示例项目吗?
-
当然,我刚刚创建了一个:link。告诉我结果如何!
-
酷!但是soundfont文件丢失了。和 podfile 一样。
-
哎呀!好的,我现在都添加了它们。只需运行 pod install 将 cocoapods 添加到项目中,它应该可以工作了!
标签: ios audio core-audio audiobuffer mikmidi