マイク入力した音声をリアルタイムに別の端末で出力するiosアプリを作成しています。
別の端末に接続するためにMultipeer Connectivityと
音声入出力のためにAVaudioEngineを使用しています。
マイク入力した音声を別の端末に送る際、下記のようなメソッドを使用します。
swift
1session.send(data, toPeers: session.connectedPeers, with: .reliable)
この引数のdataの部分にマイク入力した音声を乗せて別端末に送ると思うのですが、
AVaudioEnginからDataにどのように変換すればよいのかわかりません。
おそらくAVaudioPCMbufferをData型にするとことになると思うのですが、その方法もわかりません。
それとsendで渡したdataを受信側で元の型に戻す方法を教えてほしいです。
言語はswift3を使用しています。
Xcodeは8.3.3を使用しています。
回答がつかないのでコード追記します。
なぜ低評価つけられたのかわかりませんが、データの変換方法を聞きたかっただけだったので
コードを乗せる必要性がわかりませんが、そうではないのですね。。。
宣言部
swift
1 let serviceType = "Peer" 2 var browser : MCBrowserViewController! 3 var assistant : MCAdvertiserAssistant! 4 var session : MCSession! 5 var peerID: MCPeerID! 6 7 // Audio 8 var queue: AudioQueueRef! 9 var dataFormat : AudioStreamBasicDescription? = nil 10 var con :MyMultipeerConnect = MyMultipeerConnect() 11 12 // Audio 13 var audioEngine : AVAudioEngine! 14 var audioFile : AVAudioFile! 15 var audioPlayer : AVAudioPlayerNode! 16 var outref: ExtAudioFileRef? 17 var audioFilePlayer: AVAudioPlayerNode! 18 var mixer : AVAudioMixerNode! 19 var filePath : String? = nil
ViewDidLoad部
swift
1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 self.peerID = MCPeerID(displayName: UIDevice.current.name) 5 self.session = MCSession(peer: peerID) 6 self.session.delegate = self 7 8 // create the browser viewcontroller with a unique service name 9 self.browser = MCBrowserViewController(serviceType:serviceType, 10 session:self.session) 11 self.browser.delegate = self; 12 13 self.assistant = MCAdvertiserAssistant(serviceType:serviceType, 14 discoveryInfo:nil, session:self.session) 15 self.assistant.start() 16 17 // Audio 18 self.audioEngine = AVAudioEngine() 19 self.audioFilePlayer = AVAudioPlayerNode() 20 self.mixer = AVAudioMixerNode() 21 self.audioEngine.attach(audioFilePlayer) 22 self.audioEngine.attach(mixer) 23 }
録音開始時に呼び出す
swift
1 func startRecord() { 2 3 self.filePath = nil 4 5 try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 6 try! AVAudioSession.sharedInstance().setActive(true) 7 8 self.audioFile = try! AVAudioFile(forReading: Bundle.main.url(forResource: "1K", withExtension: "mp3")!) 9 10 let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.pcmFormatInt16, 11 sampleRate: 44100.0, 12 channels: 1, 13 interleaved: true) 14 15 self.audioEngine.connect(self.audioEngine.inputNode!, to: self.mixer, format: format) 16 self.audioEngine.connect(self.audioFilePlayer, to: self.mixer, format: self.audioFile.processingFormat) 17 self.audioEngine.connect(self.mixer, to: self.audioEngine.mainMixerNode, format: format) 18 19 let dir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! as String 20 self.filePath = dir.appending("/aaa.wav") 21 22 _ = ExtAudioFileCreateWithURL(URL(fileURLWithPath: self.filePath!) as CFURL, 23 kAudioFileWAVEType, 24 format.streamDescription, 25 nil, 26 AudioFileFlags.eraseFile.rawValue, 27 &outref) 28 29 self.mixer.installTap(onBus: 0, bufferSize: AVAudioFrameCount(format.sampleRate * 0.4), format: format, block: { (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in 30 31 let audioBuffer : AVAudioBuffer = buffer 32 _ = ExtAudioFileWrite(self.outref!, buffer.frameLength, audioBuffer.audioBufferList) 33 34 // ここでデータを送信する? 35 //self.session.send(data, toPeers: self.peerID, with: MCSessionSendDataMode.unreliable) 36 }) 37 38 try! self.audioEngine.start() 39 }
データを受信した際に呼ばれる
swift
1func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) 2{ 3 // ここでdataを再生する 4}
回答1件
あなたの回答
tips
プレビュー