目录
- MP4的“问题”
- m3u8是什么
- m3u8的好处
- 源码分析
- 扩展思考:mp4能不能像m3u8一样进行分片缓存呐?
- 资料
- 收获
一、MP4的“问题”
我们上面两篇边缓存边播放之缓存分片都针对MP4格式进行缓存处理,由于很多视频都是mp4格式,所以市面上商用的或者开源的播放器和缓存项目都是只支持MP4. 但是mp4格式有两个弊端(当然也是有办法进行优化的)
1.1 moov在mdat后影响秒开率
Mp4格式是一个个Box,其中moov存储的是metadata信息,mdat存储具体音视频数据信息。如果无法解析出moov数据,是无法播放该mp4文件的。而一般情况下ffmpeg生成moov是在mdat写入完成之后的,即mdat会在moov的前面,用mediaParse来查看一个mp4视频的结构如下
这样就影响用户体验(首帧加载时长过长)。
针对这种情况,通用的做法是在服务端做处理。通过ffmpeg命令吧moov移动到mdat前面。
ffmpeg -i in.mp4 -movflags faststart out.mp4
再用mediaParse来查看一个mp4视频的结构如下
1.2 缓存分片的颗粒太大、文件空洞占用空间
m3u8 文件格式详解
把mp4转为ts m3u8
//如果视频是h264
ffmpeg -y -i 11.mp4 -vcodec copy -vbsf h264_mp4toannexb out.ts
//如果视频是h265
ffmpeg -y -i 11.mp4 -vcodec copy -vbsf hevc_mp4toannexb out.ts
将ts切成小的ts片
ffmpeg -i out.ts -c copy -map 0 -f segment -segment_list ts/index.m3u8 -segment_time 15 ts/out-%04d.ts
//-f segment:切片
//-segment_list :输出切片的m3u8
//-segment_time:每个切片的时间(单位秒)
可以看到包含了一个m3u8文件和多个ts文件,其中M3U8是描述文件,ts是媒体文件。
我们先来看下M3U8文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:16 --> 共16个ts片
#EXTINF:15.520000, --> 该片的时长
out-0000.ts --> 该片的名称
#EXTINF:14.360000,
out-0001.ts
#EXTINF:15.720000,
out-0002.ts
#EXTINF:14.720000,
out-0003.ts
#EXTINF:14.440000,
out-0004.ts
#EXTINF:15.280000,
out-0005.ts
#EXTINF:15.640000,
out-0006.ts
#EXTINF:14.560000,
out-0007.ts
#EXTINF:15.040000,
out-0008.ts
#EXTINF:15.360000,
out-0009.ts
#EXTINF:14.640000,
out-0010.ts
#EXTINF:14.200000,
out-0011.ts
#EXTINF:15.160000,
out-0012.ts
#EXTINF:14.760000,
out-0013.ts
#EXTINF:15.640000,
out-0014.ts
#EXTINF:14.720000,
out-0015.ts
#EXTINF:9.960000,
out-0016.ts
#EXT-X-ENDLIST
m3u8文件是一个播放列表(playlist)索引,记录了一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。
ts是视频流文件
// ffprobe /Users/yabin/Desktop/tmp/ts/out-0001.ts
Duration: 00:00:14.36, start: 16.960000, bitrate: 351 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: hevc (Main) (HEVC / 0x43564548), yuv420p(tv), 590x1280, 25 fps, 25 tbr, 90k tbn, 25 tbc
ts文件是一种视频切片文件,可以直接播放
对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要 定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放
JeffVideoCache 的实现。
主流程和视频文件M3U8和TS格式切片,讨论一下?
m3u8 文件格式详解 JeffVideoCache 头条都在用的边下边播方案 网易新闻从0到1的短视频性能优化之路 七、收获
通过本篇的学习时间
- 了解了MP4的“问题”(moov和mdat的顺序影响解析速度、长视频缓存整个文件为单位缓存导致命中率和复用率不够高)
- 了解M3U8是一种协议,对视频进行ts切片,可以根据不同网络切换不同切片的码率、缓存的大小可以以更小可以的切片为单位等优点
- 简单分析了JeffVideoCache对M3U8的解析和缓存支持。
感谢你的阅读
下一篇我们开始多线程并发的学习实践,欢迎关注公众号“音视频开发之旅”,一起学习成长。
欢迎交流