2016-12-20 5 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 платформы для воспроизведения или записи звука. Вы можете контролировать только такие вещи, как

  1. Mute или приглушение аудиопотока
  2. Использовать системные API, чтобы увеличить или уменьшить громкость или настройки аудио

Вы не можете добавить поток вручную динамик, но вам может выбрать изменение аудиовыхода по умолчанию на громкоговоритель или наушники, чтобы звук webrtc был перенаправлен на правильный выход. Это можно сделать, используя API-интерфейсы avfoundation

Смежные вопросы