我正在玩 AVAudioFile 和 AVAudioPlayerNode。
我已经实现了一个自定义流协议,它接收音频块并处理所有缓冲部分,但是我无法在不使用文件系统的情况下播放第一个块(我现在不想使用 FS)。
这是:当我将数据写入临时文件并使用加载它时它工作正常AVAudioFile
(然后我初始化 aAVAudioBuffer
并使用AVAudioFile.readIntoBuffer
& finally AVAudioPlayerNode.scheduleBuffer
)。但我无法直接从第一个块(NSData)加载缓冲区。
我应该实现自定义 NSURLProtocol 并尝试从自定义 NSURL 初始化 AVAudioFile 吗?
func play( data: NSData ) {
var audioFile: AVAudioFile
var audioBuffer: AVAudioPCMBuffer
// writing the data
let destPath = NSTemporaryDirectory() + "chunk.mp3"
data.writeToFile( destPath, atomically: true )
// initializing the AVAudioFile
audioFile = AVAudioFile( forReading: NSURL(string: destPath)!)
// initializing the AVAudioPCMBuffer
audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat,
frameCapacity: UInt32(data.length))
audioFile.readIntoBuffer( audioBuffer )
/*
I didn't put any AVAudioPlayerNode/AVAudioEngine in this code to keep it simple and describe the situation,
anyway this works fine when everything's properly initialized:
*/
player.scheduleBuffer( audioBuffer, completionHandler: nil )
}