私の質問を読んでいただきありがとうございます。iOS - 同時にデータを送受信しています
基本的に私はMultipeerConnectivityを使用して別のデバイスに接続しています。データを受信している間に他のデバイスにデータをストリーミングしたいとします。
私の問題は、いずれかのデバイスがデータ送信のみを終了し、もう一方のデバイスがデータ受信のみを終了するということです。
私の送信方法は次のとおりです。このメソッドはAVCaptureAudioDataOutputSampleBufferDelegateのデリゲートメソッドであるため、自動的に呼び出されます。
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
//-------------------------------------------------------
// Writing to output stream
var blockBuffer: CMBlockBuffer?
var audioBufferList: AudioBufferList = AudioBufferList.init()
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, nil, &audioBufferList, MemoryLayout<AudioBufferList>.size, nil, nil, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer)
let buffers = UnsafeMutableAudioBufferListPointer(&audioBufferList)
for buffer in buffers {
let u8ptr = buffer.mData!.assumingMemoryBound(to: UInt8.self)
let output = outputStream!.write(u8ptr, maxLength: Int(buffer.mDataByteSize))
if (output == -1) {
let error = outputStream?.streamError
print("\(#file) > \(#function) > Error on outputStream: \(error!.localizedDescription)")
}
else {
print("\(#file) > \(#function) > Data sent")
}
}
}
ここで私の受信方法です(私は他のストリームイベントを処理しますが、ここでは無関係です)。あなたはオーディオ関連のものをすべて無視することができますが、今は動作しませんが、それは私の主な問題ではありません。このメソッドはOutputStreamのデリゲートであるため、ストリームからデータが利用可能になると自動的に呼び出されます。
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
case Stream.Event.hasBytesAvailable:
print("\(#file) > \(#function) > New data has arrived")
readFromStream()
}
func readFromStream() {
while (inputStream!.hasBytesAvailable) {
var buffer = [UInt8](repeating: 0, count: 4096)
let length = inputStream!.read(&buffer, maxLength: buffer.count)
if (length > 0) {
if (audioEngine!.isRunning) {
print("\(#file) > \(#function) > audioEngine is running")
audioEngine!.stop()
audioEngine!.reset()
}
else {
print("\(#file) > \(#function) > audioEngine is NOT running")
}
print("\(#file) > \(#function) > \(length) bytes read")
let audioBuffer = bytesToAudioBuffer(buffer)
let mainMixer = audioEngine!.mainMixerNode
audioEngine!.connect(audioPlayer!, to: mainMixer, format: audioBuffer.format)
audioPlayer!.scheduleBuffer(audioBuffer, completionHandler: nil)
do {
try audioEngine!.start()
}
catch let error as NSError {
print("\(#file) > \(#function) > error: \(error.localizedDescription)")
}
audioPlayer!.play()
}
}
}
これらの2つの方法から、データが送信されたときとデータが送信されているときの印刷文があることがわかります。私は一貫してデータを読んだり、他のデバイスにデータを送信したりすることはありません。
私はスレッドを使用していないのでこれが想像しています。しかし、私はiOSのスレッドでは一度も働いていません。このような場合は、どのようにすればいいのですか?
これ以上の情報が必要な場合はお知らせください。
せstreamReceiverQueue = DispatchQueue(ラベル: "newQueue" と、QoS:DispatchQoS.userInteractive)
streamReceiverQueue.sync {
// code here
}
streamReceiverQueue.async {
// code here
}