【问题标题】:AVMIDIPlayer init with MusicSequence带有 MusicSequence 的 AVMIDIPlayer 初始化
【发布时间】:2014-10-22 10:09:55
【问题描述】:

AVMIDIPlayer 有这个初始化器:

initWithData:soundBankURL:error:

这是对从标准 MIDI 文件读取的初始化程序的补充。

数据是 NSData,我假设它是标准的 MIDI 文件格式。那么,如何获取这些数据呢?好吧,当前创建 MIDI 序列的方法是 AudioToolbox MusicSequence。 (AVAudioEngine 甚至有这种类型的成员)。

MusicSequence 有这个转换器:

MusicSequenceFileCreateData (
        MusicSequence            inSequence,
        MusicSequenceFileTypeID  inFileType,
        MusicSequenceFileFlags   inFlags,
        SInt16                   inResolution,
        CFDataRef                *outData
    );

那么让我们试试吧。

var status = OSStatus(noErr)
var data:Unmanaged<CFData>?
status = MusicSequenceFileCreateData (musicSequence,
        MusicSequenceFileTypeID(kMusicSequenceFile_MIDIType),
        MusicSequenceFileFlags(kMusicSequenceFileFlags_EraseFile),
        480, &data)

var ns:NSData = data!.takeRetainedValue()
var error:NSError?
self.mp = AVMIDIPlayer(data: ns, soundBankURL: soundbank, error: &error)

(我之前已经加载了音库)。 好消息:它确实会播放 MIDI 数据。 坏消息:在到达序列末尾时,它会崩溃。

queue = 'CallbackQueue', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)

两个猜测。平台代码或(更有可能)我的代码中存在错误。

tl;dr 我获取的数据有误吗?

【问题讨论】:

    标签: swift core-audio avaudioplayer core


    【解决方案1】:

    为此我收到了 Tumbleweed 徽章!

    总之,问题出在AVMIDIPlayer的播放功能上。如果你给它一个 nil 完成处理程序,它会很高兴并且不会崩溃。如果你确实给它一个完成处理程序,那么 blammo - 崩溃。我已经为完成处理程序尝试了闭包和花园品种功能。

    var completion:AVMIDIPlayerCompletionHandler = {
         println("done")
     }
    

    tl;dr

    这样做:

    midiPlayer.play(nil)
    

    不是这个:

    midiPlayer.play(completion)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多