前言
一、视频上传
二、常见视频播放
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 | /* 连接视频播放和视频断点下载的桥梁 |
实现代码摘自:KJPlayerDemo 其说明文档见: iOS 音频视频播放器实现边下载边播放缓存视频
1 | /// 开始请求下载数据 |
2.1、m3u8文件示例
多码率自适应流示例(Master Playlist)
1 | #EXTM3U |
m3u8文件示例1:ts片段是完整地址
1 | #EXTM3U |
m3u8文件示例2:这里的片段,全部是基于域名的相对地址,
1 | #EXTM3U |
2.2、m3u8文件字段说明
#EXTINF:10表示的是这段TS的时长是10秒。
57b3f432.ts这里表示的是每一个TS的文件名,有的M3U8这里直接是一个完成的http链接。
其他参考文章:
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数据按照播放顺序打包,供客户端播放;
播放:数据打包完成,就可以播放了。
iOS流媒体开发之三:HLS直播(M3U8)回看和下载功能的实现
点播:
服务器将直播内容使用FFMPEG转码成MP4和3GP等点播源,生成播放连接返回给客户端播放就可以了。
2、播放器选择之路
音视频播放对于现在的互联网应用来说,已经是不可或缺的功能之一。作为一个 App 开发者,开发一个音视频播放功能,说难不难,说简单也不简单,我们常常会面临几个抉择:
- 使用原生视频组件(如:MediaPlayer)
- 使用原生硬解码/FFmpeg软解,定制视频播放组件
- 使用完全开源的第三方组件(如:ijkplayer)
- 使用商业第三方组件(如:腾讯云播放器,阿里云播放器)
2.1、腾讯云播放器
-
官方文档:腾讯-超级播放器
项目地址:https://github.com/LiteAVSDK/Player_Flutter/tree/main/Flutter
点播播放关心的几个问题:Super_Player 点播播放各功能使用的整体介绍
1、视频本地缓存
在短视频播放场景中,视频文件的本地缓存是很刚需的一个特性,对于普通用户而言,一个已经看过的视频再次观看时,不应该再消耗一次流量。
2、视频预播放、无缝切换
在短视频播放场景中,视频预播放功能对于流畅的观看体验很有帮助:在观看当前视频的同时,在后台加载即将要播放的下一个视频 ,这样一来,当用户真正切换到下一个视频时,已经不需要从头开始加载了,而是可以做到立刻播放。
flutter_tencentplayer_plus
三、直播礼物播放
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
-
实现的功能
- 视频轨道最大截取3分钟
- 视频轨道最小截取3秒钟
- 如果小于3分钟则充满整个轨道
- 如果大于3分钟,则轨道上的展示的帧图片可以左右滑动来截取
六、视频播放暗掉
核心:
1 | // 1.打开常亮 |
视频解码
音频降噪
【岗位核心价值】
通过技术手段实现沉浸式短剧播放体验,推动产品在海外市场的用户增长与留存。
【岗位职责】
负责短剧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调度)
| 枚举值名称 | 枚举值 | 枚举类型描述 | 类 |
|---|---|---|---|
| V2TIM_ELEM_TYPE_NONE | 0 | 没有元素 | |
| V2TIM_ELEM_TYPE_TEXT | 1 | 文本消息 | V2TimTextElem |
| V2TIM_ELEM_TYPE_CUSTOM | 2 | 自定义消息 | V2TimCustomElem |
| V2TIM_ELEM_TYPE_IMAGE | 3 | 图片消息 | V2TimImageElem |
| V2TIM_ELEM_TYPE_SOUND | 4 | 语音消息 | V2TimSoundElem |
| V2TIM_ELEM_TYPE_VIDEO | 5 | 视频消息 | V2TimVideoElem |
| V2TIM_ELEM_TYPE_FILE | 6 | 文件消息 | V2TimFileElem |
| V2TIM_ELEM_TYPE_LOCATION | 7 | 地理位置消息 | V2TimLocationElem |
| V2TIM_ELEM_TYPE_FACE | 8 | 表情消息 | V2TimFaceElem |
| V2TIM_ELEM_TYPE_GROUP_TIPS | 9 | 群 Tips 消息(存消息列表) | V2TimGroupTipsElem |
| V2TIM_ELEM_TYPE_MERGER | 10 | 合并消息 | V2TimMergerElem |