私は2つのクラス、MicrophoneHandler
、およびAudioPlayer
を持っています。私は、承認された答えhereを使用して、マイクデータをタップするAVCaptureSession
を使用して管理し、かつ、この機能を使用してNSData
にCMSampleBuffer
を変換した:AVAudioEngineでAVAudioPCMBufferからオーディオを再生
func sendDataToDelegate(buffer: CMSampleBuffer!)
{
let block = CMSampleBufferGetDataBuffer(buffer)
var length = 0
var data: UnsafeMutablePointer<Int8> = nil
var status = CMBlockBufferGetDataPointer(block!, 0, nil, &length, &data) // TODO: check for errors
let result = NSData(bytesNoCopy: data, length: length, freeWhenDone: false)
self.delegate.handleBuffer(result)
}
私は今、生産NSData
を変換することにより、スピーカーの上にオーディオを再生したいですAVAudioPCMBuffer
に設定し、AVAudioEngine
を使用して再生します。次のように私のAudioPlayer
クラスがある:
var engine: AVAudioEngine!
var playerNode: AVAudioPlayerNode!
var mixer: AVAudioMixerNode!
override init()
{
super.init()
self.setup()
self.start()
}
func handleBuffer(data: NSData)
{
let newBuffer = self.toPCMBuffer(data)
print(newBuffer)
self.playerNode.scheduleBuffer(newBuffer, completionHandler: nil)
}
func setup()
{
self.engine = AVAudioEngine()
self.playerNode = AVAudioPlayerNode()
self.engine.attachNode(self.playerNode)
self.mixer = engine.mainMixerNode
engine.connect(self.playerNode, to: self.mixer, format: self.mixer.outputFormatForBus(0))
}
func start()
{
do {
try self.engine.start()
}
catch {
print("error couldn't start engine")
}
self.playerNode.play()
}
func toPCMBuffer(data: NSData) -> AVAudioPCMBuffer
{
let audioFormat = AVAudioFormat(commonFormat: AVAudioCommonFormat.PCMFormatFloat32, sampleRate: 8000, channels: 2, interleaved: false) // given NSData audio format
let PCMBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: UInt32(data.length)/audioFormat.streamDescription.memory.mBytesPerFrame)
PCMBuffer.frameLength = PCMBuffer.frameCapacity
let channels = UnsafeBufferPointer(start: PCMBuffer.floatChannelData, count: Int(PCMBuffer.format.channelCount))
data.getBytes(UnsafeMutablePointer<Void>(channels[0]) , length: data.length)
return PCMBuffer
}
バッファは、self.delegate.handleBuffer(result)
が上記第一のスニペットで呼び出されるhandleBuffer:buffer
関数に達します。
私はprint(newBuffer)
になり、変換されたバッファのメモリ位置を見ることができますが、スピーカーからは何も出ません。私は、NSData
への変換と変換の間に何かが一致しないと想像することができます。何か案は?前もって感謝します。
ソケットで送信するには、NSData raw形式が必要です。私たちはオーディオをストリーミングしています。 –
ファイルを 'NSData'に出力します。ファイルを単なるバッファと考えることはできますか?それはディスクバッファであることがありますが、それはまだ単なるバッファですか? – SwiftArchitect
ソケットを介してNSDataのパケットを送信するたびにバッファをクリアするにはどうすればよいですか? @SwiftArchitect –