HLS公开课(二)高级字段中介绍了一个HLS中的一个标识====> #EXT-X-MAP 这个字段是视频的初始化片段, 简而言之,有了这个字段,说明后续的每一个分片文件必须和通过这个初始化片段才能完整解读,缺少这个初始化片段, M3U8视频根本播放不了. 表达的格式如下:
#EXT-X-MAP:<attribute-list>
这个属性集有下面这些字段:
- URI 初始化片段的地址, 这个信息是必须的.
- BYTERANGE 这个可以参考 #EXT-X-BYTERANGE 字段
给大家据一个例子: europe.olemovienews.com/hlstimeofff… 其中有一行:
#EXT-X-MAP:URI="init-v1-a1.mp4"
说明后续的每一个分片都需要这个init-v1-a1.mp4才能真正解码播放出来: 取出第一个分片:europe.olemovienews.com/hlstimeofff…
ffprobe version 4.2.4-1ubuntu0.1 Copyright (c) 2007-2020 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
configuration: --prefix=/usr --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55fd8bd5ff00] could not find corresponding trex (id 1)
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55fd8bd5ff00] could not find corresponding track id 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55fd8bd5ff00] trun track id unknown, no tfhd was found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55fd8bd5ff00] error reading header
https://europe.olemovienews.com/hlstimeofffmp4/20210226/fICqcpqr/mp4/fICqcpqr.mp4/seg-1-v1-a1.m4s: Invalid data found when processing input
这是因为光解析第一个分片是不行的,因为真正的视频头部信息在init-v1-a1.mp4中.
从上面的解释中可以看出来, #EXT-X-MAP的字段主要目的有3个:
- 为了安全
- 为了节省存储空间
- 为了减少切片, 减少切片服务器的工作量
1.#EXT-X-MAP的安全作用
'#EXT-X-MAP' 将一个完整视频的头单独存放, 将其他部分存在另一个视频文件中, 这样就是你们抓到了其中一个视频, 也播放不了, 这是防止盗链的一种手段, "将鸡蛋放在不同的篮子里"
对于europe.olemovienews.com/hlstimeofff…
下载完成如下:
其中#EXT-X-MAP中视频片段是:
#EXT-X-MAP:URI="https://europe.olemovienews.com/hlstimeofffmp4/20210226/fICqcpqr/mp4/fICqcpqr.mp4/init-v1-a1.mp4"
可以看出来, #EXT-X-MAP中的视频片段中没有实质内容, 只有视频的头部, 了解MP4视频构造的都知道moov是MP4的头部, mdat才是MP4的实质内容,
对比看一下第一个片段:
europe.olemovienews.com/hlstimeofff…
这是一个FMP4片段, 里面没有moov头部, 单单播放这个视频片段是无法播放成功的, 还需要和#EXT-X-MAP结合起来播放才可以真正播放成功的.
现在大家知道了#EXT-X-MAP的安全就表现在这里=====> 我可以将#EXT-X-MAP中的片段和其他的片段放在不同的服务器上, 只要两个片段不被同时拿到, 还是安全的.
当然安全并不是#EXT-X-MAP的主要目的, 毕竟如果为了安全, 还是使用#EXT-X-KEY更方便一点.
2.#EXT-X-MAP减少存储空间
虽然MP4的moov头部占比不太大, 但是对于一个动不动有成百上千个的M3U8文件, 加起来的大小还是比较可观的, 一个moov头部一般有100K, 如果有1000个FMP4片段, 那么就可以节省10M大小, 海量的视频算算要节省多少数据.
3.#EXT-X-MAP减少切片工作
我们上面都是谈 #EXT-X-MAP中的URI属性, 但是别忘了#EXT-X-MAP还有一个BYTERANGE属性, 这个属性是例子一般是
#EXT-X-MAP:URI="init-v1-a1.mp4",BYTERANGE="1000@2000"
这就表示init-v1-a1.mp4中的1000和2000之间的数据被采用, 其他的不被采用. 这样做的好处是将一个完整的视频切片是需要工作量的, 如果服务端不想做这个工作, 直接在M3U8索引文件中标识一下采用哪一段的数据, 就不用切片这么复杂的工作了.
推荐一个视频下载的github项目: 这里面支持包含#EXT-X-MAP字段的视频的下载与播放功能 github.com/JeffMony/Vi…