iOS视频播放常见的重要知识点如下:
视频格式:iOS支持的视频格式主要有H.264、MPEG-4、H.263、Sorenson等。它们根据不同的应用场景进行使用。
视频编解码:视频编解码技术是视频播放的核心,它有两部分组成,1.将原始视频数据编码为压缩格式,2.将压缩格式的数据解码成原始视频数据。在iOS中通常使用系统的AVFoundation框架来实现视频编解码。
视频播放器:iOS中的自带的视频播放器主要为AVPlayer和对AVPlayer进行封装后的AVPlayerViewController,其中AVPlayerViewController封装了视频播放页面常用的播放/暂停,快进/快退,进度条等常用控件。
视频缓存:为了提高视频播放的体验,通常会使用网络缓存,把视频数据缓存到本地来加上视频加载。在iOS中,可以使用NSURLSession和AVAssetDownloadURLSession两种方式实现视频缓存。
视频流媒体:流媒体技术可以将视频数据分片传输,使得视频可以边下载边播放,提高了用户的观看体验。iOS中可以使用HLS(HTTP Live Streaming)协议实现流媒体播放。
视频控制:在视频播放过程中,需要对视频做一些控制操作,比如播放、暂停、快进、快退、全屏等。
视频格式
视频格式是指编码后的视频数据在存储和传输过程中采用的数据格式。iOS中常用的视频格式如下:
H.264:是一种高压缩比的视频格式,可以保证视频质量的同时减小视频文件的大小,属于性价比最优的那个,所以是当前使用最广泛的格式。
MPEG-4:是一种高质量的视频格式,支持多种编码算法,包括H.264、MPEG-2等,也支持多种分辨率和帧率,算是一种通用视频格式。
H.263:是一种低码率的视频格式,适合在低带宽网络环境下播放,但视频质量相对较低,手机网页电影经常采用的低清晰度选择。
Sorenson:是一种适用于Flash视频播放的视频格式,支持透明度、动画等特效。
let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
let playerItem = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
player.play()
 
视频编解码
视频编码/解码主要讲的是将原始视频数据编码为压缩格式,然后将压缩格式的数据解码成原始视频数据,这两个过程。
视频编码是指将视频原始数据保存到本地时,通过压缩算法将其编码为压缩格式的数据。
视频解码是指在播放时将压缩格式数据解码还原为原始视频数据的过程。
视频编解码技术可以有效地减小视频数据的体积,提高视频传输和存储的效率。
iOS是使用系统提供的AVFoundation框架来实现视频编解码。
 
AVFoundation框架中常用的类:
AVAsset:表示一个媒体资源,包括视频、音频等信息。
AVAssetTrack:表示AVAsset中的一个轨道,比如视频轨道、音频轨道。
AVAssetReader:用于读取AVAsset的数据。
AVAssetWriter:用于将数据写入到视频文件中。
AVAssetExportSession:用于将AVAsset导出为另一种格式的媒体文件。
AVAssetReaderTrackOutput:用于从 AVAssetTrack 中读取样本 Buffer 的对象。它通常用于将视频文件中的原始数据读取出来进行处理。
AVAssetWriterInput:是一个将数据写入 AVAssetWriter 的对象。它通常用于将处理后的帧数据写入到新的视频文件中
AVAssetWriterInputPixelBufferAdaptor:是一个将 CVPixelBuffer 写入 AVAssetWriterInput 的对象。它通常用于将处理后的帧数据写入到新的视频文件中。
读取视频文件中的数据, 处理视频帧数据
本地读取视频帧数据的简要流程如下
AVAsset -> videoTrack -> AVAssetReaderTrackOutput -> AVAssetReader -> sampleBuffer

代码举例

let asset = AVAsset(url: videoURL)
let reader = try! AVAssetReader(asset: asset)
let videoTrack = asset.tracks(withMediaType: .video).first! //输出样本的buffer设置
let outputSettings: [String: Any] = [
kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)
]
//从视频轨道中读取buffer样本,并输出出来
let readerOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: outputSettings)
reader.add(readerOutput)
reader.startReading() while reader.status == .reading {
if let sampleBuffer = readerOutput.copyNextSampleBuffer() {
// 处理样本数据
}
}

处理视频帧数据,将视频数据写入文件

将视频帧数据写入到本地的简要流程如下
pixelBuffer -> AVAssetWriterInputPixelBufferAdaptor -> AVAssetWriterInput -> AVAssetWriter
let writer = try! AVAssetWriter(outputURL: outputURL, fileType: .mp4)
let videoTrack = asset.tracks(withMediaType: .video).first!
//设置写入文件的视频编码
let outputSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: 640,
AVVideoHeightKey: 480,
]
let writerInput = AVAssetWriterInput(mediaType: .video, outputSettings: outputSettings)
writer.add(writerInput) let adapter = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, sourcePixelBufferAttributes: outputSettings)
writer.startWriting()
writer.startSession(atSourceTime: CMTime.zero) while // 读取视频数据 {
if adapter.assetWriterInput.isReadyForMoreMediaData {
adapter.append(pixelBuffer, withPresentationTime: // 时间戳)
}
} writerInput.markAsFinished()
writer.finishWriting {
// 导出完成
}
 
