twilio / video-quickstart-ios

Twilio Video Quickstart for iOS
https://www.twilio.com/docs/api/video
MIT License
460 stars 177 forks source link

Audio/ Mic is not working when go to background & come back again #536

Closed musheer-ahamed closed 4 years ago

musheer-ahamed commented 4 years ago

Hi, I have implemented chatting app with calling feature. I am facing audio/mic issue in live app. I have audio/mic issue when go to background and come back to app during call. Some time audio is not working. Some time mic is not working. please anyone help me to solve this issue.

ceaglest commented 4 years ago

Hey @musheer-ahamed,

At first glance, does your app have permissions to use audio in the background?

See Getting Started - Backround Modes for the entitlements that you need. If that's not it, can you provide the info in the issue template?

Best, Chris

musheer-ahamed commented 4 years ago

@ceaglest Thanks! I have enabled voice over IP, background audio, airplay, picture In picture, background fetch, remote notification. While app was in background audio & mic both are working fine. but when entering to foreground from background this issue was happens.

musheer-ahamed commented 4 years ago

@ceaglest When comes foreground from background, I have tried to unpublish localAudio track and after 1 sec I have again created new audio track and published. Then also the same issue happening. Please help me. This is live production issue. I have to fix soon.

ceaglest commented 4 years ago

Hi @musheer-ahamed,

If you could provide client side logs and a Room SID I would be happy to look into this further. For now I suggest comparing to the Quickstart example app to see what the differences are. I am able to background the example app and come back with audio functional.

When comes foreground from background, I have tried to unpublish localAudio track and after 1 sec I have again created new audio track and published.

I don't recommend publishing and unpublishing in the background. If no one is publishing audio in a Room then your AVAudioSession will get interrupted.

Best, Chris

musheer-ahamed commented 4 years ago

@ceaglest Thanks! I have tried with removed all my foreground/background functions. Still, the mic is not working when come to foreground from background. Sorry @ceaglest, I'm working on a remote system so I'm unable to connect the device to the system and get logs. I'm testing by uploading builds to testflight. I have attached room sid. Please give me some suggestions. I'm in trouble now. This is production issue.

Room SId: RM697de0e1fde5d17652e18ca475d21be9

Devices details: iPhone 7+, OS 13.3.1 iPhone 6s+, OS 13.6

This is my coding details:

func performRoomConnect(uuid: UUID, roomName: String? ) { enableAudioBlock(isEnable: false)

    prepareLocalMedia()
    // Preparing the connect options with the access token that we fetched (or hardcoded).
    let connectOptions = ConnectOptions(token: accessToken) { (builder) in

        // Use the local media that we prepared earlier.
        builder.audioTracks = self.localAudioTrack != nil ? [self.localAudioTrack!] : [LocalAudioTrack]()

        builder.videoTracks = [LocalVideoTrack]()

        // Use the preferred audio codec
        if let preferredAudioCodec = Settings.shared.audioCodec {
            builder.preferredAudioCodecs = [preferredAudioCodec]
        }

        // Use the preferred video codec
        if let preferredVideoCodec = Settings.shared.videoCodec {
            builder.preferredVideoCodecs = [preferredVideoCodec]
        }

        // Use the preferred encoding parameters
        if let encodingParameters = Settings.shared.getEncodingParameters() {
            builder.encodingParameters = encodingParameters
        }

        // Use the preferred signaling region
        if let signalingRegion = Settings.shared.signalingRegion {
            builder.region = signalingRegion
        }

        builder.isNetworkQualityEnabled = true
        builder.networkQualityConfiguration = NetworkQualityConfiguration(localVerbosity: .minimal,
                                                                          remoteVerbosity: .minimal)

        builder.roomName = roomName
        builder.isDominantSpeakerEnabled = true
    }

    // Connect to the Room using the options we provided.
    room = TwilioVideoSDK.connect(options: connectOptions, delegate: self)
}

func enableAudioBlock(isEnable: Bool = true) { self.audioDevice.isEnabled = isEnable self.audioDevice.block() }

func prepareLocalMedia() {
    // Create an audio track.
    if (localAudioTrack == nil) {
        if DataSource.getInstance().isFromVOIP {
            localAudioTrack = LocalAudioTrack()
        }else {
            localAudioTrack = LocalAudioTrack(options: nil, enabled: true, name: "Microphone")
        }
        if (localAudioTrack == nil) {
            print( "Failed to create audio track")
        }
    }
    if !isAudioCall {
        checkLocalVideoRendering()
        startPreview()
    }
}

func roomDidConnect(room: Room) { for remoteParticipant in room.remoteParticipants { remoteParticipant.delegate = self } enableAudioBlock() switchAudioDevice(toSpeaker: false) }

func switchAudioDevice(toSpeaker: Bool) {

    audioDevice.block = {
        DefaultAudioDevice.DefaultAVAudioSessionConfigurationBlock()
        do {
            let audioSession = AVAudioSession.sharedInstance()
            try audioSession.setMode(toSpeaker ? AVAudioSessionModeVideoChat : AVAudioSessionModeVoiceChat)
            self.isSpeakerEnabled = toSpeaker
            try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
        } catch let error as NSError {
            print("Fail: \(error.localizedDescription)")
        }
    }
    audioDevice.block()
    self.localAudioTrack?.isEnabled = self.localAudioTrack?.isEnabled ?? false
}
musheer-ahamed commented 4 years ago

@ceaglest I am playing a ring tone before answering the call. also I'm playing the ringing sound to the caller side up to receiver joins the call. This will affect the mic in twilio?

