Skip to end of metadata
Go to start of metadata

Example of iOS application with player and streamer

This streamer can be used to publish WebRTC video stream and play any of the following types of streams on Web Call Server

  • RTSP
  • WebRTC
  • RTMP
  • RTMFP

On the screenshot below the example is displayed when a stream is being published and another stream is being played.
Input fields

  • 'WCS URL', where demo.flashphoner.com is the address of the WCS server
  • 'Publish Stream' - for the name of published stream
  • 'Play Stream' - for the name of played stream

Two videos are played

  • left - video from the camera
  • right - the played video stream

Work with code of the example

To analyze the code, let's take TwoWayStreamingSwift example, which can be downloaded from GitHub.

The class for main view of the application: ViewController (inmplementation file ViewController.swift).

1. Import of API. code

import FPWCSApi2Swift


2. Session creation and connection to server

WCSSession, WCSSession.connect code

The options include:

  • URL of WCS server
  • appKey of internal server-side application (defaultApp)
    @IBAction func connectPressed(_ sender: Any) {
        changeViewState(connectButton, false)
        if (connectButton.title(for: .normal) == "CONNECT") {
            if (session == nil) {
                let options = FPWCSApi2SessionOptions()
                options.urlServer = urlField.text
                options.appKey = "defaultApp"
                do {
                    try session = WCSSession(options)
                } catch {
                    print(error)
                }
            }
            ...
            changeViewState(urlField, false)
            session?.connect()
        } else {
            session?.disconnect()
        }

    }


3. Stream publishing.

WCSSession.createStream, WCSStream.publish code

Object with the followin stream options is passed to createStream method:

  • stream name
  • view to display video
    @IBAction func publishPressed(_ sender: Any) {
        changeViewState(publishButton,false)
        if (publishButton.title(for: .normal) == "PUBLISH") {
            let options = FPWCSApi2StreamOptions()
            options.name = publishName.text
            options.display = localDisplay.videoView
            do {
            publishStream = try session!.createStream(options)
            } catch {
                print(error);
            }
            ...            
            do {
                try publishStream?.publish()
            } catch {
                print(error);
            }
        }
        ...
    }


4. Stream playback.

WCSSession.createStream, WCSStream.play code

Object with the folowing stream options is passed to createStream method:

  • stream name
  • view to display video
    @IBAction func playPressed(_ sender: Any) {
        changeViewState(playButton,false)
        if (playButton.title(for: .normal) == "PLAY") {
            let options = FPWCSApi2StreamOptions()
            options.name = playName.text;
            options.display = remoteDisplay.videoView;
            do {
            playStream = try session!.createStream(options)
            } catch {
                print(error)
            }
            ...
            do {
                try playStream?.play()
            } catch {
                print(error);
            }
        }
        ...
    }


5. Stop of stream playback.

WCSStream.stop code

    @IBAction func playPressed(_ sender: Any) {
        changeViewState(playButton,false)
        if (playButton.title(for: .normal) == "PLAY") {
            ...
        } else{
            do {
                try playStream?.stop();
            } catch {
                print(error);
            }
        }
    }


6. Stop of stream publishing..

WCSStream.stop code

    @IBAction func publishPressed(_ sender: Any) {
        changeViewState(publishButton,false)
        if (publishButton.title(for: .normal) == "PUBLISH") {
            ...
        } else {
            do {
                try publishStream?.stop();
            } catch {
                print(error);
            }
            
        }
        
    }


7. Disconnection.

WCSSession.disconnect code

    @IBAction func connectPressed(_ sender: Any) {
        changeViewState(connectButton, false)
        if (connectButton.title(for: .normal) == "CONNECT") {
            ...
        } else {
            session?.disconnect()
        }

    }
  • No labels