1. 简介
苹果目前提供两个框架用来处理音视频播放
1.AVFoundation
AVFoundation用于播放、处理音视频。可以通过结构图看到AVFoundation位于UIKit之下,很好理解AVFoundation并不提供用户界面,你可以自己自己构建用户界面来控制媒体的播放处理等功能。 但是苹果更推荐使用AVKit来构建用户界面
\2. AVKit
AVKit构建在 AVFoundation之上,可以简单的理解使用AVKit能够及其方便的使用系统为你提供的音视频播放界面。使用AVKit构建的播放界面能够随着苹果系统的更新自动更新。
如何选择
如果你想让你的App拥有视频播放能力,并且不想自己创建控制界面,可以使用AVPlayerViewController(由AVKit提供)快速完成功能
如果你想对视频进行编辑等处理,你需要使用 AVFoundation并且自己构建用户界面来处理音视频。
iOS9之前,你可以使用MPMoviePlayerViewController做一个简单的视频播放器,但是在iOS9这个类已经被弃用了。 取而代之的是AVPlayerViewController
2. 创建一个简单的视频播放App
1.新建工程, 命名为AVBasicPlayback,在Info.plist中添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>devimages-cdn.apple.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
目的是确保App能够从devimages-cdn.apple.com加载视频资源
2.在Appdelete中添加如下代码
importAVFoundation
funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions:[UIApplication.LaunchOptionsKey:Any]?)->Bool{
// 1.初始化session
letaudioSession=AVAudioSession.sharedInstance()
do{
//2.设置category确保app的音频能够正常播放
tryaudioSession.setCategory(.playback)
}catch {
print("Setting category to AVAudioSessionCategoryPlayback failed.")
}
returntrue
}
\3. 调整ViewController中的代码。
importUIKit
importAVKit
importAVFoundation
classViewController:UIViewController{
letplayButton=UIButton(type:.system)
overridefuncviewDidLoad(){
super.viewDidLoad()
setupUI()
}
@objcfuncplayVideo(){
//1.这是一个HTTP Live Streaming流媒体链接,用于测试
guardleturl=URL(string:"https://devimages-cdn.apple.com/samplecode/avfoundationMedia/AVFoundationQueuePlayer_HLS2/master.m3u8")else{
return
}
//2. 创建AVPlayer
letplayer=AVPlayer(url:url)
//3. 创建AVPlayerViewController,并设置player
letcontroller=AVPlayerViewController()
controller.player=player
//4. 显示
present(controller,animated:true){
player.play()
}
}
funcsetupUI(){
playButton.setTitle("Play Video",for:.normal)
playButton.addTarget(self,action:#selector(playVideo),for:.touchUpInside)
view.addSubview(playButton)
playButton.translatesAutoresizingMaskIntoConstraints=false
playButton.centerXAnchor.constraint(equalTo:view.centerXAnchor).isActive=true
playButton.center