在本文中,我想探讨什么是HLS,AVFoundation家族以及如何使用HLS URL构建简单的本机iOS播放器。 什么是HLS HLS代表HTTP实时流。 它是一种媒体流协议,用于通过Internet传递音频和视频媒体。 使用此协议带来了更快的Internet流传输的主要区别在于,它的想法是将单个视频切成小块,而不是下载整个媒体文件。 您甚至可以根据带宽等因素使用多种质量,因为这些块已编码并且可以在播放列表中的不同质量设置中使用。 第一次看起来有点复杂,但是它只是遵循HLS协议的几个标签,玩家可以调整并使用所有这些提供的数据来提供最佳的流传输质量: #EXTM3U #EXT-X-MEDIA:TYPE = AUDIO,GROUP-ID =“ stereo”,LANGUAGE =“ zh-CN”,NAME =“ English”,DEFAULT = YES,AUTOSELECT = YES,URI =“ audio / stereo / en / 128kbit。 m3u8“ #EXT-X-MEDIA:TYPE = AUDIO,GROUP-ID =“ stereo”,LANGUAGE =“ dubbing”,NAME =“ Dubbing”,DEFAULT = NO,AUTOSELECT = YES,URI =“ audio / stereo / none / 128kbit。 m3u8“ #EXT-X-MEDIA:TYPE = […]
介绍 为了更好地理解和利用AVFoundation功能,我观看了wwdc18会议502。我想传达优化HLS的信息,以提供更好的用户体验。 在上一篇文章中,我们学习了为KPI选择什么,以及如何减少启动时间。 本文,我们将介绍如何调查HLS播放中的停顿和错误 调查摊位 失速可能发生,并且确实发生! 听摊位通知 那么,如何检测您的应用程序停滞? 有停顿的通知。 AVPlayerItemPlaybackStalled是用于观察停顿的通知名称。 这是侦听停顿通知的代码示例。 检查AVPlayerItem状态,AVPlayerItem日志 当停顿时,您可以观察到一些东西来调查停顿。 首先,您可以检查AVPlayerItem.isPlaybackLikelyToKeepUp 发生停顿时, AVPlayerItem.isPlaybackLikelyToKeepUp为false ,您可以在那一刻开始加载指标。 其次,您可以从AVPlayerITemErrorLog , AVPlayerItemAccessLog查找详细日志。 如 错误说明 观察到的比特率和指示的比特率 减少失速 为了减少失速,应采取以下措施。 提供全套的比特率层 每个编解码器组合都需要自己的一组层 您的内容服务器和CDN必须 毫不延迟地提供媒体播放列表,片段和键 至少在每个目标持续时间更新实时播放列表 同步播放列表之间的不连续序列号 清楚表明服务器端故障 调查错误 我们如何调查错误? 调查方法很少 来自AVPlayerItem的错误和访问日志 来自AVPlayer,AVPlayerItem的错误属性 媒体验证工具来检测内容问题 AVPlayerItemErrorLog 这可能不是致命错误 详细信息在错误注释中 ErrorLog示例 “ 15秒内未收到媒体文件” “ HTTP404:找不到文件” “细分超过指定的变体带宽” “不支持的加密格式” AVPlayer,AVPlayerItem的“状态”属性 这可能是致命的错误 AVPlayerItem.Error结束播放并从播放器队列中删除项目 媒体验证工具 您可以使用媒体验证工具来发布内容 在开发者网站上可用 结论 […]
HTTP Live Streaming(HLS)是Apple的技术,用于将实时和点播音频/视频内容流式传输到各种设备,例如iphone,mac甚至android设备。 HLS的核心是使用HTTP协议(与Web供电相同的协议)来传递内容。 HLS流的行为类似于常规Web流量。 它们与诸如内容交付网络(CDN)之类的预先存在的缓存基础结构一起使用,并且可以可靠地通过典型的防火墙和路由器。 注意** iOS应用要求 以下要求适用于提交供在App Store中分发以在Apple产品上使用的iOS应用。 Apple可以自行决定拒绝或删除不合规的应用程序。 如果您的应用通过蜂窝网络提供视频,并且视频在五分钟内超过10分钟或5 MB数据,则必须使用HLS。 您可以对较小的剪辑使用渐进式下载。 如果您的应用在蜂窝网络上使用HLS,则必须至少以192 Kbps或更低的带宽提供一个流。 低带宽流可以是纯音频的,也可以是带有静止图像的音频。 HTTP使您可以使用通用Web服务器而不是专用的流服务器轻松地在流中部署媒体内容。 以下是HLS的关键功能,这就是使用它的原因 自适应流 HLS适应可变的网络条件,动态调整播放以匹配有线和无线连接的可用速度。 内容保护 可以使用样本级加密对媒体段进行单独加密 后备与流替代 如果播放器无法重新加载媒体播放列表文件,则播放器将尝试切换到另一个兼容的媒体播放列表 除了上述三个优点外,还有其他优点,如下 隐藏式字幕和字幕 快进和快退播放 备用音频和视频格式 定时元数据 广告插入 HLS像所有自适应流技术一样工作; 您创建了多个文件以分发给播放器,这些文件可以自适应地更改流以优化播放体验。 作为基于HTTP的技术,不需要流服务器,因此所有交换逻辑都驻留在播放器上 要分发给HLS客户端,您需要将源编码为多个不同比特率的文件,并将它们分成短块(ts文件:媒体文件)。 这些文件与带有扩展名.M3U8的基于文本的清单文件一起被加载到HTTP服务器上,该文件将播放器定向到每个编码流的附加清单文件。 播放器监视带宽状况。 如果播放器检测到带宽变化,它将检查主播放列表中其他流的位置,然后检查特定于流的清单文件中下一个视频数据块的URL。 PlayerSide(App) [App]使用m3u8的网址制作AVAsset [App]使用资产制作一个PlayItem,并使用Player(AVPlayer)设置播放项 [网络]检索主播放列表(m3u8文件) [网络]检索内容密钥 [网络]检索选定的变体播放列表(媒体播放列表) [网络]检索课程(.ts媒体文件) [应用程式]播放 https://developer.apple.com/videos/play/wwdc2016/503/ https://developer.apple.com/library/content/referencelibrary/GettingStarted/AboutHTTPLiveStreaming/about/about.html http://www.streamingmedia.com/Articles/Editorial/What-Is-…/What-is-HLS-(HTTP-Live-Streaming)-78221.aspx
苹果每年都会更改并扩展其框架。 为了更好地理解和利用框架功能,以下是用于优化HTTP Live Streaming(HLS)的演示文稿和注释。 HTTP实时流(HLS)用于向全球受众流式传输实时和点播内容。 您可以发现如何调整和调整流创作和传递元素,以通过会话502改善用户体验。 会话链接 在会议上,他们讨论了以下内容: 建立通用的流QoS语言 客观衡量流式QoS 识别并解决损害QoS的问题 有关HLS回放会话的基本知识,请参见下图。 首先,您需要先找到问题再解决。 为了发现问题,您需要测量定义的一些指标。 什么是HLS用户体验的KPI? 这是会议中讨论的一些KPI。 5个用于HLS性能的KPI 启动时间:每个会话的启动时间 失速计数:失速速率(标准化为已观察的持续时间—计数/小时) 失速持续时间:失速持续时间与观察的持续时间之比 指示比特率:时间加权指示比特率 错误:播放失败百分比 启动时间 这是启动媒体播放的每个阶段。 失速计数,失速持续时间,指示的比特率 您可以使用AVPlayerItemAccessLog来衡量KPI 播放失败百分比 定义KPI后的下一步,提高性能! 减少启动时间 调查摊位 调查错误 使用AVAsset减少启动时间 您可以通过减少启动时间 在用户决定播放之前创建并检查AVAset 预取解密密钥(采用AVContentKeySession) 减少启动时间-AVPlayer和AVPlayerItem 您可以通过减少启动时间 在缓冲之前设置AVPlayItem 在设置播放器项目之前设置AVPlayer速率 减少启动时间-AVPlayerItem过渡 您可以通过减少启动时间 使用AVQueuePlayer播放多个项目 预先排队第二个AVPlayerItem 在本文中,我讨论了会话(502)“测量和优化HLS性能”的部分内容 这是本文的摘要 设置KPI以获得更好的HLS UX 找到衡量KPI指标的方法 减少启动时间(通过更改avasset,avplayer的配置-avplayeritem,avplayeritem转换) 在下一篇文章中,我们将看一下如何调查HLS播放中的停顿和错误
作为Hasso Plattner Institute(HPI)知识技术研究小组的成员,我们正在研究和研究如何使MOOC和基于视频的电子学习脱机工作,因为我们已经了解到,在openHPI的MOOC中,大约有三分之一的用户, openSAP或openWHO下载视频和资料。 除了在具有脱机功能的网站上工作外,我们的研究和工作还涉及针对Android和iOS提供的本地应用程序。 在我们的Android应用中,我们提供SD和HD格式的mp4文件下载。 对于我们的新iOS App,我们决定使用HTTP Live Streaming(HLS)视频(请在apple.com上单击此链接以获取规格和更多内容)。 这是一种非常不错的格式,它基于播放列表,因此它可以包含不同的bandwith版本以及不同的音频和字幕版本。 然后,播放器可以根据语言偏好和可用带宽下载最适合的版本。 如果您在在线时使用HLS,则播放器将尝试使用可能的最佳版本。 从iOS 10开始,Apple引入了允许用户下载HLS视频并稍后播放的可能性。 我们认为这很酷是出于不同的原因。 在没有互联网连接的情况下,在非洲某处上班的通勤者或卫生工作者,均可从此功能中受益。 我是否提到过我们的研究被SAP,WHO和其他机构使用? 我们花了最后两周的时间来实现此功能,而最后四天的调试仅使它无法正常工作。 我们的视频托管在Vimeo上,因此可以从靠近用户的数据中心进行交付。 Vimeo还负责对我们的视频文件进行转码。 如果直接在Vimeo上访问视频文件(不使用其播放器),则可以访问HLS URL,该URL如下所示: https://player.vimeo.com/external/203790595.m3u8?s=3cb58fb02666fd9b9bd8f14f36d54a45fb29c785 调用此URL时,它将发送HTTP重定向,其中将包含实际文件的URL,例如https://skyfire.vimeocdn.com/1501777916-0x0d0827236aefc32e0894e1f50efad8cb6642e905/224214791/video/786737170,786737168,786737172,786737173173 /master.m3u8?absolute=1 虽然此功能非常适合在线播放此文件,但如果应用下载了文件并尝试在离线时稍后播放,则无法播放视频。 来自不同来源的其他文件运行良好。 最终,我们发现iOSs SDK中的下载功能无法正确处理重定向(已在iOS 10和至少是当前的iOS 11公开Beta中进行了测试)。 我们通过应用中的解决方法解决了此问题: (请参阅GitHub上的完整提交),方法是手动调用链接,然后将最终URL传递给下载程序。 请注意,正如Vimeo支持人员确认的那样,此解析的链接仅在短时间内有效。 请注意,文件和下载链接都是通过HTTP 302重定向到实际视频文件资源的。 实际视频文件资源的位置每隔几个小时就会过期,因此请确保始终使用我们提供的重定向链接。 希望这篇文章能帮助其他人在遇到相同问题时绊倒一些时间。 我们向Apple提出了一个错误,但即使他们为新的iOS版本修复了该错误,旧版本仍会保持这种行为。 更新1 —新解决方案 尽管上述方法允许离线观看已下载的视频,但是当设备连接到Internet并且远程链接过期后(大约一天后),播放将失败。 我们认为这是由于某种原因设备尝试在线获取播放列表的原因,如果网址过期,则会中断。 我们知道从应用程序中删除了重定向处理代码,而是构建了HLS代理。 因此,我们可以为该应用提供未过期的链接。 然后,此链接从vimeo中获取播放列表,然后让它通过。 请注意,我们也正在操纵单个流,不知道是否可行,但是通过这种方式,我们可以控制所有URL。
TL; DR 如果在透过Airplay 2播放AES加密影片的时候,发现无法正确的呼叫到实作的AVAssetResourceLoaderDelegate,以至于没有正确加入授权(存取凭证)而无法下载影片播放时,只需重新读取的HLS影片来源URL scheme客制化即可。 前言 为了防止正版影片被盗用,影片在传输前就会先加密好,才传送给使用者端解密,观看。常用的保护方式如透过数位版权管理(DRM),或依据进阶加密标准(高级加密标准,AES)加密,而这篇文章就是谈谈在客户端AES解密影片时用AirPlay2投影所遇到的坑! 使用AVAssetResourceLoaderDelegate AVAssetResourceLoaderDelegate(后面简化成“ ARL委托”)是Apple的AVKit中读取到AVURLAsset资源时,通知应用程序端处理的委派模式(代理模式)。理论上,当AVKit需要您的应用程序“植入”去读取资源(影片,m3u8档案或字幕档案)时,就会去呼叫resourceLoader(_:shouldWaitForLoadingOfRequestedResource :),这时候app就可以加入读取所需的授权验证(例如:auth token),来让你的服务端能够验证您的资源读取需求,并回传你所需要的资源档案。 替换成客制化方案的流程: 读取master播放列表(master.m3u8) 让一开始读取的master.m3u8 URL方案在应用端从https cplp成cplp ( https://example.com/master.m3u8 –> cplp ://example.com/master.m3u8),而因为这个客制化的cplp URL方案,就会让ARL委托被触发,并通过resourceLoader(_:shouldWaitForLoadingOfRequestedResource :)能够被顺利的调用到,但这里只需要去获得master.m3u8档案并回传给loadingRequest即可,不需要其他的处理。 注意:若不确定原始先使用的协议会是 http 或 https 的话,可以通过“加入前缀”的方式去改成客制化sheme,例如在scheme前面加上 my ,则 http 就会变成 myhttp ,而 https 就会变成 myhttps 。如此一来,想要还原原本的方案,只需要可移除的前缀即可。 读取index播放列表(index.m3u8) 因为master.m3u8的URL被窜改成客制化的URL方案,所以一来根据HLS(http live stream)的规则,master中的index.m3u8连结也就会自动变成cplp://example.com/index .m3u8,并且成功让ARL代表也被呼叫。 但因为密钥将链接放置在index.m3u8的缘故,则需要更进一步的将成为“#EXT-X-KEY:METHOD = AES-128,URI =” https://example.com/key “”给换成“#EXT-X-KEY:METHOD = AES-128,URI =” ckey ://example.com/key””(注意这里的自定义方案“ […]
我希望能够将iOS设备上的实时videostream式传输到服务器上。 我试图使用一个AVCaptureOutput捕获每个框架作为CMSampleBuffer并附加它使用AVAssetWriter ,但我不知道什么时候或如何从文件的input,并将其发送到服务器。 如何格式化? 我怎么知道什么时候发送?
我写了一个代码来下载HLSvideo并以离线模式播放。 此代码适用于编码的video。 现在我有一个AESencryption的video,我们正在为它定制encryption密钥。 下载AESencryption的HLSvideo后,我使用下面给出的代码来提供解密video的密钥。 – (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest { NSString *scheme = loadingRequest.request.URL.scheme; if ([scheme isEqualToString:@"ckey"]) { NSString *request = loadingRequest.request.URL.host; NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:request]; if (data) { [loadingRequest.dataRequest respondWithData:data]; [loadingRequest finishLoading]; } else { // Data loading fail } } return NO; } 我截获一个密钥的请求,并传递存储在UserDefaults中的密钥进行解密。 当我的设备的wifi或数据连接closures时,使用自定义密钥的AESencryptionHLSvideo播放效果良好。 如果我在启用设备的wifi或数据连接时开始播放此video,或者在播放video时启用设备的wifi或数据连接, video立即停止播放,没有任何错误,从不再播放。 我检查了playerItem的accessLog和errorLog,但没有发现任何有用的东西。 在下载HLS内容后提供自定义URL密钥我正在更新.m3u8文件的内容 URI = […]
我想在iOS播放器中使用时间平移(用于直播video)function,但是我没有发现支持时间平移的库。 我读了很多这样的图书馆的文件: 1- piemonte 2- kaltura 在Android中,谷歌引入了ExoPlayer ,可以轻松地给我们提供这个function。 我如何在iOS(通过swift)实现这个function? 或者有没有实现这个的库?
我正在使用Bento4库将附件B TS(MPEG-2传输stream)文件与分别从VideoToolbox和AVFoundation生成的h264video和AACaudiostream合并为HLS(HTTP实时stream传输)的源数据,stream。 这个问题不一定是Bento4特有的:我试图理解底层的概念,以便我可以完成任务,最好通过使用苹果库。 到目前为止,我已经想通过从AP4_AvcSampleDescription获取各种数据来创buildCMVideoFormatDescriptionRef ,最重要的是通过分别使用CMVideoFormatDescriptionGetH264ParameterSetAtIndex索引0和1来生成SPS和PPS,我可以将它们作为字节缓冲区Bento4。 太棒了,这就是我需要的所有头文件信息,所以我可以问Bento4将video复制到ts文件中! 现在我试图将audio复合到相同的文件。 我正在使用CMAudioFormatDescriptionRef获取所需的信息来构build我的AP4_MpegAudioSampleDescription ,Bento4使用它来制作必要的QTprimefaces和标题。 但是,如果这些字段是“解码器信息”字节缓冲区,则不需要解释它是什么,或者从数据生成一个代码。 我本来希望有一个CMAudioFormatDescriptionGetDecoderInfo什么的,但是我找不到这样的东西。 在任何苹果库中是否有这样的function? 还是有一个很好的规范,我还没有find如何生成这些数据? 或者,我是否走错了路? 有一个更简单的方法来从Mac / iOS代码库中复合ts文件吗?