Apple Multipeer Connectivity 프레임 워크를 통해 마이크에서 다른 iPhone으로 오디오를 스트리밍하려고합니다. 오디오 캡처 및 재생을 수행하려면 AVAudioEngine을 사용하고 있습니다 (Rhythmic Fistman' 대답 덕분에 here).멀티 페어 연결을 통해 마이크에서 다른 전화기로 오디오 스트리밍하려고 시도합니다.
입력에 탭을 설치하여 마이크에서 데이터를받습니다. 그런 다음 AVAudioPCMBuffer를 가져 와서 UInt8의 배열로 변환 한 다음 다른 휴대 전화로 스트리밍합니다.
그러나 배열을 다시 AVAudioPCMBuffer로 변환 할 때 바이트 배열을 AVAudioPCMBuffer로 다시 변환하는 메서드를 가리키는 컴파일러에서 EXC_BAD_ACCESS 예외가 발생합니다. 여기
내가 복용 변환 입력 스트리밍하고있어 경우에 대한 코드입니다 :func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T {
return value.withUnsafeBufferPointer {
UnsafeRawPointer($0.baseAddress!).load(as: T.self)
}
}
func typetobinary<T>(_ value: T) -> [UInt8] {
var data = [UInt8](repeating: 0, count: MemoryLayout<T>.size)
data.withUnsafeMutableBufferPointer {
UnsafeMutableRawPointer($0.baseAddress!).storeBytes(of: value, as: T.self)
}
return data
}
: 데이터를 변환
input.installTap(onBus: 0, bufferSize: 2048, format: input.inputFormat(forBus: 0), block: {
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
let audioBuffer = self.typetobinary(buffer)
stream.write(audioBuffer, maxLength: audioBuffer.count)
})
내 두 기능을 (Martin.R의 대답 here에서 촬영)
그리고 수신 측에 :
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
if streamName == "voice" {
stream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode)
stream.open()
var bytes = [UInt8](repeating: 0, count: 8)
stream.read(&bytes, maxLength: bytes.count)
let audioBuffer = self.binarytotype(bytes, AVAudioPCMBuffer.self) //Here is where the app crashes
do {
try engine.start()
audioPlayer.scheduleBuffer(audioBuffer, completionHandler: nil)
audioPlayer.play()
}catch let error {
print(error.localizedDescription)
}
}
}
것은 내가 바이트 배열을 앞뒤로 변환하고 (동일한 전화에서) 스트리밍하기 전에 그것으로부터 사운드를 재생할 수 있지만 수신 끝에서 AVAudioPCMBuffer를 생성하지 않는다는 것입니다. 왜 변환이 수신 측에서 작동하지 않는지 아는 사람이 있습니까? 이것이 올바른 방법인가요?
모든 도움, 생각/의견을 보내 주시면 감사하겠습니다.
오디오 대기열 또는 샘플 프로젝트를 사용하는 방법에 대한 참조를 줄 수 있습니까? –
아니, 두렵지 않아. – nullforlife