mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-15 16:06:41 +03:00
feat: add modern EME support for FairPlay (#3776)
Add support for HLS com.apple.streamingkeydelivery through MSE/EME implementation. Close #3346 ## Tests Tested on: - Mac 11.6 Safari 15.2 - iOS 15.2 Safari 15.2 - Mac 11.6 Chrome 96 (for potential regressions on Widevine keySystem) | Mode | DRM API | TS | CMAF (mono-key and multi-keys) |---|---|---|---| | file | EME | ✅ | ✅ | | file | Legacy-prefixed | ✅ | ✅ | | media-source | EME | **mux-js**: `encrypted` never fired<br />**real MSE**: `encrypted` event received, but with incorrect `sinf` initData (*1) | ✅ | | media-source | Legacy-prefixed | **mux-js**: `webkitneedkey` never fired<br/>**real MSE**: TBD | 🔴 fails to append media segment to SourceBuffer (init segment ok) `(video:4) – "failed fetch and append: code=3015"` | ## Support table | Mode | DRM API | TS | CMAF (mono-key and multi-keys) |---|---|---|---| | file | EME | ✅ | ✅ | | file | Legacy-prefixed | ✅ | ✅ | | media-source | EME | 🚫 `4040: HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED` | ✅ | | media-source | Legacy-prefixed | 🚫 `4041: HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED` |🚫 `4041: HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED` | ⚠️ Use EME APIs with multi-keys CMAF makes the video stalling with the audio continuing alone after a short time (~3 minutes in the stream, could be shorter, could be longer). Didn't find an explanation to that yet. I've observed the same behaviour with hls.js code so I don't think this is a player issue.
This commit is contained in:
@@ -1,25 +1,31 @@
|
||||
# FairPlay Support
|
||||
|
||||
When using native `src=` playback, we support using FairPlay on Safari.
|
||||
We support FairPlay with EME on compatible environments or native `src=`.
|
||||
Adding FairPlay support involves a bit more work than other key systems.
|
||||
|
||||
|
||||
## Server certificate
|
||||
|
||||
All FairPlay content requires setting a server certificate. This is set in the
|
||||
Player configuration:
|
||||
All FairPlay content requires setting a server certificate. You can either
|
||||
provide it directly or set a serverCertificateUri for Shaka to fetch it for
|
||||
you.
|
||||
|
||||
```js
|
||||
const req = await fetch('https://example.com/cert.der');
|
||||
const cert = await req.arrayBuffer();
|
||||
|
||||
player.configure('drm.advanced.com\\.apple\\.fps\\.1_0.serverCertificate',
|
||||
player.configure('drm.advanced.com\\.apple\\.fps\\.serverCertificate',
|
||||
new Uint8Array(cert));
|
||||
```
|
||||
|
||||
```js
|
||||
player.configure('drm.advanced.com\\.apple\\.fps\\.serverCertificateUri',
|
||||
'https://example.com/cert.der');
|
||||
```
|
||||
|
||||
## Content ID
|
||||
|
||||
Note: This only applies when legacy Apple Media Keys is used.
|
||||
|
||||
Some FairPlay content use custom signaling for the content ID. The content ID
|
||||
is used by the browser to generate the license request. If you don't use the
|
||||
default content ID derivation, you need to specify a custom init data transform:
|
||||
|
||||
Reference in New Issue
Block a user