视频播放器
AVPlayer是iOS中用于播放音频和视频的重要类,它可以播放本地或网络上的音视频资源,可以使用AVPlayer自定义设置播放器界面和播放控制。
AVPlayerViewController是对AVPlayer的封装,提供了常用的播放器控制器界面,用于方便开发,提升开发效率。
/ 本地播放
// let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
// let playerItem = AVPlayerItem(url: url)
// 网络播放
let url = URL(string: "http://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
player.play()
另外对AVPlayer的其他常见操作还有AVPlayer的pause()、seek(to:)方法,表示暂停、快进;还可以通过KVO监听AVPlayer的状态和播放进度等信息。 AVPlayerViewController提供了常用的播放器控制器界面,包括播放/暂停按钮、播放进度条、播放时间等。可以开箱即用,方便开发。
let playerViewController = AVPlayerViewController()
let url = URL(string: "http://example.com/video.mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem) playerViewController.player = player
present(playerViewController, animated: true, completion: nil)
 
视频缓存
为了提高视频播放的体验,通常在视频播放前会先做缓存,然后使用缓存进行播放
NSURLSession和AVAssetDownloadURLSession是iOS中两种常用的网络请求框架,可以用于实现视频缓存。
使用NSURLSession进行缓存
// 创建NSURLSessionConfiguration对象
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 设置缓存策略为NSURLRequestReturnCacheDataElseLoad
configuration.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
// 创建NSURLSession对象
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 创建NSURLRequest对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/video.mp4"]];
// 发起网络请求
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
// 将视频数据保存到本地缓存
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [cachePath stringByAppendingPathComponent:@"video.mp4"];
[data writeToFile:filePath atomically:YES];
// 播放视频
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];
[self presentViewController:playerViewController animated:YES completion:nil];
}
}];
[task resume];
AVAssetDownloadURLSession实现视频缓存
AVAssetDownloadURLSession用于实现后台下载媒体文件,支持断点续传和下载进度的监控。
// 创建AVAsset对象
AVAsset *asset = [AVAsset assetWithURL:[NSURL URLWithString:@"http://example.com/video.mp4"]];
// 创建AVAssetDownloadURLSessionConfiguration对象
AVAssetDownloadURLSessionConfiguration *configuration = [AVAssetDownloadURLSessionConfiguration new];
configuration.maximumActiveDownloads = 1;
configuration.allowsCellularAccess = NO;
// 设置缓存路径为Caches目录下的VideoCache文件夹
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cacheFolder = [cachePath stringByAppendingPathComponent:@"VideoCache"];
NSURL *cacheURL = [NSURL fileURLWithPath:cacheFolder isDirectory:YES];
configuration.destinationURL = cacheURL;
// 创建AVAssetDownloadURLSession对象
AVAssetDownloadURLSession *session = [AVAssetDownloadURLSession sessionWithConfiguration:configuration assetDownloadDelegate:self delegateQueue:nil];
// 创建AVAssetDownloadTask对象
AVAssetDownloadTask *task = [session assetDownloadTaskWithURLAsset:asset assetTitle:@"video" assetArtworkData:nil options:nil];
// 启动下载任务
[task resume]; 在AVAssetDownloadDelegate协议方法中,做视频播放
当下载完成时,保存视频文件的本地路径,并使用AVPlayerViewController进行播放:
- (void)URLSession:(NSURLSession *)session assetDownloadTask:(AVAssetDownloadTask *)assetDownloadTask didFinishDownloadingToURL:(NSURL *)location {
// 将视频数据保存到本地缓存
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0
 
视频流媒体
HLS(HTTP Live Streaming)协议是一种基于HTTP的视频流媒体传输协议,它将视频分割成小段(.ts文件),并通过HTTP协议进行传输,并将这些小段分别下载。这种分段的方式可以保证视频在网络状况不佳的情况下的流畅性和稳定性。
视频流媒体播放器会请求M3U8文件,这个文件包含了所有视频文件的URL地址,播放器会根据这些URL地址逐一请求视频文件,并将这些小段视频拼接成完整的视频流进行播放。
在iOS中,可以使用AVPlayer和AVPlayerViewController实现流媒体播放。下面是一个简单的例子:
import UIKit
import AVFoundation
import AVKit class ViewController: UIViewController { var player: AVPlayer!
var playerLayer: AVPlayerLayer! override func viewDidLoad() {
super.viewDidLoad() // 创建AVPlayer
// 这个M3U8文件包含了所有视频文件的URL地址,AVPlayer会根据这些URL逐一请求视频文件并进行播放。
let url = URL(string: "http://example.com/video.m3u8")!
player = AVPlayer(url: url) // 创建AVPlayerLayer
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer) // 播放视频
player.play()
} override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews() // 调整AVPlayerLayer的大小
playerLayer.frame = view.bounds
}
}
 