//after call connected -> caller will here ringing sound untill receiver joins the call func playSound() { guard let url = Bundle.main.url(forResource: "ringring", withExtension: "mp3") else { return } let session = AVAudioSession.sharedInstance() do { try session.setCategory(AVAudioSessionCategoryPlayAndRecord) try session.setMode(isAudioCall ? AVAudioSessionModeVoiceChat : AVAudioSessionModeVideoChat) try session.overrideOutputAudioPort(AVAudioSession.PortOverride.none) try session.setActive(true) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

        guard let player = player else { return }
        player.numberOfLoops = 5
        player.prepareToPlay()
        player.play()
    } catch let error {
        print(error.localizedDescription)
    }
}

//Before call connecting -> receiver side ring tone playing func playRingToneSound() { guard let url = Bundle.main.url(forResource: "ringtone", withExtension: "mp3") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) try AVAudioSession.sharedInstance().setActive(true)

        /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
        player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

        /* iOS 10 and earlier require the following line:
         player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */

        guard let player = player else { return }
        player.numberOfLoops = 3
        player.prepareToPlay()
        player.play()

    } catch let error {
        print(error.localizedDescription)
    }
}
musheer-ahamed commented 4 years ago

@ceaglest I have tested with VideoQuick start project. mic & audio was working fine. I have created one new view controller in my project and just copy-pasted VideoQuick code. Then also the same issue. The mic is not working when going to background & come foreground. I have enabled background audio. Anything I missed in the setup?

import UIKit import TwilioVideo

class TwilioViewController: UIViewController {

@IBOutlet weak var localPreview: VideoView!

@IBOutlet weak var muteBtn: UIButton!
@IBOutlet weak var statusLabel: UILabel!

var room: Room?
var camera: CameraSource?
var localVideoTrack: LocalVideoTrack?
var localAudioTrack: LocalAudioTrack?
var remoteParticipant: RemoteParticipant?
var remoteView: VideoView?
var twilioRoom: TwilioRoom?
var isFromReceiveCall = false
var chatRoomDetails: ChatRoomDetails?

override func viewDidLoad() {
    super.viewDidLoad()

    self.startPreview()

    if isFromReceiveCall, let receiveCall = twilioRoom {
        performRoomConnect(accessToken: receiveCall.token, roomName: receiveCall.twilioRoom)
    }else {
        initiateCall(isAudioCall: false)
    }
}

func initiateCall(isAudioCall: Bool) {
    if Utils.isInternetReacheable(), let chatRoom = chatRoomDetails {
        HulloAPI.getInstance().initiateCall(makeCallObject: HulloPayDataSource.getInstance().getCallObject(isAudioCall: isAudioCall, chatRoomDetails: chatRoom, roomId: nil)) { (error, result) in
            if error != nil {

            } else if let result = result {
                print(result.twilioRoom)
                self.twilioRoom = result
                self.performRoomConnect(accessToken: result.token, roomName: result.twilioRoom)
            }
        }
    }
}

@IBAction func actionOnMuteBtn(_ sender: Any) {
    if (self.localAudioTrack != nil) {
        self.localAudioTrack?.isEnabled = !(self.localAudioTrack?.isEnabled)!

        // Update the button title
        if (self.localAudioTrack?.isEnabled == true) {
            self.muteBtn.setTitle("Mute", for: .normal)
        } else {
            self.muteBtn.setTitle("Unmute", for: .normal)
        }
    }
}

@IBAction func actionOnCallEndBtn(_ sender: Any) {
    self.room!.disconnect()
    logMessage(messageText: "Attempting to disconnect from room \(room!.name)")
}

func performRoomConnect(accessToken: String, roomName: String) {
    // Configure access token either from server or manually.
    // If the default wasn't changed, try fetching from server.

    // Prepare local media which we will share with Room Participants.
    self.prepareLocalMedia()

    // Preparing the connect options with the access token that we fetched (or hardcoded).
    let connectOptions = ConnectOptions(token: accessToken) { (builder) in

        // Use the local media that we prepared earlier.
        builder.audioTracks = self.localAudioTrack != nil ? [self.localAudioTrack!] : [LocalAudioTrack]()
        builder.videoTracks = self.localVideoTrack != nil ? [self.localVideoTrack!] : [LocalVideoTrack]()

        // Use the preferred audio codec
        if let preferredAudioCodec = Settings.shared.audioCodec {
            builder.preferredAudioCodecs = [preferredAudioCodec]
        }

        // Use the preferred video codec
        if let preferredVideoCodec = Settings.shared.videoCodec {
            builder.preferredVideoCodecs = [preferredVideoCodec]
        }

        // Use the preferred encoding parameters
        if let encodingParameters = Settings.shared.getEncodingParameters() {
            builder.encodingParameters = encodingParameters
        }

        // Use the preferred signaling region
        if let signalingRegion = Settings.shared.signalingRegion {
            builder.region = signalingRegion
        }

        // The name of the Room where the Client will attempt to connect to. Please note that if you pass an empty
        // Room `name`, the Client will create one for you. You can get the name or sid from any connected Room.
        builder.roomName = roomName
    }

    // Connect to the Room using the options we provided.
    room = TwilioVideoSDK.connect(options: connectOptions, delegate: self)

}

func startPreview() {
    if PlatformUtils.isSimulator {
        return
    }

    let frontCamera = CameraSource.captureDevice(position: .front)
    let backCamera = CameraSource.captureDevice(position: .back)

    if (frontCamera != nil || backCamera != nil) {

        let options = CameraSourceOptions { (builder) in
            if #available(iOS 13.0, *) {
                // Track UIWindowScene events for the key window's scene.
                // The example app disables multi-window support in the .plist (see UIApplicationSceneManifestKey).
                builder.orientationTracker = UserInterfaceTracker(scene: UIApplication.shared.keyWindow!.windowScene!)
            }
        }
        // Preview our local camera track in the local video preview view.
        camera = CameraSource(options: options, delegate: self)
        localVideoTrack = LocalVideoTrack(source: camera!, enabled: true, name: "Camera")

        // Add renderer to video track for local preview
        localVideoTrack!.addRenderer(self.localPreview)
        logMessage(messageText: "Video track created")

        if (frontCamera != nil && backCamera != nil) {
            // We will flip camera on tap.
            let tap = UITapGestureRecognizer(target: self, action: #selector(flipCamera))
            self.localPreview.addGestureRecognizer(tap)
        }

        camera!.startCapture(device: frontCamera != nil ? frontCamera! : backCamera!) { (captureDevice, videoFormat, error) in
            if let error = error {
                self.logMessage(messageText: "Capture failed with error.\ncode = \((error as NSError).code) error = \(error.localizedDescription)")
            } else {
                self.localPreview.shouldMirror = (captureDevice.position == .front)
            }
        }
    }
    else {
        self.logMessage(messageText:"No front or back capture device found!")
    }
}

@objc func flipCamera() {
    var newDevice: AVCaptureDevice?

    if let camera = self.camera, let captureDevice = camera.device {
        if captureDevice.position == .front {
            newDevice = CameraSource.captureDevice(position: .back)
        } else {
            newDevice = CameraSource.captureDevice(position: .front)
        }

        if let newDevice = newDevice {
            camera.selectCaptureDevice(newDevice) { (captureDevice, videoFormat, error) in
                if let error = error {
                    self.logMessage(messageText: "Error selecting capture device.\ncode = \((error as NSError).code) error = \(error.localizedDescription)")
                } else {
                    self.localPreview.shouldMirror = (captureDevice.position == .front)
                }
            }
        }
    }
}

