Apple Music 和 HLS (in progress)

任何人的工作 尤其是那些作品质量很好的 应该得到相应的的回报。本文虽然有某些意图,但还是在支持正版的。

自从 Apple Music推出 无损音质后,我就开始打起AppleMusic的主意了,国区定价 10元/月,但曲库不够全。不过这也比现在的网易云音乐要全了,并且 网易云音乐越来越恶心了。QQ音乐实在不想用,spotify由于一些原因 加不了家庭计划了(都是奸商干的好事)。

但是有个问题 离线的音乐只能存储在本设备上,不能放在别处。为啥呢?

movpkg

在 macOS 上 Apple Muisc 离线出来的文件(或者说是文件包) 是这个东西。

这里包含了单个曲目的重要信息

  • root.xml (标识文件类型,作为统一入口)
  • boot.xml (记录文件内容详细信息)
  • Data/*.descriptor (记录曲目的元数据)
  • Data/*.data (记录曲目的m3u8信息 以及加密方式 key URI等)
  • {realData}/*.m3u8 (记录媒体分片信息 和 元数据)

从root.xml 可以看到 type 是 HLS,那么这个 HLS 是什么鬼呢?

HLS

Http live streaming

一个基于 HTTP 协议的 流媒体 协议,同样是基于HTTP协议传输的 和直接传输一个FLAC有什么区别呢?

这里要再吹一下 Apple的工程师,这个协议早在 iOS 3的时候就被标准化进去了,可见Apple的眼光有多长远。

假设 传输的 一个无损音频为 30M(容器为FLAC 或者你也可以把它想成ALAC 这个不重要),假设 我想直接从中间开始听,这两种方法的区别如下:

a:通过HTTP直接传输FLAC:等全曲缓冲完成(至少也要缓冲到中间把 也就是15M的位置),再开始播放。

b: 通过HLS传输: 下载 m3u,找到中间部分的文件,从中间位置的开始播放(跳过了开头到中间的部分)。

很明显 b 的开销要更低,把完全不必要的东西舍弃掉 降低带宽压力和资费。

那再来举个例子 假如用户的网络状态不好 30M 的文件听起来断断续续的 用户想要听低品质一点的音乐怎么办?

a:找到服务端的低品质文件 重新开始缓冲,等缓冲到用户暂停的位置 继续播放。

b:从下一个分片缓冲低品质分片媒体。

ok 再一次 完胜。

虽然看起来 HLS 要麻烦一些,但是带来的好处远比麻烦要多得多。

怎么从HLS提取出真正的媒体文件呢?

问得好 目前还没什么办法。

仅仅是一个 simple AES 加密 就保护了这些需要受保护的媒体文件,其实最大的问题在于AES的key 用了一个私有协议: skd

目前还没有什么办法可以搞定这些问题。

即使是 离线到本地 key一定是在本地的,也没有播放器能支持解密。例如 hls.js

不过顺带了解到了关于流媒体的一些协议和服务器

  • RTSP
  • RTP
  • MPEG2-TS

参考

缓存服务器

不能用的 HLS下载或转换程序