iOS 使用LFliveKit和IJKPlayer实现直播

首先搭建nginx+rtmp本地服务器

本地nginx+rtmp

一、使用pod导入

pod 'LFLiveKit'

pod 'ijkplayer'

二、配置手机网络

终端输入  ifconfig

或者 系统设置-> 网络 -> wifi -> 详细信息

手机和mac要连接同一个WiFi,并配置代理,设置ip和端口

三、推流代码

class LivePageVC: XJBaseViewController {
    var session:LFLiveSession?
    let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first)/test.map4"
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "直播"
        session = LFLiveSession(audioConfiguration: .default(), videoConfiguration: .default())
        session?.preView = self.view
        session?.saveLocalVideo = true
       
        session?.saveLocalVideoPath = URL(fileURLWithPath: filePath, isDirectory: true, relativeTo:nil)
        session?.showDebugInfo = true
        session?.delegate = self
        self.getAccessForVideo()
        self.getAccessForAudio()
        self.addControl()
        self.startLive()
    }
    func addControl() {
        
    }
    func openBeatyface() {
        if let session = session {
            session.beautyFace = !session.beautyFace
        }
    }
    func getAccessForVideo() {
        var status = AVCaptureDevice.authorizationStatus(for: .video)
        switch status {
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: .video) { res in
                if res {
                    self.sessionRunning()
                }
            }
        case .authorized:
            self.sessionRunning()
        default:
            break
        }
    }
    func getAccessForAudio() {
        var status = AVCaptureDevice.authorizationStatus(for: .audio)
        switch status {
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: .audio) { res in
                if res {
                    self.sessionRunning()
                }
            }
        case .authorized:
            self.sessionRunning()
        default:
            break
        }
    }
    func startLive() {
        var streamInfo = LFLiveStreamInfo()
        streamInfo.url = "rtmp://192.168.1.4:1935/rtmplive/test1"
        self.session?.startLive(streamInfo)
    }
    func sessionRunning() {
        DispatchQueue.main.async {
            self.session?.running = true
        }
    }
    
}
extension LivePageVC:LFLiveSessionDelegate {
    func liveSession(_ session: LFLiveSession?, debugInfo: LFLiveDebug?) {
        
    }
    func liveSession(_ session: LFLiveSession?, errorCode: LFLiveSocketErrorCode) {
        
    }
    func liveSession(_ session: LFLiveSession?, liveStateDidChange state: LFLiveState) {
        
    }
}

四、拉流代码

import IJKMediaFramework
class LivePlayerViewController:UIViewController {
    var player:IJKFFMoviePlayerController?
    override func viewDidLoad() {
        super.viewDidLoad()
        #if DEBUG
        IJKFFMoviePlayerController.setLogReport(true)
        IJKFFMoviePlayerController.setLogLevel(k_IJK_LOG_DEBUG)
        #endif
//        IJKFFMoviePlayerController.checkIfFFmpegVersionMatch(true)
        let options = IJKFFOptions.byDefault()
        let url = URL(string: "rtmp://192.168.1.4:1935/rtmplive/test1")
        self.player = IJKFFMoviePlayerController(contentURL: url, with: options)
        self.player?.view.frame = self.view.bounds
        self.player?.scalingMode = .aspectFit
        self.player?.shouldAutoplay = true
        self.view.autoresizesSubviews = true
        if let view = self.player?.view {
            self.view.addSubview(view)
        }
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.player?.prepareToPlay()
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.player?.shutdown()
    }
    
}

这样就简单实现了推流和拉流的功能

相关推荐

  1. 使用WebRTC实现简单直播

    2024-03-10 09:02:06       40 阅读
  2. WSLUbuntu编译IJKPlayer

    2024-03-10 09:02:06       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 09:02:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 09:02:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 09:02:06       87 阅读
  4. Python语言-面向对象

    2024-03-10 09:02:06       96 阅读

热门阅读

  1. 物联网IOT发展智慧农业 助力乡村振兴

    2024-03-10 09:02:06       54 阅读
  2. mysql8 MGR集群部署

    2024-03-10 09:02:06       38 阅读
  3. 探讨:C#运行程序文件并获取输出的小问题

    2024-03-10 09:02:06       45 阅读
  4. STM32详细介绍

    2024-03-10 09:02:06       37 阅读
  5. gin golang Invalid validation tag on field ‘AId‘

    2024-03-10 09:02:06       42 阅读
  6. ELK日志中心搭建(六)- harbor镜像仓库

    2024-03-10 09:02:06       43 阅读