 func prepareLocalMedia() {

     // We will share local audio and video when we connect to the Room.

     // Create an audio track.
     if (localAudioTrack == nil) {
         localAudioTrack = LocalAudioTrack(options: nil, enabled: true, name: "Microphone")

         if (localAudioTrack == nil) {
             logMessage(messageText: "Failed to create audio track")
         }
     }

     // Create a video track which captures from the camera.
     if (localVideoTrack == nil) {
         self.startPreview()
     }
}

func logMessage(messageText: String) {
    NSLog(messageText)
    let log = LagObj()
    log.message = messageText
    HulloPayRealm.getInstance().addLogDetails(roomDetails: log)
    statusLabel.text = messageText
}

func renderRemoteParticipant(participant : RemoteParticipant) -> Bool {
    // This example renders the first subscribed RemoteVideoTrack from the RemoteParticipant.
    let videoPublications = participant.remoteVideoTracks
    for publication in videoPublications {
        if let subscribedVideoTrack = publication.remoteTrack,
            publication.isTrackSubscribed {
            setupRemoteVideoView()
            subscribedVideoTrack.addRenderer(self.remoteView!)
            self.remoteParticipant = participant
            return true
        }
    }
    return false
}

func renderRemoteParticipants(participants : Array<RemoteParticipant>) {
    for participant in participants {
        // Find the first renderable track.
        if participant.remoteVideoTracks.count > 0,
            renderRemoteParticipant(participant: participant) {
            break
        }
    }
}

func cleanupRemoteParticipant() {
    if self.remoteParticipant != nil {
        self.remoteView?.removeFromSuperview()
        self.remoteView = nil
        self.remoteParticipant = nil
    }
}

func setupRemoteVideoView() {
    // Creating `VideoView` programmatically
    self.remoteView = VideoView(frame: CGRect.zero, delegate: self)

    self.view.insertSubview(self.remoteView!, at: 0)

    // `VideoView` supports scaleToFill, scaleAspectFill and scaleAspectFit
    // scaleAspectFit is the default mode when you create `VideoView` programmatically.
    self.remoteView!.contentMode = .scaleAspectFit;

    let centerX = NSLayoutConstraint(item: self.remoteView!,
                                     attribute: NSLayoutConstraint.Attribute.centerX,
                                     relatedBy: NSLayoutConstraint.Relation.equal,
                                     toItem: self.view,
                                     attribute: NSLayoutConstraint.Attribute.centerX,
                                     multiplier: 1,
                                     constant: 0);
    self.view.addConstraint(centerX)
    let centerY = NSLayoutConstraint(item: self.remoteView!,
                                     attribute: NSLayoutConstraint.Attribute.centerY,
                                     relatedBy: NSLayoutConstraint.Relation.equal,
                                     toItem: self.view,
                                     attribute: NSLayoutConstraint.Attribute.centerY,
                                     multiplier: 1,
                                     constant: 0);
    self.view.addConstraint(centerY)
    let width = NSLayoutConstraint(item: self.remoteView!,
                                   attribute: NSLayoutConstraint.Attribute.width,
                                   relatedBy: NSLayoutConstraint.Relation.equal,
                                   toItem: self.view,
                                   attribute: NSLayoutConstraint.Attribute.width,
                                   multiplier: 1,
                                   constant: 0);
    self.view.addConstraint(width)
    let height = NSLayoutConstraint(item: self.remoteView!,
                                    attribute: NSLayoutConstraint.Attribute.height,
                                    relatedBy: NSLayoutConstraint.Relation.equal,
                                    toItem: self.view,
                                    attribute: NSLayoutConstraint.Attribute.height,
                                    multiplier: 1,
                                    constant: 0);
    self.view.addConstraint(height)
}

}

