ios - 内存中的 AVAudioFile?

标签 ios objective-c swift avfoundation avaudioengine

我正在玩弄 AVAudioFile 和 AVAudioPlayerNode。

我已经实现了一个自定义流媒体协议(protocol)来接收音频 block 并处理所有缓冲部分,但是我无法在不使用文件系统的情况下播放第一个 block (我不想在这里使用 FS时间)。

这是:当我将数据写入临时文件并使用 AVAudioFile 加载它时它工作正常(然后我初始化一个 AVAudioBuffer 并使用 AVAudioFile. readIntoBuffer & 最后 AVAudioPlayerNode.scheduleBuffer)。但是我无法直接从第一个 block (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 )
}

最佳答案

来自documentation :

To play streamed audio content, such as from a network connection, use Audio File Stream Services in concert with Audio Queue Services. Audio File Stream Services parses audio packets and metadata from common audio file container formats in a network bitstream. You can also use it to parse packets and metadata from on-disk files.

这里的关键点是使用音频文件服务将数据放入缓冲区并使用音频队列服务将其排队。网络部分通常使用 CFNetwork API 完成,它比 NSURLProtocol 低得多。

Apple 示例代码“AudioFileStreamExample”说明了音频流的客户端和服务器实现。这将是一个有效的起点。

关于ios - 内存中的 AVAudioFile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34988078/

相关文章:

ios - iOS 7-10 收到通知时如何显示本地通知?

ios - 尝试从另一个类访问时类中的对象为零

ios - 如何为 UITableView 设置边框?

objective-c - 嵌套 block 编程

ios - 从函数返回自身以符合协议(protocol) UNUserNotificationCenterDelegate

ios - 来自 XIB 错误的 UITableView 和 UITableViewCell?

iphone - 在 Collection View 中从 URL 加载图像时如何节省内存?

ios - SKNodes 之间的计算距离不会改变,尽管它们在移动

objective-c - 如何在没有时间延迟的情况下从一种音乐序列更改为另一种音乐序列

swift - 将创建到函数中的变量传递给闭包是否安全?