У меня проблемы с получением кода, который работает на Chrome рабочем столе для работы на iPhone. Я создал демонстрационную страницу (https://jsfiddle.net/0nryc7uf/), которая позволяет пользователям выбирать (или захватывать) видео. После выбора видео отображается в элементе видео, а миниатюрное изображение отображается в элементе IMG. Это хорошо работает на рабочем столе, но не на iPhone. Видео будет воспроизводиться iPhone (постер не отображается), но миниатюра не отображается. Есть мысли?
function fileSelected(e)
{ //User captured or selected file: Event
var file = e.target.files[0];
if (file)
readFile(file);
else
alert('Not a valid image!');
}
function readFile(file)
{//set up a FileReader
var reader = new FileReader();
reader.onloadend = function () {
makeThumbnail(reader.result);
}
reader.onerror = function () {
alert('There was an error reading the file!');
}
//read in the file data
reader.readAsDataURL(file);
}
function makeThumbnail(fileData) {
//Find target elements in page
var myvid = document.getElementById('myvid');
var mythumb = document.getElementById('mythumb');
//Create a video element and load with
var video = document.createElement('video');
video.onloadedmetadata = function() {
};
video.oncanplay = function() { //need this for iphone
this.currentTime = 0.1;
video.oncanplay = null;
};
video.onseeked = function(e) {
//Create canvas to hold thumbnail
var canvas = document.createElement('canvas');
canvas.height = video.videoHeight;
canvas.width = video.videoWidth;
var ctx = canvas.getContext('2d');
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
//display thumbnail
mythumb.src = canvas.toDataURL("image/png");
myvid.src = fileData;
myvid.play();
};
video.src = fileData;
video.load(); //need this for iphone
}
ОБНОВЛЕНИЕ: Проблема, похоже, связана с тем, какая камера (передняя / задняя) использовалась для захвата видео и какая ориентация использовалась. Кажется, все работает нормально, кроме портретного режима с задней камерой. Я обновил jsFiddle здесь: https://jsfiddle.net/roknjohn/j0gyn52k/4/ и провел такой же тест на github: https://roknjohn.github.io/thumbnail/index.html, чтобы лучше проиллюстрировать проблему.
ОБНОВЛЕНИЕ 2: У меня есть отказался от этой функциональности. К вашему сведению, мое приложение PWA позволяет пользователям захватывать видео и загружать на сервер. Приложение использует тег <input type="file" accept="video/mp4,video/x-m4v,video/*">
для захвата видео и javascript для публикации с вызовом AJAX. Перед публикацией PWA создал эскиз видео и также отправил его. Поскольку создание миниатюры на стороне клиента было проблематичным c по причинам, указанным выше, теперь я создаю миниатюру на сервере, как только появляется видео. Я использую FFMPEG, чтобы извлечь изображение PNG из загруженного файла mov ie и сохранить для дальнейшего использования.
Но, увы, я обнаружил еще одну проблему с iOS Safari. Приложения PWA на этом устройстве теряют доступ к камере, как только приложение теряет фокус (т.е. отправляется в фоновый режим). При первом запуске приложения камера работает хорошо, пока вы не откроете другое приложение и не вернетесь назад. Затем экран камеры становится абсолютно черным, что требует от пользователя завершения приложения и его повторного запуска.
ОБНОВЛЕНИЕ 3: Что ж, становится хуже. Я только что обновился до iOS 13.4 и теперь камера вообще не работает с тегом <input>
. Думаю, я загляну в WebRT C ...
ОБНОВЛЕНИЕ 4: Возможно, я говорил слишком рано. Обновление 13.4 фактически сломало мой стиль тега <input>
, так как я обернул его в <label>
и скрыл стандартный (уродливый). Я просто добавил подпрограмму javascript для вызова метода click скрытого ввода, и теперь все работает. Скрестив пальцы ... это было очень круто.