// MARK:- RoomDelegate extension TwilioViewController : RoomDelegate { func roomDidConnect(room: Room) { logMessage(messageText: "Connected to room (room.name) as (room.localParticipant?.identity ?? "")")

    // This example only renders 1 RemoteVideoTrack at a time. Listen for all events to decide which track to render.
    for remoteParticipant in room.remoteParticipants {
        remoteParticipant.delegate = self
    }
}

func roomDidDisconnect(room: Room, error: Error?) {
    logMessage(messageText: "Disconnected from room \(room.name), error = \(String(describing: error))")
    self.cleanupRemoteParticipant()
    self.room = nil
    self.dismiss(animated: true, completion: nil)
}

func roomDidFailToConnect(room: Room, error: Error) {
    logMessage(messageText: "Failed to connect to room with error = \(String(describing: error))")
    self.room = nil

}

func roomIsReconnecting(room: Room, error: Error) {
    logMessage(messageText: "Reconnecting to room \(room.name), error = \(String(describing: error))")
}

func roomDidReconnect(room: Room) {
    logMessage(messageText: "Reconnected to room \(room.name)")
}

func participantDidConnect(room: Room, participant: RemoteParticipant) {
    // Listen for events from all Participants to decide which RemoteVideoTrack to render.
    participant.delegate = self

    logMessage(messageText: "Participant \(participant.identity) connected with \(participant.remoteAudioTracks.count) audio and \(participant.remoteVideoTracks.count) video tracks")
}

func participantDidDisconnect(room: Room, participant: RemoteParticipant) {
    logMessage(messageText: "Room \(room.name), Participant \(participant.identity) disconnected")
    // Nothing to do in this example. Subscription events are used to add/remove renderers.
}

}

// MARK:- RemoteParticipantDelegate extension TwilioViewController : RemoteParticipantDelegate {

func remoteParticipantDidPublishVideoTrack(participant: RemoteParticipant, publication: RemoteVideoTrackPublication) {
    // Remote Participant has offered to share the video Track.

    logMessage(messageText: "Participant \(participant.identity) published \(publication.trackName) video track")
}

func remoteParticipantDidUnpublishVideoTrack(participant: RemoteParticipant, publication: RemoteVideoTrackPublication) {
    // Remote Participant has stopped sharing the video Track.

    logMessage(messageText: "Participant \(participant.identity) unpublished \(publication.trackName) video track")
}

func remoteParticipantDidPublishAudioTrack(participant: RemoteParticipant, publication: RemoteAudioTrackPublication) {
    // Remote Participant has offered to share the audio Track.

    logMessage(messageText: "Participant \(participant.identity) published \(publication.trackName) audio track")
}

func remoteParticipantDidUnpublishAudioTrack(participant: RemoteParticipant, publication: RemoteAudioTrackPublication) {
    // Remote Participant has stopped sharing the audio Track.

    logMessage(messageText: "Participant \(participant.identity) unpublished \(publication.trackName) audio track")
}

func didSubscribeToVideoTrack(videoTrack: RemoteVideoTrack, publication: RemoteVideoTrackPublication, participant: RemoteParticipant) {
    // The LocalParticipant is subscribed to the RemoteParticipant's video Track. Frames will begin to arrive now.

    logMessage(messageText: "Subscribed to \(publication.trackName) video track for Participant \(participant.identity)")

    if (self.remoteParticipant == nil) {
        _ = renderRemoteParticipant(participant: participant)
    }
}

func didUnsubscribeFromVideoTrack(videoTrack: RemoteVideoTrack, publication: RemoteVideoTrackPublication, participant: RemoteParticipant) {
    // We are unsubscribed from the remote Participant's video Track. We will no longer receive the
    // remote Participant's video.

    logMessage(messageText: "Unsubscribed from \(publication.trackName) video track for Participant \(participant.identity)")

    if self.remoteParticipant == participant {
        cleanupRemoteParticipant()

        // Find another Participant video to render, if possible.
        if var remainingParticipants = room?.remoteParticipants,
            let index = remainingParticipants.index(of: participant) {
            remainingParticipants.remove(at: index)
            renderRemoteParticipants(participants: remainingParticipants)
        }
    }
}

func didSubscribeToAudioTrack(audioTrack: RemoteAudioTrack, publication: RemoteAudioTrackPublication, participant: RemoteParticipant) {
    // We are subscribed to the remote Participant's audio Track. We will start receiving the
    // remote Participant's audio now.

    logMessage(messageText: "Subscribed to \(publication.trackName) audio track for Participant \(participant.identity)")
}

func didUnsubscribeFromAudioTrack(audioTrack: RemoteAudioTrack, publication: RemoteAudioTrackPublication, participant: RemoteParticipant) {
    // We are unsubscribed from the remote Participant's audio Track. We will no longer receive the
    // remote Participant's audio.

    logMessage(messageText: "Unsubscribed from \(publication.trackName) audio track for Participant \(participant.identity)")
}

func remoteParticipantDidEnableVideoTrack(participant: RemoteParticipant, publication: RemoteVideoTrackPublication) {
    logMessage(messageText: "Participant \(participant.identity) enabled \(publication.trackName) video track")
}

