最新要闻
- 国网江苏超高压公司研发应用二次电缆识别仪
- 海外网友热议JDG击败T1:Faker打的太烂 该退役了|全球新资讯
- 天天看热讯:夏天别急着开空调!这几项准备工作别忘了
- 全球报道:在美国没有未来!自动驾驶卡车独角兽大裁员:重心将回归国内
- RTX 4080与RTX 4090同跑《赛博朋克2077》差距有多大?
- 天天观速讯丨不止用来玩游戏!知名商用渲染器D5获DLSS 3加持
- 大源西超百亩地块拍出,6月金融城三期首迎住宅供地!-全球微头条
- 每日精选:北京:近期呼吸道合胞病毒感染患儿激增,儿童出现呼吸困难应立即就医
- 用了十几年智能机 终于弄懂了手机掉电快原因_每日动态
- 焦点信息:真是老天爷赏饭吃:女孩特爱哭 被送去唱戏拿了金奖
- 绿源、五星钻豹等电动车这些批次抽查不合格:车速提示音、整车质量没过关|今日热文
- 真要来了?法拉第未来:FF 91车型合规认证按计划进行
- 28年国产武侠游戏IP凉了?《仙剑奇侠传8》被曝未立项
- 维他奶国际发盈喜 预期年度股东应占溢利3500万港元至5500万港元 天天看点
- 天津网约车从业资格实现线上约考
- 单风扇就是好看!RTX 40第一次做成ITX迷你卡 5款集中爆发
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
iOS视频播放常用重点知识_资讯
(资料图)
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.boundsview.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 -> AVAssetWriterlet 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.boundsview.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 = playerpresent(playerViewController, animated: true, completion: nil)视频缓存为了提高视频播放的体验,通常在视频播放前会先做缓存,然后使用缓存进行播放NSURLSession和AVAssetDownloadURLSession是iOS中两种常用的网络请求框架,可以用于实现视频缓存。
使用NSURLSession进行缓存// 创建NSURLSessionConfiguration对象NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];// 设置缓存策略为NSURLRequestReturnCacheDataElseLoadconfiguration.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 UIKitimport AVFoundationimport AVKitclass 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 { // 准备播放 } }}
关键词:
-
中金普洛斯REIT扩募获基金份额持有人大会表决通过 首批REITs扩募再进一步
2023年4月25日至5月17日,中金普洛斯REIT以通讯方式召开了基金份额持有人大会,参加大会并有表决权的基金份
来源: iOS视频播放常用重点知识_资讯
国网江苏超高压公司研发应用二次电缆识别仪
中金普洛斯REIT扩募获基金份额持有人大会表决通过 首批REITs扩募再进一步
海外网友热议JDG击败T1:Faker打的太烂 该退役了|全球新资讯
天天看热讯:夏天别急着开空调!这几项准备工作别忘了
全球报道:在美国没有未来!自动驾驶卡车独角兽大裁员:重心将回归国内
RTX 4080与RTX 4090同跑《赛博朋克2077》差距有多大?
天天观速讯丨不止用来玩游戏!知名商用渲染器D5获DLSS 3加持
大源西超百亩地块拍出,6月金融城三期首迎住宅供地!-全球微头条
多态、虚函数表、底层实现、多重继承的问题及处理
天天动态:记录--axios和loading不得不说的故事
MySQL 处理重复数据|全球新视野
登录appuploader
天天热头条丨分享一下mybatisPlus新代码生成器3.5.1以上
【金融街发布】人民银行、外汇局:北京、广东、深圳试点优化跨国公司本外币跨境资金集中运营管理政策 天天视讯
每日精选:北京:近期呼吸道合胞病毒感染患儿激增,儿童出现呼吸困难应立即就医
用了十几年智能机 终于弄懂了手机掉电快原因_每日动态
焦点信息:真是老天爷赏饭吃:女孩特爱哭 被送去唱戏拿了金奖
绿源、五星钻豹等电动车这些批次抽查不合格:车速提示音、整车质量没过关|今日热文
真要来了?法拉第未来:FF 91车型合规认证按计划进行
28年国产武侠游戏IP凉了?《仙剑奇侠传8》被曝未立项
维他奶国际发盈喜 预期年度股东应占溢利3500万港元至5500万港元 天天看点
世界快消息!天翼云CDN全站加速产品对websocket协议的支持
【一步步开发AI运动小程序】三、运动识别处理流程
视讯!第三章:存储与检索
SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
创新灵感来源于用户实践,TDengine 首次公开四项专利申请 每日消息
天津网约车从业资格实现线上约考
单风扇就是好看!RTX 40第一次做成ITX迷你卡 5款集中爆发
高颜值87键!影驰Keychron K8 Pro星曜娘联名键盘图赏 全球今头条
深圳一大厦异响振动居民被疏散:官方已启动调查_每日热文
ChatGPT连夜登陆iOS 免费无广告、还支持语音
全球今头条!爱马仕推出AirPods Pro保护皮套:售价7100元 够买5个耳机
【环球聚看点】奥普光电:公司参与了该项目的机械及装校联调工作
Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试
易基因:m5C高甲基化介导EGFR突变的非小细胞肺癌耐药潜在机理
焦点热讯:ipa文件怎么安装到iPhone手机上?
ipa文件怎么安装到iPhone手机上?
聊聊Seata分布式事务解决方案的AT模式_每日观察
科创板收盘播报:科创50指数涨0.52% 次新股表现活跃 全球视讯
欧联杯:塞维利亚胜尤文图斯
当前播报:印度:我们的智能手机取得极大成功!苹果等加大布局 曾称接下来靠他们
曝iPhone 15 Plus影像升级为4800万像素:但因良率问题量产延期 今日最新
全球热点!荣耀90系列屏幕升级:首发3840Hz零风险调光护眼屏
环球速讯:53°飞天遭哄抢 茅台自营电商i茅台用户超4000万:销售230亿
1900万没了!一梅赛德斯AMG ONE运输途中被烧成焦炭:原因未明_热消息
海通国际发布先导智能研报
Lerna 备忘清单_开发速查表分享
CF1512D Corrupted Array 题解 天天观点
全球实时:Blazor实战——Known框架快速开始
【解决方法】家用路由器的复位/重置(reset)操作,解决管理员后台密码遗忘
当前快播:睡觉时枕边有手机会得脑瘤吗?网友吵翻:没明确答案 你怎么看?
纯白机身 颜值天花板!魅族20告白礼盒上架:3199元起_世界今头条
王小川:10年后机器智慧会超过人类 AI迭代周期成倍递减
并非“大更新”?消息称Win11 23H2仅基于22H2优化改进
每日时讯!焦点科技李磊:小语种覆盖全球超5万亿美元的市场
测试管理快速入门
【天天新要闻】上海丨阿里云 Serverless 技术实战营邀你来玩!
环球今日报丨360浏览器修改主页不会动_360浏览器修改主页
你会买吗?一块京A摩托车牌照价格涨破50万:揭秘为何要这么贵?-天天快播
医生用一根针帮患癌老人冻死肿瘤 网友称神奇:以为是中医针灸
生理期可以喝普洱茶吗_生理期有绝对禁忌事项吗_快消息
Centos7 设置定时任务
泰国进口乳胶!网易严选乳胶垫、枕头大促:54元起
iQOO Pad搭载12.1英寸巨屏:2.8K分辨率、144Hz高刷 当前要闻
【世界聚看点】华为5倍薪酬再招天才少年!任正非:破题能力最重要 不是综合素质
当前视点!520用更好的长焦镜头表达爱意:华为P60 Pro长焦人像 让爱不分昼夜
华为新款家庭存储支持断电保护电源:停电自动关机、来电自动开机_世界球精选
观速讯丨2023中央财经大学在职课程培训班怎么样?
【GPT-4理论篇-1】GPT-4核心技术探秘
软件工程快速入门(下)-天天实时
环球热消息:聊聊分布式事务一致性与本地消息表
西门豹人物简介卡_西门豹人物简介
豹子闯入印度男子家中偷狗 狗主人惊醒淡定玩手机 网友:心真大
无限复制没了?《塞尔达传说:王国之泪》1.1.1更新发布:修复主线任务Bug_天天新动态
前高管唱衰:苹果MR设备将是史上最糟糕的产品之一 天天观天下
当前播报:裁员超千人后 长安福特又被曝裁减百万产能
曾致两死一伤!台州特斯拉事故歪曲事实视频作者致歉 全球独家
斗罗大陆剧场版最终预告公布,海神大战天使神,还有专属主题曲
通讯!软件工程快速入门
每日资讯:技术干货|如何利用 ChunJun 实现数据离线同步?
快看:腾讯云的devops自动化部署代替jenkins
双检锁(DCL)实现懒汉单例模式_全球讯息
网传云南一公园有多人用针扎小象,园方回应:已反馈了该情况,有关部门在协助调查
1199元起 雷蛇天狼星V2专业版游戏音箱发布:背投式RGB|当前最新
多芬广告呼吁女性游戏角色不必性感 宣传女性身材自信 引玩家众怒|世界热头条
openai为chatgpt人工智能推出ios应用
兑现“十年合约”:微软正式开启与NVIDIA合作
菜鸟CEO万霖发全员信:开启新创业征程 建设全球领先数智物流集团-天天热门
一机搞定全屋清洁!石头智能洗地机A10 Ultra图赏
日本4月份贸易赤字4324亿日元 信息
JS函数中的属性-全球简讯
【天天速看料】ET介绍——事件机制EventSystem
聊聊Sentinel的熔断降级
速讯:30多万买豪华行政车 新一代凯迪拉克CT6内饰官图:超帅9k曲面屏上车
《王者荣耀》520亚瑟新皮肤太过250:开局一条狗 玩家直呼要买
马克思主义理论专业大学排名(马克思主义专业大学排名及分数线)_世界最新
ChatGPT正式登陆iOS!但苹果却禁止员工使用-当前快报
科普:相机镜头的“放大倍率”是什么?
真我GT Neo5 SE“圣白幻影”配色亮相:颜值质感拉满|全球热推荐