前言:用IJKPlayer需要环境搭建,具体可以自行百度。下面是应用IJKPlayer的具体代码,代码中有详细备注。
import IJKMediaFramework
第一步:---注册ijk播放器的通知
//注册ijk播放器的通知
NotificationCenter.default.addObserver(self,elector: #selector(self.moviePlayBackFinish),name: NSNotification.Name.IJKMPMoviePlayerPlaybackDidFinish, object: player)
NotificationCenter.default.addObserver(self,selector: #selector(self.loadStateDidChange),name: NSNotification.Name.IJKMPMoviePlayerLoadStateDidChange, object: player)
第二步:---初始化并开启播放器
func initPlayer(Url: String) {
let options = IJKFFOptions.byDefault()
let url = NSURL(string: Url)
//防止重复打开播放器导致内存溢出
if player != nil
{
player.shutdown()//关闭播放器
}
//初始化播放器,播放在线视频或直播
player = IJKFFMoviePlayerController(contentURL: url as URL!, with: options)
//播放页面视图宽高自适应
let autoresize = UIViewAutoresizing.flexibleWidth.rawValue | UIViewAutoresizing.flexibleHeight.rawValue
player.view.autoresizingMask = UIViewAutoresizing(rawValue: autoresize)
player.view.frame = self.ViewForPlayer.bounds
player.scalingMode = .aspectFit//缩放模式
player.shouldAutoplay = true //开启自动播放
self.ViewForPlayer.addSubview(player.view)
// self.ViewForPlayer.addSubview(indicator)
/////////////////
self.player.currentPlaybackTime = 0.1
//在子线程打开播放器避免打不开GLES
DispatchQueue.global().async {
//开启播放器
self.player.prepareToPlay()
}
}
第三步:---接收播放器状态改变的通知
//视频播放结束原因
func moviePlayBackFinish(notifycation:Notification) {
let reason = notifycation.userInfo?[IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey] as! Int
NSLog("--------------moviePlayBackFinish:\(reason)")
switch (reason) {
case 0://playbackEnded
videoStreaming = dao.readVideoStreaming(key: key_VideoStreaming)
if !videoStreaming.isEmpty || videoStreaming != nil{
initPlayer(Url: videoStreaming)
}
break
case 2://userExited
break
case 1://playbackError
print("播放错误!")
break
default:
break
}
}
///加载状态改变了
func loadStateDidChange() {
let loadState = player?.loadState.rawValue
NSLog("--------------loadStateDidChange:\(loadState!)")
// IJKMPMovieLoadState
if loadState == 3 {//开始播放视频
indicator.stopAnimating()
}else if loadState == 4 {
indicator.startAnimating()
videoStreaming = dao.readVideoStreaming(key: key_VideoStreaming)
if !videoStreaming.isEmpty || videoStreaming != nil{
initPlayer(Url: videoStreaming)
}
}
switch self.player.loadState {
// 状态为缓冲几乎完成,可以连续播放
case IJKMPMovieLoadState.playthroughOK:
break
// 可以播放状态
case IJKMPMovieLoadState.playable:
break
// 缓冲中
case IJKMPMovieLoadState.stalled:
print("缓冲中")
break
default:
print("loadStateDidChange: \(loadState!)")
}
}
///准备播放的媒体改变了
func mediaIsPreparedToPlayDidChange() {
NSLog("---mediaIsPreparedToPlayDidChange")
}
///视频播放状态改变了
func moviePlayBackStateDidChange() {
//播放 1 暂停2 播放完成 0
NSLog("---播放状态改变了:\(player?.playbackState.rawValue)")
switch player?.playbackState.rawValue ?? 0 {
case 0://停止
break
case 1://播放
break
case 2://暂停
break
case 4://中断
break
default:
break
}
}