一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

VideoPlay实例代码

官网文档链接

1.基本概念

1.1.AVPlayer

AVPlayer是一个用来播放的对象,支持播放本地,分步下载,或者通过HLS协议得到的流媒体.
它是一个不可见的组件,如果播放mp3,mp4类的音频文件,可以.但是如果要想播放视频文件,我们就需要了解另外一个类AVPlayerLayer
AVPlayerLayer
它是对于CALayer类的扩展,通过框架在屏幕上显示内容,作为视频的渲染面,然后在用户面前进行展示.在创建AVPlayerLayer时,同时需要一个指向 AVPlayer的指针,把两者联系在一起.

1.2.AVPlayerItem

说白了,AVPlayerItem是一个载体,承载AVAsset,然后通过AVPlayer进行播放.我们要想对一个资源进行播放,那么就要通过AVPlayerItem和AVPlayerItemTrack来构建对应的动态内容

2.基本使用

加载本地mp4视频

注意视频一加载就会播放

let filePath = Bundle.main.path(forResource: "SuchAs", ofType: "mp4")
let videoURL = URL(fileURLWithPath: filePath!)
playerItem = AVPlayerItem(url: videoURL)
player = AVPlayer(playerItem: playerItem)
player.rate = 1.0//播放速度 播放前设置//创建显示视频的图层
let playerLayer = AVPlayerLayer.init(player: player)
playerLayer.videoGravity = .resizeAspect
playerLayer.frame = CGRect(x: 0, y: 0, width: 150, height: 300)
playView.layer.addSublayer(playerLayer)
player.pause()  //停止播放

加载网络视频

let videoURL = URL(string: "http://n1cdn.miaopai.com/stream/1UKfVpOmazRYEb4fVejwhgpX~3uIxmHBV~8VCQ___0_1506471211.mp4?ssig=e9a0601e2c3261e5c6b6c91a1111ced3&time_stamp=1652542020536")
playerItem = AVPlayerItem(url: videoURL!)
player = AVPlayer(playerItem: playerItem)
player.rate = 1.0//播放速度 播放前设置//创建显示视频的图层
let playerLayer = AVPlayerLayer.init(player: player)
playerLayer.videoGravity = .resizeAspect
playerLayer.frame = CGRect(x: 0, y: 0, width: 150, height: 300)
playView.layer.addSublayer(playerLayer)
player.pause()

监听播放结束

NotificationCenter.default.addObserver(self, selector: #selector(playToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
    //监听播放结束@objc func playToEndTime(){print("播放完成")}
deinit {//监听播放结束NotificationCenter.default.removeObserver(self)
}

设置播放完成只有重复播放

    @objc func playToEndTime(){player?.seek(to: CMTime(value: 0, timescale: 1))player?.play()}

监听缓存状态等

 //观察属性self.playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)//缓存区间,可用来获取缓存了多少self.playerItem.addObserver(self, forKeyPath: "loadedTimeRanges", options: .new, context: nil)//缓存不够了 自动暂停播放self.playerItem.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .new, context: nil)//缓存好了 手动播放self.playerItem.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil)
//KVO观察
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {if keyPath == "status" {switch self.playerItem.status{case .readyToPlay://player.play()print("play")case .failed:print("failed")case.unknown:print("unkonwn")default:break}}else if keyPath == "loadedTimeRanges"{let loadTimeArray = self.playerItem.loadedTimeRanges//获取最新缓存的区间let newTimeRange : CMTimeRange = loadTimeArray.first as! CMTimeRangelet startSeconds = CMTimeGetSeconds(newTimeRange.start);let durationSeconds = CMTimeGetSeconds(newTimeRange.duration);let totalBuffer = startSeconds + durationSeconds;//缓冲总长度print("当前缓冲时间:%f",totalBuffer)}else if keyPath == "playbackBufferEmpty"{print("正在缓存视频请稍等")}else if keyPath == "playbackLikelyToKeepUp"{print("缓存好了继续播放")//self.player.play()}
}

监听是否播放完

//用于实时监听滑块的进度
self.player.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1, timescale: 1), queue: DispatchQueue.main) { [weak self](time) in//当前正在播放的时间let loadTime = CMTimeGetSeconds(time)//视频总时间let totalTime = CMTimeGetSeconds((self?.player.currentItem?.duration)!)//滑块进度self?.slider.value = Float(loadTime/totalTime)self?.loadTimeLabel.text = self?.changeTimeFormat(timeInterval: loadTime)self?.totalTimeLabel.text = self?.changeTimeFormat(timeInterval: CMTimeGetSeconds((self?.player.currentItem?.duration)!))
}
//转时间格式
func changeTimeFormat(timeInterval:TimeInterval) -> String{return String(format: "%02d:%02d:%02d",(Int(timeInterval) % 3600) / 60, Int(timeInterval) / 3600,Int(timeInterval) % 60)
}

3.需求解决

3.1 获取视频的第一帧返回一张图片

3.1.1 本地视频

import UIKit
import AVFoundationclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()view.backgroundColor = .whitelet thumb = UIImageView.init(frame: CGRect.init(x: 50, y: 200, width: 300, height: 200))self.view.addSubview(thumb)let filePath = Bundle.main.path(forResource: "SuchAs", ofType: "mp4")let videoURL = URL(fileURLWithPath: filePath!)let asset = AVURLAsset.init(url: videoURL, options: nil)let gen = AVAssetImageGenerator.init(asset: asset)gen.appliesPreferredTrackTransform = truelet time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 1)var actualTime : CMTime = CMTimeMakeWithSeconds(0, preferredTimescale: 0)do {let image = try gen.copyCGImage(at: time, actualTime: &actualTime)thumb.image = UIImage.init(cgImage: image)} catch  {print("错误")}}
}

