首先搭建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()
}
}
这样就简单实现了推流和拉流的功能