视频:修 media.php 的 304/Range 冲突,HEVC 解不了时给明确提示 (#52)
304 判定没有排除 Range 请求:视频第二次打开时浏览器同时发 Range + If-None-Match,命中 304 拿到空响应 ⇒ 黑屏。 改成 $hasRange 为真时跳过 304。顺手补 Last-Modified(部分浏览器需要它才允许 seek)。 另查明用户的视频是 H.265/HEVC,Chrome/Firefox 无法解码 —— 浏览器端无解, 检测到解码失败时显示提示卡片 + 下载入口,不再给一块黑屏。
This commit is contained in:
@@ -70,6 +70,8 @@
|
||||
var kind = trigger.getAttribute('data-prev') || 'image';
|
||||
var src = trigger.getAttribute('data-src') || trigger.getAttribute('href') || '';
|
||||
var dl = trigger.getAttribute('data-dl') || src;
|
||||
/* #53:文件名要在 error 回调里用到,提前取出来(原来 nm 在函数末尾才定义) */
|
||||
var nm2 = trigger.getAttribute('data-name') || '';
|
||||
if (!src) { return false; }
|
||||
opener = trigger;
|
||||
clear();
|
||||
@@ -82,6 +84,37 @@
|
||||
el.controls = true;
|
||||
el.autoplay = true;
|
||||
el.playsInline = true;
|
||||
/* 🔴🔴 #53(2026-11-05):**HEVC 解码失败时给明确提示,不要装死**。
|
||||
实测用户的视频是 H.265/HEVC(`hvc1`),Chrome/Firefox 的根本解不了 ——
|
||||
表现为一块黑屏,什么提示都没有,用户只会以为"文件坏了"。
|
||||
|
||||
这里监听 error:能取到 `el.error.code` 就说明是解码/加载失败。
|
||||
把解释写进画面本身(而不是 alert),并给出下载入口 ——
|
||||
下载下来用系统播放器是能看的(VLC/iPhone/Windows 都支持 HEVC)。
|
||||
|
||||
⚠️ 不做"静默回退到下载页":用户点的是"看",直接跳走会困惑。
|
||||
要的是**在原地说明白**,同时给一条出路。 */
|
||||
el.addEventListener('error', function () {
|
||||
var wrap = document.createElement('div');
|
||||
wrap.className = 'pv-fallback';
|
||||
var h = document.createElement('p');
|
||||
h.className = 'pv-fallback-h';
|
||||
h.textContent = '这个视频浏览器解不了';
|
||||
var p = document.createElement('p');
|
||||
p.className = 'pv-fallback-p';
|
||||
p.textContent = '它可能是 H.265(HEVC)编码。Chrome、Firefox 不支持这种格式,'
|
||||
+ '但文件本身没坏 —— 下载后用系统播放器(iPhone / VLC / Windows 播放器)可以正常观看。';
|
||||
var a = document.createElement('a');
|
||||
a.className = 'pv-fallback-dl';
|
||||
a.href = dl;
|
||||
a.textContent = '下载这个视频';
|
||||
if (nm2) { a.setAttribute('download', nm2); }
|
||||
wrap.appendChild(h);
|
||||
wrap.appendChild(p);
|
||||
wrap.appendChild(a);
|
||||
while (stage.firstChild) { stage.removeChild(stage.firstChild); }
|
||||
stage.appendChild(wrap);
|
||||
});
|
||||
} else if (kind === 'pdf') {
|
||||
el = document.createElement('iframe');
|
||||
el.className = 'pv-pdf';
|
||||
|
||||
Reference in New Issue
Block a user