3.1.2 网络视频

import UIKit
import AVFoundationclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()view.backgroundColor = .whitelet thumb = UIImageView.init(frame: CGRect.init(x: 50, y: 200, width: 300, height: 200))self.view.addSubview(thumb)let asset = AVURLAsset.init(url: URL.init(string: "http://gslb.miaopai.com/stream/1UKfVpOmazRYEb4fVejwhgpX~3uIxmHBV~8VCQ__.mp4")!, options: nil)let gen = AVAssetImageGenerator.init(asset: asset)gen.appliesPreferredTrackTransform = truelet time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 1)var actualTime : CMTime = CMTimeMakeWithSeconds(0, preferredTimescale: 0)do {let image = try gen.copyCGImage(at: time, actualTime: &actualTime)thumb.image = UIImage.init(cgImage: image)} catch  {print("错误")}}
}

Bug

1.视频列表在飞行模式进来视频详情,视频有声音没有画面

一般视频有声音没有画面,多数都是AVPlayerLayer有关系的。

那么这次的原因是因为,使用系统监听的网络封装,从飞行模式转换到wifi模式之后,当时在异步线程刷新UI导致的。


修改办法:

Swift 基础 AVPlayer音乐播放器的使用(源码)相关推荐

  1. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  2. H5音乐播放器(包含源码与示例)

    H5音乐播放器(包含源码与示例) 基于Angular+ionic的H5音乐播放器,源码:https://gitee.com/CrimsonHu/h5-music-player 示例地址 建议使用原版c ...

  3. 天天动听音乐播放器应用android源码下载

    给大家分享我刚刚在网上找到的一个很难得的音乐播放器应用源码,天天动听音乐播放器应用android源码下载,喜欢的android开发的朋友可以下载学习看看. 源码下载: http://code.662p ...

  4. 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  5. 基于QT开发的音乐播放器(附源码)

    基于QT开发的音乐播放器(附源码) 一.简介 1.介绍 2.功能描述 3.系统功能层次模块图 4.各模块功能描述 (1)播放界面 (2)歌词 (3)歌曲信息 (4)歌曲列表 5.文件格式 6.运行环境 ...

  6. HTML5 可视化音乐播放器(附源码)

    文章目录 一.前言 二.主要功能 三.效果图 四.主要介绍 1.关于原创/来源 2.关于JS原生版 3.关于Layui+jQuery版 五.结语 一.前言 最近某音乐播放器越来越迷,以前下载的本地音乐 ...

  7. 计算机毕业设计android的在线音乐播放器app设计(源码+系统+mysql数据库+Lw文档)

    项目介绍 Android是Google公司公布的基于Linux内核的手机操作系统,其代码属于完全开放,为开源软件开发人员提供使用方便的框架和平台.,本文以Android开发平台为基础,介绍了音乐播放器 ...

  8. 音乐播放器(附源码)

    音乐播放器 刚学编程的时候写了一个音乐播放器,博客中不会粘贴源码,需要的请到我的github下载https://github.com/wangffei/music_player 下面是网站的演示地址, ...

  9. Vue2仿网易云风格音乐播放器(附源码)

    Vue2仿网易云风格音乐播放器 1.整体效果 2.使用技术 3.实现内容 4.源码 5.使用图片 1.整体效果 2.使用技术 使用了HTML5 + CSS3进行页面布局及美化 使用Vue2进行数据渲染 ...

最新文章

  1. centos7 yum安装 c c++ gcc gcc-c++
  2. 最简单的分形图像生成算法
  3. r语言安装ipsolve_数值分析的R语言实现(插值部分)
  4. K8s Pod 钩子生命周期
  5. vuex 对象嵌套属性的修改 mutations set 很方便的写法
  6. python获取mac地址_你知道怎么用Python获取计算机名,ip地址,mac地址吗
  7. swift中的只读属性实现,很简单
  8. 在微服务中,Kubernetes软件组件有哪些?
  9. SVN客户端安装及汉化
  10. CSDN Markdown 图片排版显示
  11. 名悦集团:什么是驾驶证终身免检,要满足什么条件
  12. PAT 甲级 1016. Phone Bills
  13. [会员积分运营了解]各大主流电商平台会员及积分体系概况集合!
  14. Salesforce Schedule中调用接口案例
  15. 《算法竞赛入门经典——训练指南》第一章相关内容
  16. RS485硬件标准1-电平定义
  17. 关于html5外文翻译三千字,推荐5个功能强大的外文文献学术论文翻译工具
  18. 美图秀秀网页版新功能上线 新增磨皮祛痘
  19. SAP 智能机器人流程自动化(iRPA)解决方案分享
  20. Oracle 11G 的客户端,不再支持连接到ORACLE 8I

热门文章

  1. nginx 代理 portainer 报 Unable to retrieve server settings and status
  2. 店铺有销量,为什么自然排名还是上不去,影响权重因素
  3. 游戏中常用的伪随机算法之PRD暴击算法
  4. mc服务器删除玩家信息,我的世界怎么清除玩家经验 | 手游网游页游攻略大全
  5. 苹果xsmax有高通基带吗_苹果将使用高通5G基带至2023年 之后或许从高通公司继续采购产品...
  6. 百度地图定位后保存图片
  7. CSRF跨域请求伪造
  8. 【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
  9. c语言 acos函数,acos - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  10. 怎么关闭苹果手机自动扣费_手机APP「会员自动续费」怎么办?教你一招快速关闭...