2016-12-20 4 views
1

오디오 스트림이 '스피커'에 추가 된 위치를 찾을 수 없습니다. 스트림을 수정하고 나중에 스트림을 추가 할 수 있습니까? 나는 libjingle 스트림을 처리하고 그것을 추가하는 느낌이 있습니다.오디오 스트림이 libjingle에 추가 된 위치는 어디입니까?

나는 내 코드의 libjingle 부분을 추가했습니다 :

import AVFoundation 
import UIKit 

let TAG = "ViewController" 
let AUDIO_TRACK_ID = TAG + "AUDIO" 
let LOCAL_MEDIA_STREAM_ID = TAG + "STREAM" 

class ViewController: UIViewController, RTCSessionDescriptionDelegate, RTCPeerConnectionDelegate { 

    var mediaStream: RTCMediaStream! 
    var localAudioTrack: RTCAudioTrack! 
    var remoteAudioTrack: RTCAudioTrack! 
    var renderer: RTCEAGLVideoView! 
    var renderer_sub: RTCEAGLVideoView! 
    var roomName: String!  

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     initWebRTC(); 
     sigConnect(wsUrl: "http://192.168.1.59:3000"); 

     localAudioTrack = peerConnectionFactory.audioTrack(withID: AUDIO_TRACK_ID) 
     mediaStream = peerConnectionFactory.mediaStream(withLabel: LOCAL_MEDIA_STREAM_ID) 
     mediaStream.addAudioTrack(localAudioTrack) 
    } 

    var peerConnectionFactory: RTCPeerConnectionFactory! = nil 
    var peerConnection: RTCPeerConnection! = nil 
    var pcConstraints: RTCMediaConstraints! = nil 
    var audioConstraints: RTCMediaConstraints! = nil 
    var mediaConstraints: RTCMediaConstraints! = nil 

    var wsServerUrl: String! = nil 
    var peerStarted: Bool = false 

    func initWebRTC() { 
     RTCPeerConnectionFactory.initializeSSL() 
     peerConnectionFactory = RTCPeerConnectionFactory() 

     pcConstraints = RTCMediaConstraints() 
     audioConstraints = RTCMediaConstraints() 
     mediaConstraints = RTCMediaConstraints(
      mandatoryConstraints: [ 
       RTCPair(key: "OfferToReceiveAudio", value: "true"), 
      ], 
      optionalConstraints: nil) 
    } 

    func prepareNewConnection() -> RTCPeerConnection { 
     var icsServers: [RTCICEServer] = [] 

     icsServers.append(RTCICEServer(uri: NSURL(string: "stun:stun.l.google.com:19302") as URL!, username: "", 
     password: "")) 

     let rtcConfig: RTCConfiguration = RTCConfiguration() 
     rtcConfig.tcpCandidatePolicy = RTCTcpCandidatePolicy.disabled 
     rtcConfig.bundlePolicy = RTCBundlePolicy.maxBundle 
     rtcConfig.rtcpMuxPolicy = RTCRtcpMuxPolicy.require 

     peerConnection = peerConnectionFactory.peerConnection(withICEServers: icsServers, constraints: pcConstraints, delegate: self) 
     peerConnection.add(mediaStream); 
     return peerConnection; 
    } 


    func peerConnection(_ peerConnection: RTCPeerConnection!, signalingStateChanged stateChanged: RTCSignalingState) { 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, iceConnectionChanged newState: RTCICEConnectionState) { 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, iceGatheringChanged newState: RTCICEGatheringState) { 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, gotICECandidate candidate: RTCICECandidate!) { 
     if (candidate != nil) { 
      print("iceCandidate: " + candidate.description) 
      let json:[String: AnyObject] = [ 
       "type" : "candidate" as AnyObject, 
       "sdpMLineIndex" : candidate.sdpMLineIndex as AnyObject, 
       "sdpMid" : candidate.sdpMid as AnyObject, 
       "candidate" : candidate.sdp as AnyObject 
      ] 
      sigSend(msg: json as NSDictionary) 
     } else { 
      print("End of candidates. -------------------") 
     } 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, addedStream stream: RTCMediaStream!) { 
     if (peerConnection == nil) { 
      return 
     } 

     if (stream.audioTracks.count > 1) { 
      print("Weird-looking stream: " + stream.description) 
      return 
     } 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, removedStream stream: RTCMediaStream!) { 
    } 

    func peerConnection(_ peerConnection: RTCPeerConnection!, didOpen dataChannel: RTCDataChannel!) { 
    } 

    func peerConnection(onRenegotiationNeeded peerConnection: RTCPeerConnection!) { 

    } 
} 

나의 생각은 내가이 명령에 따라 기능의 오디오 스트림을 잡을 수 있다는 것입니다. 그 맞습니까? 또한 스트림을 수동으로 스피커에 추가 할 수 있습니까?

func peerConnection(_ peerConnection: RTCPeerConnection!, addedStream stream: RTCMediaStream!) { 
      if (peerConnection == nil) { 
       return 
      } 

      if (stream.audioTracks.count > 1) { 
       print("Weird-looking stream: " + stream.description) 
       return 
      } 
     } 

답변

1

webRTC 호출이 연결되면 Webrtc 스택은 플랫폼 API를 사용하여 오디오를 재생하거나 녹음합니다. 당신은 오디오 구성을 높이거나 볼륨을 줄이거 나 변경 오디오 스트림을

  • 를 사용하여 시스템 API를

    1. 음소거 등의 작업을 제어하거나 음소거를 해제 할 수
    수동 스피커하지만 당신에 스트림을 추가 할 수 없습니다

    기본 오디오 출력을 스피커 또는 헤드폰으로 변경하여 webrtc 오디오가 올바른 출력으로 재 지정되도록 선택할 수 있습니다. avfoundation API를 사용하여이 작업을 수행 할 수 있습니다.