前言 一、视频上传 《文件分片上传与分片下载.md 》
二、常见视频播放 1、视频地址/素材获取网站
2、m3u8文件认识 m3u8 是 HLS 协议中使用的播放列表文件格式,它是 M3U 文件格式的扩展,专门用于 HLS。
在 HLS(HTTP Live Streaming)中,主播放列表(Master Playlist) 和 媒体播放列表(Media Playlist) 通常是 分开的两个文件 ,而不是合并到一个文件中。这种分离的设计是为了支持自适应码率切换和多分辨率适配。
HLS 的 m3u8 文件有两种主要类型:
主播放列表.m3u8(Master Playlist) 用于描述多个不同码率(分辨率)的视频流,每个流对应一个独立的媒体播放列表 .m3u8 文件。它是一个”目录”,不包含实际的 TS 片段,只包含指向不同分辨率/码率的子播放列表的链接。
一般命名为: master.m3u8 或 index.m3u8 (包含 EXT-X-STREAM-INF)
媒体播放列表.m3u8(Media Playlist) 一定会提供。用于描述一个视频流的具体分段(切片)信息,每个分段通常是一个 .ts 文件。
一般命名为:low/index.m3u8、mid/index.m3u8、high/index.m3u8 (包含 EXTINF 和 .ts)
在某些情况下,可能会直接提供媒体播放列表给 App,而不是主播放列表。例如:单一码率 :如果视频只有一种码率,可能会直接提供媒体播放列表。不然正常情况下一般提供一个主播放列表(Master Playlist)文件,然后播放器根据网络条件自动选择最合适的媒体播放列表。
主播放列表 和 媒体播放列表 的文件后缀都是 .m3u8。
区分它们的关键在于文件内容:
主播放列表包含 #EXT-X-STREAM-INF 标签,描述多个视频流。
媒体播放列表包含 #EXTINF 标签,描述一个视频流的分段信息。
文件后缀相同是为了保持格式统一和简化解析。
现在比较常见的视频流媒体,大部分都是 m3u8 格式的,而对于 m3u8 格式的视频而言,如果你下载过,你会发现它就是一个文本文件,大概也就只有几十 kb,从磁盘大小来看,应该也知道它并不是一个直接的视频文件。即如果我们想要下载对应的视频文件,直接下载 m3u8,当然是达不到目的的。
m3u8 是一种视频的播放格式,它是将一个完整的视频切割成多个 ts 后缀的视频,然后当我们的进度条被移动或者按时间顺序移动的时候,就会下载对应的片段来加载。
触发的方法在iOS中如下,其中 loadingRequest 每一小块数据的请求,请求地址如m3u8格式中的ts文件链接地址。
1 2 3 4 5 6 7 8 9 10 - (BOOL)resourceLoader:(AVAssetResourceLoader*)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest*)loadingRequest{ }
实现代码摘自:KJPlayerDemo 其说明文档见: iOS 音频视频播放器实现边下载边播放缓存视频
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 NS_INLINE void kStartDownloading(KJDownloader * downloader, AVAssetResourceLoadingRequest * request){ AVAssetResourceLoadingDataRequest *dataRequest = request.dataRequest; NSInteger length = dataRequest.requestedLength; NSInteger offset; if (dataRequest.currentOffset != 0 ) { offset = (NSInteger )dataRequest.currentOffset; } else { offset = (NSInteger )dataRequest.requestedOffset; } if (@available(iOS 9.0 , *)) { if (dataRequest.requestsAllDataToEndOfResource) { [downloader kj_downloadTaskRange:NSMakeRange (offset, length) whole:YES ]; return ; } } [downloader kj_downloadTaskRange:NSMakeRange (offset, length) whole:NO ]; }
2.1、m3u8文件示例 多码率自适应流示例(Master Playlist)
1 2 3 4 5 6 7 8 9 10 #EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000,RESOLUTION=720x480 low/video.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000,RESOLUTION=1280x720 mid/video.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5120000,AVERAGE-BANDWIDTH=4000000,RESOLUTION=1920x1080 high/video.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=10240000,AVERAGE-BANDWIDTH=8000000,RESOLUTION=3840x2160 uhd/video.m3u8
m3u8文件示例1:ts片段是完整地址
1 2 3 4 5 6 7 8 9 10 11 #EXTM3U #EXT -X-TARGETDURATION :19 #EXT -X-VERSION :2 #EXTINF :10 , http :#EXTINF :10 , http :………….. #EXTINF :12 , http :#EXT -X-ENDLIST
m3u8文件示例2:这里的片段,全部是基于域名的相对地址,
1 2 3 4 5 6 7 8 9 10 #EXTM3U #EXT-X-VERSION:2 #EXT-X-MEDIA-SEQUENCE:102 #EXT-X-TARGETDURATION:12 #EXTINF:10, 57b3f432.ts #EXTINF:12, 57b3f43c.ts #EXTINF:9, 57b3f446.ts
2.2、m3u8文件字段说明 #EXTINF :10表示的是这段TS的时长是10秒。
57b3f432.ts这里表示的是每一个TS的文件名,有的M3U8这里直接是一个完成的http链接。
其他参考文章:
iOS解析M3U8文件及TS文件下载与合并
iOS 拼接m3u8文件 苹果m3u8怎么转换成mp4
1 self .playerUrl = @"http://cctv2.vtime.cntv.wscdns.com:8000/live/no/204_/seg0/index.m3u8?begintime=1469509516000" ;
附:边下边播
1、解码m3u8:拿到一个M3U8链接后可以解析出M3U8索引的具体内容,包括每一个TS的下载链接、时长等;
下载: 拿到每一个TS文件的链接就可以逐个下载了,下载后存储为xxx.ts到手机里;打包: 将下载的TS数据按照播放顺序打包,供客户端播放;播放: 数据打包完成,就可以播放了。
Android——实现m3u8视频缓存
iOS流媒体开发之三:HLS直播(M3U8)回看和下载功能的实现
iOS 视频边下边播(缓存,预加载)
点播:
服务器将直播内容使用FFMPEG转码成MP4和3GP等点播源,生成播放连接返回给客户端播放就可以了。
2、播放器选择之路 音视频播放对于现在的互联网应用来说,已经是不可或缺的功能之一。作为一个 App 开发者,开发一个音视频播放功能,说难不难,说简单也不简单,我们常常会面临几个抉择:
使用原生视频组件(如:MediaPlayer)
使用原生硬解码/FFmpeg软解,定制视频播放组件
使用完全开源的第三方组件(如:ijkplayer)
使用商业第三方组件(如:腾讯云播放器,阿里云播放器)
2.1、腾讯云播放器
flutter_tencentplayer_plus
三、直播礼物播放 直播礼物类型详解
VAP动效实现方案
SVGA VS VAP
SVGA 是矢量动画方案,对简单动画支持更好。
VAP是视频方法,对复杂动画支持更好。相比SVGA,VAP具有更高的压缩率和硬件解码的优势,使得动画播放更加流畅。VAP的素材大小较小,仅为1.5M,远小于Apng和Webp格式,且采用硬件解码,解码速度更快。
VAP在文件大小和内存占用方面优于SVGA,这可以极大的节约文件包的空间并加快用户的读取速度
四、视频预加载
上中下三个player组成类似轮播的效果。播放当前视频时候,预加载下一个视频的数据。
视频播放延迟 由于分段和缓冲机制,HLS的延迟通常高于实时流媒体协议(如RTMP)。HLS的延迟有多少,怎么优化延迟
1. HLS延迟的来源 HLS延迟主要由以下几个因素引起:
分段长度 :HLS将视频分割成多个小片段(通常为10秒),播放器需要等待第一个完整的片段下载完成后才能开始播放。
缓冲机制 :播放器通常会预加载多个片段以应对网络波动,这会增加延迟(实际是并发的加载影响了第一个片段的加载时间)。
缓冲机制会预加载多个片段,为的是播放的流畅性。延迟的来源是第一个片段什么时候加载完。但由于有缓冲机制所以会同时加载第一个片段和后续的片段,所以假设是3个片段缓冲,则第一个片段在这种并发的情况相爱可能是最后才加载完的。所以 HLS延迟的典型值
默认配置 :10秒片段长度 + 3个片段缓冲 = 30秒左右延迟 。
优化配置(减少片段长度+减少缓冲区个数) :2秒片段长度 + 1个片段缓冲 = 3秒到5秒延迟 。
五、视频帧 上下两个区域。页面下部分区域为视频的帧图,页面上部分为视频滑动到指定位置显示的画面,以此来形成滑动页面下部分滚动条时候,能实时看到视频帧的效果,实际最终帧为点击确认后才截取。
业务流程图:视频帧获取.graffle
六、视频播放暗掉 核心:
1 2 3 4 5 [[UIApplication sharedApplication] setIdleTimerDisabled:YES ] ; [[UIApplication sharedApplication] setIdleTimerDisabled:NO ] ;
视频解码
音频降噪
【岗位核心价值】 通过技术手段实现沉浸式短剧播放体验,推动产品在海外市场的用户增长与留存。 【岗位职责】 负责短剧App的iOS原生模块开发及Flutter跨平台功能实现 优化视频流加载、多分辨率适配及低延迟播放技术方案 实现海外支付(Google Pay/Apple Pay/本地钱包)、多语言动态切换等全球化功能构建AB测试框架支持海外市场本地化运营 持续优化应用性能,确保百万级DAU下的稳定性 【技术要求】 必备能力: 3年以上iOS原生开发经验,精通Swift/ Obiective-0 ,2年以上Flutter商业项目经验,熟悉Dart语言特性 深刻理解MVC/MVVM架构,具备模块化开发能 熟悉App上架流程及海外合规要求(GDPR/COPPA) 加分项: 熟悉Android开发及Flutter与Native混合开发 有出海项目经验(AWS/GCP部署、多CDN调度)
End