質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

758閲覧

iphoneでマイク入力された音声を別のiphoneに再生したい

villhell

総合スコア21

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2017/08/27 13:37

編集2017/09/03 03:15

マイク入力した音声をリアルタイムに別の端末で出力する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}
Omogo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

villhell

2017/09/03 10:59

まだ修正が必要ですか?
guest

回答1

0

ベストアンサー

おそらくAVaudioPCMbufferをData型にするとことになると思うのですが

そうです、方向性は合ってます。まず、リファレンスを調べます。(公式のリファレンス、ドキュメントは大事です)

swift

1func send(_ data: Data, 2 toPeers peerIDs: [MCPeerID], 3 with mode: MCSessionSendDataMode) throws

から、Dataをクリックすると
A byte buffer in memory.の説明があり、NSDataというキーワードを読み取れます。

そこで、Googleさんに「そのまんま」聞いてみます。

Swift, How to convert from AVaudioPCMbuffer to NSData?

とすると、それっぽいコードを見つけられます。

あとは、コピペで構いません。(Thank you Google!)

投稿2017/09/03 12:26

編集2017/09/03 12:27
NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

villhell

2017/09/03 12:36

回答ありがとう御座います。このコードは一度試してうまくいかなかった記憶がありますが、 別の原因があった可能性がありますので、もう一度試してみようと思います。 すぐに試せる環境がないので、試したときに結果を追記します。
villhell

2017/09/09 13:11

遅くなってしまいすいません。 変換できました。ありがとう御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問