load = 'auto'; video.setAttribute('playsinline', ''); video.setAttribute('webkit-playsinline', ''); }); } if (typeof requestIdleCallback !== 'undefined') { requestIdleCallback(function() { optimizePageLoad(); optimizeVideoLoad(); }); } else { setTimeout(function() { optimizePageLoad(); optimizeVideoLoad(); }, 100); } setTimeout(function() { const playerLoading = document.getElementById('player-loading'); if (playerLoading) { playerLoading.style.display = 'none'; } }, 1000); // 监听播放器控制栏 document.addEventListener('click', function(e) { const playerLoading = document.getElementById('player-loading'); if (playerLoading) { playerLoading.style.display = 'none'; } }); // 监控视频分辨率 function updateResolution() { const videos = document.querySelectorAll('video'); let foundResolution = false; // 方法1: 直接从视频元素获取 for (let i = 0; i < videos.length; i++) { const video = videos[i]; if (video.videoWidth > 0 && video.videoHeight > 0) { const resolution = video.videoWidth + 'x' + video.videoHeight; // 只有分辨率变化时才更新 if (resolution !== lastDetectedResolution) { lastDetectedResolution = resolution; const playerResolution = document.getElementById('player-resolution'); if (playerResolution) { playerResolution.textContent = '分辨率: ' + resolution; } // 通知iframe更新分辨率 if (window.parent !== window) { window.parent.postMessage({ type: 'resolutionUpdate', resolution: resolution }, '*'); } } foundResolution = true; break; } } // 方法2: 尝试从视频URL推断(仅在未找到实际分辨率时) if (!foundResolution) { try { for (let i = 0; i < videos.length; i++) { const video = videos[i]; if (video.src && lastDetectedResolution === '') { const url = video.src; let urlResolution = ''; // 从URL中提取分辨率信息 if (url.includes('1080') || url.includes('FHD')) { urlResolution = '1920x1080'; } else if (url.includes('720') || url.includes('HD')) { urlResolution = '1280x720'; } else if (url.includes('480')) { urlResolution = '854x480'; } if (urlResolution && urlResolution !== lastDetectedResolution) { lastDetectedResolution = urlResolution; const playerResolution = document.getElementById('player-resolution'); if (playerResolution) { playerResolution.textContent = '分辨率: ' + urlResolution; } } break; } } } catch (e) {} } // 方法3: 检查iframe中的视频 if (!foundResolution) { try { const iframes = document.querySelectorAll('iframe'); iframes.forEach(function(iframe) { try { const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; const iframeVideos = iframeDoc.querySelectorAll('video'); for (let i = 0; i < iframeVideos.length; i++) { const video = iframeVideos[i]; if (video.videoWidth > 0 && video.videoHeight > 0) { const resolution = video.videoWidth + 'x' + video.videoHeight; if (resolution !== lastDetectedResolution) { lastDetectedResolution = resolution; const playerResolution = document.getElementById('player-resolution'); if (playerResolution) { playerResolution.textContent = '分辨率: ' + resolution; } } foundResolution = true; break; } } } catch (e) {} }); } catch (e) {} } } // 监听视频加载 setInterval(updateResolution, 2000); // 高精度网速监控(父页面) var parentSpeedHistory = []; var PARENT_SPEED_WINDOW_SIZE = 10; var parentCurrentSpeed = 0; var parentLastSpeedTime = 0; function formatSpeedParent(bps) { if (bps <= 0) return '0 B/s'; if (bps < 1024) return bps.toFixed(0) + ' B/s'; if (bps < 1048576) return (bps / 1024).toFixed(1) + ' KB/s'; return (bps / 1048576).toFixed(2) + ' MB/s'; } function calculateSmoothedSpeedParent() { if (parentSpeedHistory.length === 0) return 0; var sorted = parentSpeedHistory.slice().sort(function(a, b) { return a - b; }); var trim = Math.floor(sorted.length * 0.1); var trimmed = sorted.slice(trim, sorted.length - trim); if (trimmed.length === 0) return sorted[Math.floor(sorted.length / 2)]; var sum = 0; for (var i = 0; i < trimmed.length; i++) sum += trimmed[i]; return sum / trimmed.length; } function updateSpeedDisplay(speed, speedText) { var playerSpeed = document.getElementById('player-speed'); if (playerSpeed) { if (speedText) { playerSpeed.textContent = '\u2193 ' + speedText; } else { playerSpeed.textContent = '\u2193 ' + formatSpeedParent(speed); } } } function pushParentSpeed(speed, weight) { if (speed <= 0) return; weight = weight || 1; parentLastSpeedTime = Date.now(); parentSpeedHistory.push(speed); if (parentSpeedHistory.length > PARENT_SPEED_WINDOW_SIZE) { parentSpeedHistory.shift(); } var smoothed = calculateSmoothedSpeedParent(); var instantWeight = 0.3 * weight; parentCurrentSpeed = parentCurrentSpeed * (1 - instantWeight) + smoothed * instantWeight; if (parentCurrentSpeed <= 0) parentCurrentSpeed = speed; updateSpeedDisplay(parentCurrentSpeed); } function isMediaUrlParent(url) { if (!url) return false; var mediaPatterns = [ /\.(ts|m4s|mp4|m3u8|mpd|key|seg|init|fragment|part)(\?|$)/i, /\.(webm|mkv|avi|mov|flv|wmv|rm|rmvb|asf|mpg|mpeg|mpe|m2v|vob|ogv|3gp|3g2|f4v|divx|xvid|dat|dv|mts|m2ts|tsv|tsa|mxf|nut|gxf|amv|mtv|nsv|drc|dsm|dsv|dsa|dss|evo|vro|ivf|m4v|m4p|m4b|m4r|ogm|ogx|ps|rec|tod|tts|wtv|yuv)(\?|$)/i, /\.(webma|webmv|mka|mk3d|mp3|aac|flac|wav|wma|ogg|oga|ac3|dts|m4a|ra|ram|ape|opus|spx|amr|awb|au|mid|midi|aiff|aif|aifc)(\?|$)/i, /\/video\//i, /\/stream\//i, /\/play\//i, /\/media\//i, /\/vod\//i, /\/live\//i, /\/hls\//i, /\/dash\//i, /\/chunklist/i, /\/playlist/i, /\/segment/i, /videoplayback/i, /getVideo/i, /getManifest/i, /\?.*type=video/i, /\?.*format=video/i, /\?.*mime=video/i, /\?.*video/i, /contentType=video/i, /mimeType=video/i ]; for (var i = 0; i < mediaPatterns.length; i++) { if (mediaPatterns[i].test(url)) return true; } return false; } // 监听iframe传来的网速信息 window.addEventListener('message', function(e) { if (e.data && e.data.type === 'speedUpdate') { pushParentSpeed(e.data.speed, 0.8); } else if (e.data && e.data.type === 'resolutionUpdate') { // 只有分辨率变化时才更新 if (e.data.resolution !== lastDetectedResolution) { lastDetectedResolution = e.data.resolution; const playerResolution = document.getElementById('player-resolution'); if (playerResolution) { playerResolution.textContent = '分辨率: ' + e.data.resolution; } } } }); // 父页面直接监控视频缓冲 function monitorParentVideoBuffer() { try { var videos = document.querySelectorAll('video'); for (var i = 0; i < videos.length; i++) { var video = videos[i]; if (!video._parentBufferMonitor) { video._parentBufferMonitor = { lastBufferEnd: 0, lastTime: Date.now() }; video.addEventListener('progress', function(e) { var target = e.target; var monitor = target._parentBufferMonitor; if (!monitor) return; var now = Date.now(); if (target.buffered && target.buffered.length > 0) { var bufferEnd = target.buffered.end(target.buffered.length - 1); var bufferedTime = bufferEnd - monitor.lastBufferEnd; var dt = (now - monitor.lastTime) / 1000; if (dt >= 0.1 && bufferedTime > 0) { var bitrate = estimateParentBitrate(target); if (bitrate > 0) { var bytesPerSecond = bitrate / 8; pushParentSpeed(bytesPerSecond, 0.4); } monitor.lastBufferEnd = bufferEnd; monitor.lastTime = now; } } }); } } } catch(e) {} } function estimateParentBitrate(video) { try { if (video.videoWidth && video.videoHeight) { var pixels = video.videoWidth * video.videoHeight; if (pixels >= 8294400) return 8000000; if (pixels >= 2073600) return 4000000; if (pixels >= 921600) return 2000000; if (pixels >= 408960) return 1000000; return 500000; } } catch(e) {} return 0; } // 父页面网速衰减 function parentSpeedDecay() { var timeSinceLastUpdate = Date.now() - parentLastSpeedTime; if (timeSinceLastUpdate > 2000 && parentCurrentSpeed > 0) { if (timeSinceLastUpdate > 5000) { parentCurrentSpeed *= 0.7; } else if (timeSinceLastUpdate > 3000) { parentCurrentSpeed *= 0.85; } else { parentCurrentSpeed *= 0.95; } if (parentCurrentSpeed < 100) parentCurrentSpeed = 0; updateSpeedDisplay(parentCurrentSpeed); } } setInterval(monitorParentVideoBuffer, 500); setInterval(parentSpeedDecay, 500); // 监控视频播放状态,控制分辨率显示 function monitorVideoPlayback() { const resolutionElement = document.getElementById('player-resolution'); if (resolutionElement) { // 查找所有视频元素 const videos = document.querySelectorAll('video'); let isPlaying = false; for (let i = 0; i < videos.length; i++) { const video = videos[i]; if (!video.paused && !video.ended) { isPlaying = true; break; } } // 检查iframe中的视频状态 const iframes = document.querySelectorAll('iframe'); iframes.forEach(iframe => { try { const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; const iframeVideos = iframeDoc.querySelectorAll('video'); for (let i = 0; i < iframeVideos.length; i++) { const video = iframeVideos[i]; if (!video.paused && !video.ended) { isPlaying = true; break; } } } catch (e) { // 跨域错误,忽略 } }); resolutionElement.style.display = 'block'; resolutionElement.style.opacity = '1'; resolutionElement.style.visibility = 'visible'; } } // 每100毫秒检查一次视频播放状态 setInterval(monitorVideoPlayback, 100); // 监听视频事件 function setupVideoEventListeners() { const videos = document.querySelectorAll('video'); videos.forEach(function(video) { video.addEventListener('play', monitorVideoPlayback); video.addEventListener('pause', monitorVideoPlayback); video.addEventListener('ended', monitorVideoPlayback); }); } // 设置视频事件监听器 setupVideoEventListeners();