notes

HLS

是苹果公司实现的基于 HTTP 的流媒体传输协议,全称 HTTP Live Streaming。当推流端将采集到的视频流推到服务器时,服务器会将视频流封包成一个个新的ts文件,并创建一个m3u8索引文件来管理这个ts文件。像一些视频网站开始播放视频的时候会请求一个m3u8文件,里面是一段段的ts分片,一边看视频一边下载其他的ts文件,这个就是hls。适合点播。

RTMP

实时消息传输协议,全称为Real Time Messaging Protocol,和hls相比,最大的优点就是延迟小,基本上能维持在5s左右,hls大概在30秒,而且服务器不会有落地文件,直播基本上都用rtmp协议。

搭建服务端
  1. 首先需要有一个自己的rtmp服务器
    docker pull jasonrivers/nginx-rtmp
    docker run -d --name live -p 1935:1935 -p 8080:8080 jasonrivers/nginx-rtmp
    /*
    Streaming Service: Custom
    Server: rtmp://<your server ip>/live
    Play Path/Stream Key: mystream
    */
    

rtmp地址:rtmp://<your server ip>/live/mystream hls地址:http://<your server ip>/hls/mystream.m3u8

客户端

使用LFLiveKit进行推流


    lazy var session: LFLiveSession = {
        let audioConfiguration = LFLiveAudioConfiguration.default()
        let videoConfiguration = LFLiveVideoConfiguration.defaultConfiguration(for: LFLiveVideoQuality.low3, outputImageOrientation: UIInterfaceOrientation.portrait)
        let session = LFLiveSession(audioConfiguration: audioConfiguration, videoConfiguration: videoConfiguration)
        session?.delegate = self
        session?.preView = self.view
        return session!
    }()
    
    @IBAction func startLive() -> Void {
        let stream = LFLiveStreamInfo()
        // http://159.203.244.176/hls/hqqsk8.m3u8
        stream.url = "rtmp://159.203.244.176/live/hqqsk8";
        session.startLive(stream)
        session.running = true
    }
    
    @IBAction func stopLive() -> Void {
        session.stopLive()
        session.running = false
    }

使用IJKPlayer进行拉流

fileprivate var player : IJKFFMoviePlayerController?
    
player = IJKFFMoviePlayerController(contentURLString: "rtmp://192.168.1.104/live/hqqsk8", with: IJKFFOptions.byDefault())
player!.view.frame = view.bounds
view.addSubview(player!.view)
player?.prepareToPlay()
PC端

使用OBS推流,使用VLC拉流