视频控制
// 播放/暂停视频
if player?.rate == 0 {
player?.play()
} else {
player?.pause()
} //快进/快退视频:
let seekTime = CMTimeMakeWithSeconds(10.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
let currentTime = player?.currentTime()
let targetTime = CMTimeAdd(currentTime!, seekTime) player?.seek(to: targetTime) //播放状态发生变化时的回调函数
player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main, using: { [weak self] (time) in
// 更新播放进度
}) //播放器状态发生变化时的回调函数
player?.addObserver(self, forKeyPath: "status", options: [.old, .new], context: nil) override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "status" {
if player?.status == .failed {
// 播放失败
} else if player?.status == .readyToPlay {
// 准备播放
}
}
}
 

iOS视频播放常用重点知识的更多相关文章

  1. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  2. JavaScript重点知识(二)

    三.JS的API 3.1知识点(DOM) 1)DOM本质 将html结构化成浏览器和JS可识别可操作的东西 2)变量计算---强制类型转换 获取DOM节点 Attribute(对html标签属性的修改 ...

  3. iOS开发-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...

  4. AJAX重点知识的心得体会

    下面就为大家带来一篇 AJAX重点知识的心得体会.学习还是有点帮助的,给大家做个参考吧. AJAX是什么? 是Asynchronous Javascript And XML的首字母的缩写, 它不是一门 ...

  5. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  6. iOS网络相关零散知识总结

    iOS网络相关零散知识总结 1. URL和HTTP知识 (1) URL的全称是Uniform Resource Locator(统一资源定位符). URL的基本格式 = 协议://主机地址/路径   ...

  7. ios中常用数据类型相互转换

    ios中常用数据类型相互转换 //1. NSMutableArray和NSArray互转 // NSArray转为NSMutableArray NSMutableArray *arrM = [arr ...

  8. 关于ios导航控制器的知识总结

    关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...

  9. iOS中常用的四种数据持久化方法简介

    iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...

  10. Word常用实用知识1

    Word常用实用知识1 纯手打,可能有错别字,使用的版本是office Word 2013 转载请注明出处,谢谢. 快速输入日期(含格式) [插入]--[日期]   快速输入日期和时间(快捷键) 快速 ...

随机推荐

  1. 遇到 Request header is too large,你是如何解决的?

    看到群里有小伙伴问,这个异常要怎么解决: java.lang.IllegalArgumentException: Request header is too large 异常原因 根据Exceptio ...

  2. 【Cpp】RTTI 机制原理解析

    References Baidu Wiki C++中的RTTI机制详解 RTTI 推荐阅读: RTTI 原理 推荐阅读:C++中的RTTI机制 什么是RTTI机制? RTTI 是"Runti ...

  3. Spring注解@Resource和@Autowired区别对比 (附 Maven 引入方法)

    @Resource 导入方法: <dependency> <groupId>javax.annotation</groupId> <artifactId> ...

  4. Divide by Zero 2021 and Codeforces Round #714 (Div. 2) 个人补题记录

    补题链接:Here A. Array and Peaks 题意:给定 数组大小 \(n\) 和 峰值点 \(k\) 请问是否存在这样的排序,不存在则输出-1 先序从 i = 2 开始填,依次 i += ...

  5. 华东交通大学2019年ACM 双基 程序设计竞赛 个人题解(A - K)

    目前先放几道题面,等晚上做完实验补 Update:A ~ D,更新剩余的题面(题面复制会有链接水印,懒得一一去除.直接截图) A.签到 真·签到题 输出祝贺祖国成立70周年!即可 B.欧涛的烦恼 思路 ...

  6. nvm:npm的包管理器

    NVM: npm的包管理器 其实许久前就像写这个模块了,只是之前使用后又搁置了,今天下项目时node版本不一致,才想起记录 nvm下载地址: Releases · coreybutler/nvm-wi ...

  7. 你以为这是MacOS ,其实这是我的 Linux 系统 Manjaro!

    对于如何将你的 Manjaro 系统美化成 MacOS 你需要做以下几件事情: 1.安装 WhiteSur-Gtk-theme 主题. 2.安装 Plank 软件. 3.安装 vala-panel-a ...

  8. 拥抱开放,Serverless 时代的下一征程

    Serverless 作为云计算的最佳实践和未来演进趋势,其全托管免运维的使用体验和按量付费的成本优势使得它在云原生时代备受推崇.Serverless 的使用场景也由事件驱动,数据处理等部分特定场景转 ...

  9. 二、java发送https的各类请求

    导航 一.java发送http的各类请求 二.java发送https的各类请求 java开发中需要调用其他服务的对外提供的https请求,上一篇写的是调用http,处理方式不太一样,可以参考如下代码: ...

  10. vscode - Prettier插件 统一代码风格规范,保存自动格式化代码

    安装 Prettier - Code formatter prettier安装完毕,使用shift+alt+f就可格式化代码. 如果需要自动保存,要在系统设置中增加"editor.forma ...