AWS подпись S3 для видео HLS на iOS Safari - PullRequest
0 голосов
/ 13 марта 2020

Я использую HLS. js для обработки потоков HLS, и я смог нормально работать на Android. Проблема в том, что Safari iOS имеет встроенную поддержку HLS, поэтому он не поддерживает расширения Media Source Extensions (MSE). Это означает, что я не могу использовать пользовательский загрузчик для подписи URL каждого чанка файла, чтобы он мог обращаться к этому чанку файла на S3. Каждый пользователь имеет собственный доступ к Cognito и может получить доступ только к своей папке в корзине S3. Это мешает пользователям просматривать видео других людей. Вот почему общая подпись c файла списка воспроизведения недостаточна, поскольку файл списка воспроизведения может быть подписан, но как только поток пытается получить доступ к фрагментам файла, он блокируется, поскольку они не подписаны.

if (Hls.isSupported()) {
                        class loader extends Hls.DefaultConfig.loader {
                            constructor(config) {
                                super(config);
                                var load = this.load.bind(this);
                                this.load = async function(context, config, callbacks) {
                                    let signedVideoPlaylistUrl = await new Promise((resolve, reject) => {
                                        s3.getSignedUrl('getObject', {
                                            Bucket: 'bucket-name',
                                            // Pass the URL and get the S3 key
                                            Key: context.url.split("s3.amazonaws.com/")[1],
                                            Expires: 60 * 60 * 1 // 1 hour
                                        }, function(error, result){
                                            if(error){
                                                console.error(error);
                                                reject(error);
                                            } else {
                                                resolve(result);
                                            }
                                        })
                                    });
                                    context.url = signedVideoPlaylistUrl;
                                    load(context, config, callbacks);
                                };
                            }
                        }
                        var hls = new Hls({
                            loader: loader
                        });
                        hls.attachMedia(video);
                        hls.on(Hls.Events.MEDIA_ATTACHED, function(event, data) {
                            console.log(event, data);
                        });
                        hls.on(Hls.Events.MANIFEST_PARSED, function() {
                            console.log(event, data);
                            //video.play();
                        });
                        hls.loadSource(`"https://bucket-name.s3.amazonaws.com/users/random-user-id/category/video_hls/recordingId.m3u8`);
                    }
                    // hls.js is not supported on platforms that do not have Media Source Extensions (MSE) enabled.
                    // When the browser has built-in HLS support (check using `canPlayType`), we can provide an HLS manifest (i.e. .m3u8 URL) directly to the video element through the `src` property.
                    // This is using the built-in support of the plain video element, without using hls.js.
                    // Note: it would be more normal to wait on the 'canplay' event below however on Safari (where you are most likely to find built-in HLS support) the video.src URL must be on the user-driven
                    // white-list before a 'canplay' event will be emitted; the last video event that can be reliably listened-for when the URL is not on the white-list is 'loadedmetadata'.
                    else if (video.canPlayType('application/vnd.apple.mpegurl')) {
                        //THIS IS WHERE I'M STUCK
                        throw new Meteor.Error("Not Supported");
                        video.src = signedVideoPlaylistUrl;
                        video.addEventListener('loadedmetadata', function() {
                            video.play();
                        });
                    }
                }

Поскольку Safari на iOS не поддерживает HLS. js, я не могу перехватить URL-адрес, как могу, с помощью приведенного выше кода. Кто-нибудь знает, возможно ли это сделать? Я не смог найти способ сделать это с родной HTML с тегом video.

Спасибо!

...