javascript - 无法从 iOS Safari 上的视频创建缩略图 - 适用于桌面 (Javascript)
问题描述
我无法让可在 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 创建了视频的缩略图并将其发送出去。由于上述原因在客户端生成缩略图存在问题,我现在在视频到达后在服务器上创建缩略图。我使用 FFMPEG 从上传的电影中提取 PNG 图像并存储以备后用。
但是,唉,我发现了 iOS Safari 的另一个问题。一旦应用程序失去焦点(即发送到后台),此设备上的 PWA 应用程序将无法访问相机。当应用程序首次启动时,相机工作良好,直到您打开另一个应用程序并返回。然后,相机屏幕全黑,需要用户关闭应用程序并重新启动。
更新3:嗯,它变得更糟。我刚刚升级到 iOS 13.4,现在相机根本无法使用<input>
标签。我想我会研究 WebRTC ......
更新4:我可能说得太早了。13.4 更新实际上打破了我为<input>
标签设计样式的方式,因为我将它包裹在 a 中<label>
并隐藏了标准(丑陋的)标签。我刚刚添加了一个 javascript 例程来调用隐藏输入的 click 方法,现在似乎一切正常。手指交叉……这真是太棒了。
解决方案
推荐阅读
- java - Json Jackson 在没有设置器的情况下反序列化对象
- python-3.x - 添加两位数并在没有 IF 和 While 的情况下找到它们的进位
- r - 用分组值替换列中的 NA
- java - 如何构建还包含源文件的可执行 uber-jar?
- c++ - sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候可以不同?
- java - 将小数值四舍五入到小数点后两位数
- c# - 将子实体从一个对象复制到另一个对象
- sql - 在返回函数中返回间隔的结束?
- apache-spark - pyspark:比较给定列的值时从数据框中获取公共数据
- reactjs - 为什么 React 组件在传递给它的道具发生变化时没有更新?