func remoteParticipantDidDisableVideoTrack(participant: RemoteParticipant, publication: RemoteVideoTrackPublication) {
    logMessage(messageText: "Participant \(participant.identity) disabled \(publication.trackName) video track")
}

func remoteParticipantDidEnableAudioTrack(participant: RemoteParticipant, publication: RemoteAudioTrackPublication) {
    logMessage(messageText: "Participant \(participant.identity) enabled \(publication.trackName) audio track")
}

func remoteParticipantDidDisableAudioTrack(participant: RemoteParticipant, publication: RemoteAudioTrackPublication) {
    logMessage(messageText: "Participant \(participant.identity) disabled \(publication.trackName) audio track")
}

func didFailToSubscribeToAudioTrack(publication: RemoteAudioTrackPublication, error: Error, participant: RemoteParticipant) {
    logMessage(messageText: "FailedToSubscribe \(publication.trackName) audio track, error = \(String(describing: error))")
}

func didFailToSubscribeToVideoTrack(publication: RemoteVideoTrackPublication, error: Error, participant: RemoteParticipant) {
    logMessage(messageText: "FailedToSubscribe \(publication.trackName) video track, error = \(String(describing: error))")
}

}

// MARK:- VideoViewDelegate extension TwilioViewController : VideoViewDelegate { func videoViewDimensionsDidChange(view: VideoView, dimensions: CMVideoDimensions) { self.view.setNeedsLayout() } }

// MARK:- CameraSourceDelegate extension TwilioViewController : CameraSourceDelegate { func cameraSourceDidFail(source: CameraSource, error: Error) { logMessage(messageText: "Camera source failed with error: (error.localizedDescription)") } }

musheer-ahamed commented 4 years ago

@ceaglest I have attached log during going background and come foreground.

