视频

前言

一、视频上传

文件分片上传与分片下载.md

二、常见视频播放

1、视频地址/素材获取网站

mov_website1

2、m3u8文件认识

m3u8 是 HLS 协议中使用的播放列表文件格式,它是 M3U 文件格式的扩展,专门用于 HLS。

在 HLS(HTTP Live Streaming)中,主播放列表(Master Playlist)媒体播放列表(Media Playlist) 通常是 分开的两个文件,而不是合并到一个文件中。这种分离的设计是为了支持自适应码率切换和多分辨率适配。

HLS 的 m3u8 文件有两种主要类型:

主播放列表.m3u8(Master Playlist)用于描述多个不同码率(分辨率)的视频流,每个流对应一个独立的媒体播放列表 .m3u8 文件。它是一个”目录”,不包含实际的 TS 片段,只包含指向不同分辨率/码率的子播放列表的链接。

一般命名为: master.m3u8index.m3u8 (包含 EXT-X-STREAM-INF

媒体播放列表.m3u8(Media Playlist)一定会提供。用于描述一个视频流的具体分段(切片)信息,每个分段通常是一个 .ts 文件。

一般命名为:low/index.m3u8mid/index.m3u8high/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
/*  连接视频播放和视频断点下载的桥梁
* 必须返回Yes,如果返回NO,则resourceLoader将会加载出现故障的数据
* 这里会出现很多个loadingRequest请求,需要为每一次请求作出处理
* 该接口会被调用多次,请求不同片段的视频数据,应当保存这些请求,在请求的数据全部响应完毕才销毁该请求
* @param resourceLoader 资源管理器
* @param loadingRequest 每一小块数据的请求
*/
- (BOOL)resourceLoader:(AVAssetResourceLoader*)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest*)loadingRequest{
// TODO:在这里面开始我们的网络下载请求,也就是得到AVAssetResourceLoadingRequest对象
}

实现代码摘自: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://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=0&ts_end=10&ts_seg_no=0
#EXTINF:10,
http://122.225.31.106/6775ED76AE94E84581E2FA4D03/0300080B0053D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=10&ts_end=20&ts_seg_no=1
…………..
#EXTINF:12,
http://122.225.31.85/657DD4BEC15488401753C7200C/0300080B0A53D05A49A22808DF700EC607AF80-D3EF-E08A-FB37-918809D8CF4C.mp4.ts?ts_start=320&ts_end=336&ts_seg_no=396
#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 开发者,开发一个音视频播放功能,说难不难,说简单也不简单,我们常常会面临几个抉择:

  1. 使用原生视频组件(如:MediaPlayer)
  2. 使用原生硬解码/FFmpeg软解,定制视频播放组件
  3. 使用完全开源的第三方组件(如:ijkplayer)
  4. 使用商业第三方组件(如:腾讯云播放器,阿里云播放器)

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
// 1.打开常亮
[[UIApplication sharedApplication] setIdleTimerDisabled:YES] ;

// 2.关闭长亮
[[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调度)

枚举值名称 枚举值 枚举类型描述
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

End