首页 > 其他分享 >iOS视频播放常用重点知识

iOS视频播放常用重点知识

时间:2023-05-19 19:12:42浏览次数:43  
标签:视频 url iOS player AVPlayer let 播放

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 {
            // 准备播放
        }
    }
}
 

标签:视频,url,iOS,player,AVPlayer,let,播放
From: https://www.cnblogs.com/zhou--fei/p/17416066.html

相关文章

  • IOS证书制作教程
    ​转载:IOS证书制作教程 点击苹果证书按钮​编辑 点击新增​编辑 输入证书密码,名称这个密码不是账号密码,而是一个保护证书的密码,是p12文件的密码,此密码设置后没有其他地方可以找到,忘记了只能删除证书重新制作,所以请务必记住密码。还有为了安全起见,密码不要......
  • axios设置请求体
    方式一:json请求方式二:form表单 <template><div>{{msg}}</div></template><script>exportdefault{data:()=>({msg:'',}),created(){constaxios=require('axios......
  • 记录--axios和loading不得不说的故事
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助loading的展示和取消可以说是每个前端对接口的时候都要关心的一个问题。这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loading展示与取消的逻辑。首先在我们平时处理业务的时候loading一般分为三种:按钮l......
  • axios的使用
    一、定义:是一个基于Promise,可以用于浏览器和node.js的HTTP客户端二、基本用法1、发起请求:设置请求方法2、传递参数方式:(1)通过传统的url以?的形式传递参数(2)通过params形式传递参数3、接收响应值 组建:<template><div>{{msg}}</div></templa......
  • Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
    开发背景好多开发者可能疑惑,外部数据实时预览播放,到底有什么用?是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.26......
  • 迅为基于RK3568开发板的嵌入式学习之Linux驱动视频
      迅为基于iTOP-RK3568开发板进行讲解,本次更新内容为第九期,主要讲解设备模型,共计29讲。思路更科学,入门更简单     0.课程规划1.抛砖引玉-设备模型的框架:kobject和kset2.实践:创建kobject实验3.实践:创建kset实验4.什么是设备模型,为什么要引入设备模型?5.对设备......
  • uniapp 解决app端视频滚动错误、首次加载黑屏的问题(包含后续的视频播放、下载)
    我的理解:出现app端视频滚动错误的原因是因为<video/> 组件在非H5端是原生组件,层级高于普通前端组件。首次加载黑屏的问题,我暂时还不知道原因我的解决方案:获取视频第一帧转成图片展示1、后端处理刚开始在网上搜索解决办法都是在将video组件更换为image组件,地址仍写video的地址,......
  • 视频课程|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例
    全文链接:http://tecdat.cn/?p=32462原文出处:拓端数据部落公众号分析师:ChangZhang贝叶斯网络(BN)是一种基于有向无环图的概率模型,它描述了一组变量及其相互之间的条件依赖性。贝叶斯网络在信息不完备的情况下通过可以观察随机变量推断不可观察的随机变量,对于解决复杂的不确定性和......
  • 【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例|附代码数
    原文链接:http://tecdat.cn/?p=22862 最近我们被客户要求撰写关于风险价值VaR的研究报告,包括一些图形和统计输出。风险价值(VaR)是一种统计数据,用于量化公司、投资组合在特定时间范围内可能发生的财务损失程度 ( 点击文末“阅读原文”获取完整代码数据******** )。什么是风......
  • 【视频】复杂网络分析CNA简介与R语言对婚礼数据聚类社区检测和可视化|数据分享|附代码
    全文链接:http://tecdat.cn/?p=18770 最近我们被客户要求撰写关于复杂网络分析的研究报告,包括一些图形和统计输出。为了用R来处理网络数据,我们使用婚礼数据集 ( 查看文末了解数据获取方式 ) 。CNA研究和应用爆炸式增长的突出原因是两个因素-一个是廉价而强大的计算机的可......