2020-07-31 21:09:33.739811+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:36.550176+0530 Hullo Dev[330:48411] DEBUG:Twilio:Core: Invoking cancelled closure. 2020-07-31 21:09:37.071429+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"} 2020-07-31 21:09:38.104866+0530 Hullo Dev[330:48602] INFO:Twilio:Platform: AVCaptureSession interrupted with reason: 1 2020-07-31 21:09:38.104998+0530 Hullo Dev[330:48602] INFO:Twilio:Platform: ... Capture pipeline did stop. 2020-07-31 21:09:38.105061+0530 Hullo Dev[330:48602] DEBUG:Twilio:Platform: Teardown video output pipeline ... 2020-07-31 21:09:38.105118+0530 Hullo Dev[330:48602] DEBUG:Twilio:Platform: Finished video output pipeline teardown. 2020-07-31 21:09:38.105174+0530 Hullo Dev[330:48602] DEBUG:Twilio:Platform: Video pipeline did finish running 2020-07-31 21:09:38.105361+0530 Hullo Dev[330:48602] INFO:Twilio:Platform: AVCaptureSession stopped running 2020-07-31 21:09:38.109742+0530 Hullo Dev[330:48879] TIC Read Status [13:0x0]: 1:57 2020-07-31 21:09:38.109850+0530 Hullo Dev[330:48879] TIC Read Status [13:0x0]: 1:57 2020-07-31 21:09:38.236649+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:41.875341+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"} 2020-07-31 21:09:42.737169+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:45.948551+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): Application will enter foreground. 2020-07-31 21:09:45.948674+0530 Hullo Dev[330:46585] INFO:Twilio:[Platform](Thread 0x0x14747e860): Manually restarting interrupted session. 2020-07-31 21:09:46.164693+0530 Hullo Dev[330:48879] INFO:Twilio:Platform: AVCaptureSession interrupted with reason: 1 2020-07-31 21:09:46.164955+0530 Hullo Dev[330:48879] INFO:Twilio:Platform: ... Capture pipeline did stop. 2020-07-31 21:09:46.165026+0530 Hullo Dev[330:48879] DEBUG:Twilio:Platform: Teardown video output pipeline ... 2020-07-31 21:09:46.165093+0530 Hullo Dev[330:48879] DEBUG:Twilio:Platform: Finished video output pipeline teardown. 2020-07-31 21:09:46.165152+0530 Hullo Dev[330:48879] DEBUG:Twilio:Platform: Video pipeline did finish running 2020-07-31 21:09:46.165210+0530 Hullo Dev[330:48879] DEBUG:Twilio:Platform: No background task to stop. 2020-07-31 21:09:46.224259+0530 Hullo Dev[330:48879] INFO:Twilio:Platform: AVCaptureSession stopped running 2020-07-31 21:09:46.684457+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"} 2020-07-31 21:09:46.897524+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): Default audio device received UIApplicationDidBecomeActiveNotification. 2020-07-31 21:09:46.904743+0530 Hullo Dev[330:48985] INFO:Twilio:Platform: AVCaptureSession interruption ended 2020-07-31 21:09:46.904912+0530 Hullo Dev[330:48985] INFO:Twilio:Platform: AVCaptureSession started running 2020-07-31 21:09:46.908570+0530 Hullo Dev[330:48851] DEBUG:Twilio:Platform: Video pipeline will start running. 2020-07-31 21:09:46.909870+0530 Hullo Dev[330:48851] DEBUG:Twilio:Platform: Video device will start running: <AVCaptureFigVideoDevice: 0x1473db830 [Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1]>. 2020-07-31 21:09:47.237004+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:51.488819+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"} 2020-07-31 21:09:51.839941+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:56.290855+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"} 2020-07-31 21:09:56.340040+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:09:58.167957+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"body":{"version":2,"type":"update","sid":"RM10c6e09f309590b905457d9fba1596d5","name":"RM10c6e09f309590b905457d9fba1596d5","participant":{"sid":"PAfc5b3da35dd457e17cb3389cc2ea4be2","identity":"Musheer+2 2_252_446","tracks":[{"kind":"video","priority":"standard","id":"C5EfF0FbAeDb4687bb1f119D31cbb5Bf","enabled":true,"sid":"MT230ae8b309ea301af423a6638658aeb9","name":"Camera","state":"ready"},{"kind":"audio","priority":"standard","id":"E8FadF20Af3b5fDf406f9bB9EEA7dF0C","enabled":true,"sid":"MT846daf68366087c4341092fae6cc2c9b","name":"Microphone","state":"ready"}],"revision":1,"state":"connected"},"participants":[{"sid":"PAee52299561cee2fe3b8f623d34374725","identity":"Musheer_249_443","tracks":[{"kind":"audio","priority":"standard","id":"E3B3AEcCD7aB3e6f8bA3eDBC53e78f40","enabled":true,"sid":"MT08821cb636b58cd29a6499564ee027a1","name":"mic","state":"ready"},{"kind":"video","priority":"standard","id":"4B9fBC6D4579BAF1Cab8e63FA6Bc73e3","enabled":true,"sid":"MT8abf16494a453fc3bf7aa5d3987a0914","name":"camera","state":"ready"}],"revision":2,"state":"disconnected"}],"recording":{"enabled":false,"revision":1},"subscribed":{"revision":1,"tracks":[{"id":"3140b401-b7b8-4428-8a25-8f2e4c28ec91","sid":"MT8abf16494a453fc3bf7aa5d3987a0914"},{"id":"b296a4bd-8b08-4e0c-8715-8d4531310dad","sid":"MT08821cb636b58cd29a6499564ee027a1"}]}},"type":"msg"} 2020-07-31 21:09:58.179389+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.179555+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.179706+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackSid 2020-07-31 21:09:58.179875+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackSid 2020-07-31 21:09:58.180023+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackName 2020-07-31 21:09:58.180120+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getIdentity 2020-07-31 21:09:58.180235+0530 Hullo Dev[330:46585] Unsubscribed from mic audio track for Participant Musheer_249_443 2020-07-31 21:09:58.180557+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): -[TVIAudioTrack dealloc] 2020-07-31 21:09:58.180676+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.180752+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call setTrackSubscribed 2020-07-31 21:09:58.180825+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.180898+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackSid 2020-07-31 21:09:58.181032+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackSid 2020-07-31 21:09:58.181683+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getTrackName 2020-07-31 21:09:58.181778+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getIdentity 2020-07-31 21:09:58.181872+0530 Hullo Dev[330:46585] Unsubscribed from camera video track for Participant Musheer_249_443 2020-07-31 21:09:58.182073+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.182156+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.182876+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): Did move to window with size: {0, 0}. Metal content scale factor is now: 0.000 2020-07-31 21:09:58.183551+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.183663+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.183865+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getWebRtcTrack 2020-07-31 21:09:58.183944+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getWebRtcTrack 2020-07-31 21:09:58.189261+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): -[TVIVideoTrack dealloc] 2020-07-31 21:09:58.189654+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call setTrack 2020-07-31 21:09:58.189885+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): RemoteParticipantSignaling::~RemoteParticipantSignaling(SID = PAee52299561cee2fe3b8f623d34374725) 2020-07-31 21:09:58.189996+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.190358+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.190481+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getSid 2020-07-31 21:09:58.193580+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getName 2020-07-31 21:09:58.193702+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getIdentity 2020-07-31 21:09:58.193823+0530 Hullo Dev[330:46585] Room 1678, Participant Musheer_249_443 disconnected 2020-07-31 21:09:58.194120+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): -[TVIRemoteParticipant dealloc] 2020-07-31 21:09:58.194240+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getIdentity 2020-07-31 21:09:58.194471+0530 Hullo Dev[330:46585] INFO:Twilio:[Core](Thread 0x0x14747e860): Invalidating remote media of Musheer_249_443 2020-07-31 21:09:58.194553+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.194628+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.194702+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): RemoteParticipantImpl::~RemoteParticipantImpl 2020-07-31 21:09:58.200494+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getIdentity 2020-07-31 21:09:58.200634+0530 Hullo Dev[330:46585] INFO:Twilio:[Core](Thread 0x0x14747e860): Invalidating remote media of Musheer_249_443 2020-07-31 21:09:58.200713+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.200787+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Core](Thread 0x0x14747e860): API Call getRemoteTrack 2020-07-31 21:09:58.201400+0530 Hullo Dev[330:46585] DEBUG:Twilio:[Platform](Thread 0x0x14747e860): -[TVIMetalRenderer dealloc] 2020-07-31 21:09:58.369462+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"body":{"version":2,"type":"update","peer_connections":[{"id":"Dba318f704f2CdAE6FCDD1aB33E0Fc19","description":{"type":"offer","sdp":"v=0\r\no=- 3805198761 3805198763 IN IP4 0.0.0.0\r\ns=VM4daa7a7373cafc570dc995c5e42ec3bf\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=ice-lite\r\na=msid-semantic: WMS *\r\na=group:BUNDLE audio video\r\nm=audio 1 UDP/TLS/RTP/SAVPF 111 0\r\nc=IN IP4 0.0.0.0\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap:0 PCMU/8000\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=candidate:2 1 UDP 2013266430 3.235.111.226 13102 typ host\r\na=candidate:2 2 UDP 2013266429 3.235.111.226 10312 typ host\r\na=rtcp-mux\r\na=setup:actpass\r\na=mid:audio\r\na=recvonly\r\na=ice-ufrag:lzrg\r\na=ice-pwd:baYiBsXtnL2OgVvjNHDs/q\r\na=fingerprint:sha-256 58:9D:DE:57:02:42:63:52:D0:F8:6C:B4:92:89:46:9D:18:26:12:B2:92:2C:95:E8:C8:3D:CB:18:92:81:70:CB\r\nm=video 1 UDP/TLS/RTP/SAVPF 96 100 102 127\r\nc=IN IP4 0.0.0.0\r\na=rtpmap:96 VP8/90000\r\na=rtpmap:100 H264/90000\r\na=rtpmap:102 red/90000\r\na=rtpmap:127 ulpfec/90000\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-rsize\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 ccm fir\r\na=candidate:2 1 UDP 2013266430 3.235.111.226 13102 typ host\r\na=candidate:2 2 UDP 2013266429 3.235.111.226 10312 typ host\r\na=rtcp-mux\r\na=setup:actpass\r\na=mid:video\r\na=recvonly\r\na=ice-ufrag:lzrg\r\na=ice-pwd:baYiBsXtnL2OgVvjNHDs/q\r\na=fingerprint:sha-256 58:9D:DE:57:02:42:63:52:D0:F8:6C:B4:92:89:46:9D:18:26:12:B2:92:2C:95:E8:C8:3D:CB:18:92:81:70:CB\r\n","revision":3}}],"sid":"RM10c6e09f309590b905457d9fba1596d5","name":"1678","participant":{"sid":"PAfc5b3da35dd457e17cb3389cc2ea4be2","identity":"Musheer+2 2_252_446","tracks":[{"kind":"video","priority":"standard","id":"C5EfF0FbAeDb4687bb1f119D31cbb5Bf","enabled":true,"sid":"MT230ae8b309ea301af423a6638658aeb9","name":"Camera","state":"ready"},{"kind":"audio","priority":"standard","id":"E8FadF20Af3b5fDf406f9bB9EEA7dF0C","enabled":true,"sid":"MT846daf68366087c4341092fae6cc2c9b","name":"Microphone","state":"ready"}],"revision":1,"state":"connected"},"participants":[],"recording":{"enabled":false,"revision":1},"subscribed":{"revision":2,"tracks":[]},"published":{"revision":1,"tracks":[{"kind":"video","priority":"standard","id":"C5EfF0FbAeDb4687bb1f119D31cbb5Bf","enabled":true,"sid":"MT230ae8b309ea301af423a6638658aeb9","name":"Camera","state":"ready"},{"kind":"audio","priority":"standard","id":"E8FadF20Af3b5fDf406f9bB9EEA7dF0C","enabled":true,"sid":"MT846daf68366087c4341092fae6cc2c9b","name":"Microphone","state":"ready"}]}},"type":"msg"} 2020-07-31 21:09:58.375324+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Open -> Updating. Process an event 2020-07-31 21:09:58.375436+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Process remote offer. 2020-07-31 21:09:58.375588+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Process remote sdp for: Dba318f704f2CdAE6FCDD1aB33E0Fc19 revision is: 3. 2020-07-31 21:09:58.376716+0530 Hullo Dev[330:48599] DEBUG:Twilio:Core: Applying remote description to: Dba318f704f2CdAE6FCDD1aB33E0Fc19 rev: 3 2020-07-31 21:09:58.389249+0530 Hullo Dev[330:49042] INFO:Twilio:Core: Track with track id b296a4bd-8b08-4e0c-8715-8d4531310dad has not been subscribed to yet. 2020-07-31 21:09:58.389866+0530 Hullo Dev[330:49042] INFO:Twilio:Core: Track with track id 3140b401-b7b8-4428-8a25-8f2e4c28ec91 has not been subscribed to yet. 2020-07-31 21:09:58.390560+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: onSetSessionRemoteDescription: Dba318f704f2CdAE6FCDD1aB33E0Fc19 2020-07-31 21:09:58.391023+0530 Hullo Dev[330:48599] DEBUG:Twilio:Core: Create local answer: Dba318f704f2CdAE6FCDD1aB33E0Fc19 2020-07-31 21:09:58.391975+0530 Hullo Dev[330:48599] DEBUG:Twilio:Core: Including track id: C5EfF0FbAeDb4687bb1f119D31cbb5Bf for simulcast. 2020-07-31 21:09:58.392170+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: onCreateSessionLocalDescription Dba318f704f2CdAE6FCDD1aB33E0Fc19 2020-07-31 21:09:58.392505+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: SDP Utils: New SSRC 881876174 replaced with Old SSRC 881876174 2020-07-31 21:09:58.392679+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: SDP Utils: New SSRC 2390771870 replaced with Old SSRC 2390771870 2020-07-31 21:09:58.392848+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: SDP Utils: New SSRC 1352611626 replaced with Old SSRC 1352611626 2020-07-31 21:09:58.392974+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: SDP Utils: New SSRC group 881876174 2390771870 --- Original SSRC group 881876174 2390771870 2020-07-31 21:09:58.398245+0530 Hullo Dev[330:48599] DEBUG:Twilio:Core: Applying local description to: Dba318f704f2CdAE6FCDD1aB33E0Fc19 rev: 3 2020-07-31 21:09:58.400313+0530 Hullo Dev[330:49042] INFO:Twilio:Core: Local answer is ready for Dba318f704f2CdAE6FCDD1aB33E0Fc19. 2020-07-31 21:09:58.400632+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Queue Description: 3 for PeerConnection: Dba318f704f2CdAE6FCDD1aB33E0Fc19. 2020-07-31 21:09:58.401439+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: onSetSessionLocalDescription: Dba318f704f2CdAE6FCDD1aB33E0Fc19 2020-07-31 21:09:58.401751+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (3260 bytes): {"body":{"participant":{"revision":1,"tracks":[{"enabled":true,"id":"C5EfF0FbAeDb4687bb1f119D31cbb5Bf","kind":"video","name":"Camera","priority":"standard"},{"enabled":true,"id":"E8FadF20Af3b5fDf406f9bB9EEA7dF0C","kind":"audio","name":"Microphone","priority":"standard"}]},"peer_connections":[{"description":{"revision":3,"sdp":"v=0\r\no=- 4210670113872408483 4 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS 8cCCafA3c945f8FbcfB8398ce5CDD3FB\r\nm=audio 45904 UDP/TLS/RTP/SAVPF 111 0\r\nc=IN IP4 14.98.153.162\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=candidate:2943013415 1 udp 2122260223 192.168.2.3 62156 typ host generation 0 network-id 1 network-cost 10\r\na=candidate:1634928074 1 udp 2122194687 169.254.61.167 57629 typ host generation 0 network-id 2 network-cost 10\r\na=candidate:104160754 1 udp 1686052607 14.98.153.162 45904 typ srflx raddr 192.168.2.3 rport 62156 generation 0 network-id 1 network-cost 10\r\na=ice-ufrag:42e+\r\na=ice-pwd:XIud6AUXcLgLq3ebeFB0Wq5X\r\na=ice-options:trickle\r\na=fingerprint:sha-256 62:46:4F:5E:BF:32:1A:2F:A6:DD:94:FF:38:A4:B6:B7:AB:48:78:4B:A7:55:B3:EC:C2:E0:D6:99:58:81:12:DB\r\na=setup:passive\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:0 PCMU/8000\r\na=ssrc:1352611626 cname:nrGkx4cuI4x5ljDq\r\na=ssrc:1352611626 msid:8cCCafA3c945f8FbcfB8398ce5CDD3FB E8FadF20Af3b5fDf406f9bB9EEA7dF0C\r\na=ssrc:1352611626 mslabel:8cCCafA3c945f8FbcfB8398ce5CDD3FB\r\na=ssrc:1352611626 label:E8FadF20Af3b5fDf406f9bB9EEA7dF0C\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 100 102 127\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:42e+\r\na=ice-pwd:XIud6AUXcLgLq3ebeFB0Wq5X\r\na=ice-options:trickle\r\na=fingerprint:sha-256 62:46:4F:5E:BF:32:1A:2F:A6:DD:94:FF:38:A4:B6:B7:AB:48:78:4B:A7:55:B3:EC:C2:E0:D6:99:58:81:12:DB\r\na=setup:passive\r\na=mid:video\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=sendonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:102 red/90000\r\na=rtpmap:127 ulpfec/90000\r\na=ssrc-group:FID 881876174 2390771870\r\na=ssrc:881876174 cname:nrGkx4cuI4x5ljDq\r\na=ssrc:881876174 msid:8cCCafA3c945f8FbcfB8398ce5CDD3FB C5EfF0FbAeDb4687bb1f119D31cbb5Bf\r\na=ssrc:881876174 mslabel:8cCCafA3c945f8FbcfB8398ce5CDD3FB\r\na=ssrc:881876174 label:C5EfF0FbAeDb4687bb1f119D31cbb5Bf\r\na=ssrc:2390771870 cname:nrGkx4cuI4x5ljDq\r\na=ssrc:2390771870 msid:8cCCafA3c945f8FbcfB8398ce5CDD3FB C5EfF0FbAeDb4687bb1f119D31cbb5Bf\r\na=ssrc:2390771870 mslabel:8cCCafA3c945f8FbcfB8398ce5CDD3FB\r\na=ssrc:2390771870 label:C5EfF0FbAeDb4687bb1f119D31cbb5Bf\r\n","type":"answer"},"id":"Dba318f704f2CdAE6FCDD1aB33E0Fc19"}],"session":"f706171ec9f70e28c3b45de17527a3b510c6e09f309590b905457d9fba1596d5fc5b3da35dd457e17cb3389cc2ea4be2b34061df91d8ff858826cc8edec5530e","type":"update","version":2},"type":"msg"} 2020-07-31 21:09:58.401921+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Updating -> Open 2020-07-31 21:09:58.402261+0530 Hullo Dev[330:49042] DEBUG:Twilio:Core: Done processing onSetSessionLocalDescription: Dba318f704f2CdAE6FCDD1aB33E0Fc19 2020-07-31 21:10:00.836902+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Received message: {"type":"heartbeat"} 2020-07-31 21:10:03.206620+0530 Hullo Dev[330:48681] DEBUG:Twilio:Core: Sending message (21 bytes): {"type":"heartbeat"}

musheer-ahamed commented 4 years ago

@ceaglest thanks for your support. Finally fixed this issue. While coming foreground audio session was changing in some other viewcontroller.

ceaglest commented 4 years ago

Hi @musheer-ahamed,

Sorry I couldn't do more to debug the issue. In RM697de0e1fde5d17652e18ca475d21be9 I saw the audio get published multiple times with the same name resulting in 53304 errors. It sounds like you're no longer re-publishing audio and you figured out the AVAudioSession issue in your other view controller. This is what we expect in a typical integration. 👍

Best, Chris