Update index.html
Browse files- index.html +66 -41
index.html
CHANGED
@@ -1233,39 +1233,39 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
1233 |
}
|
1234 |
});
|
1235 |
|
1236 |
-
|
1237 |
-
|
1238 |
-
|
1239 |
-
|
1240 |
-
|
|
|
|
|
1241 |
|
1242 |
-
|
1243 |
-
|
1244 |
-
|
|
|
|
|
1245 |
|
1246 |
-
|
1247 |
-
|
1248 |
-
|
1249 |
-
|
1250 |
-
|
1251 |
-
|
1252 |
-
|
1253 |
-
|
1254 |
-
|
1255 |
-
|
1256 |
-
|
1257 |
-
|
1258 |
-
|
1259 |
-
|
1260 |
-
|
1261 |
-
|
1262 |
-
|
1263 |
-
|
1264 |
-
|
1265 |
-
console.log(`同期ズレを修正: ${avgDrift.toFixed(3)}秒`);
|
1266 |
-
syncAudioWithVideo();
|
1267 |
-
}
|
1268 |
-
}
|
1269 |
|
1270 |
// 音声を動画に同期させる関数
|
1271 |
function syncAudioWithVideo() {
|
@@ -1402,23 +1402,48 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
1402 |
enablePlayerControls();
|
1403 |
|
1404 |
previewSection.style.display = 'block';
|
|
|
|
|
|
|
|
|
1405 |
document.addEventListener('visibilitychange', async () => {
|
1406 |
if (document.hidden) {
|
1407 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1408 |
if (!video.paused) {
|
1409 |
-
enterPiP();
|
1410 |
-
} else {
|
1411 |
try {
|
1412 |
-
await
|
1413 |
-
enterPiP();
|
1414 |
} catch (e) {
|
1415 |
-
console.warn('
|
1416 |
}
|
1417 |
}
|
1418 |
-
|
1419 |
-
//
|
1420 |
-
if (
|
1421 |
-
|
|
|
|
|
1422 |
}
|
1423 |
}
|
1424 |
});
|
|
|
1233 |
}
|
1234 |
});
|
1235 |
|
1236 |
+
// startSyncCheck関数を修正
|
1237 |
+
function startSyncCheck() {
|
1238 |
+
if (isCheckingSync) return;
|
1239 |
+
isCheckingSync = true;
|
1240 |
+
if (syncCheckInterval) clearInterval(syncCheckInterval);
|
1241 |
+
syncCheckInterval = setInterval(checkSync, 1000);
|
1242 |
+
}
|
1243 |
|
1244 |
+
// stopSyncCheck関数を修正
|
1245 |
+
function stopSyncCheck() {
|
1246 |
+
isCheckingSync = false;
|
1247 |
+
if (syncCheckInterval) clearInterval(syncCheckInterval);
|
1248 |
+
}
|
1249 |
|
1250 |
+
// checkSync関数を修正(バックグラウンド時はチェックしない)
|
1251 |
+
function checkSync() {
|
1252 |
+
if (!isAudioCombined || !isPlaying || isBuffering || isInBackgroundTab) return;
|
1253 |
+
|
1254 |
+
const videoTime = video.currentTime;
|
1255 |
+
const audioTime = combinedAudioElement.currentTime;
|
1256 |
+
const drift = videoTime - audioTime;
|
1257 |
+
|
1258 |
+
syncDriftLog.push(drift);
|
1259 |
+
if (syncDriftLog.length > 5) syncDriftLog.shift();
|
1260 |
+
|
1261 |
+
const avgDrift = syncDriftLog.reduce((a, b) => a + b, 0) / syncDriftLog.length;
|
1262 |
+
syncStatusText.textContent = `同期ズレ: ${avgDrift.toFixed(3)}秒`;
|
1263 |
+
|
1264 |
+
if (Math.abs(avgDrift) > 0.1) {
|
1265 |
+
console.log(`同期ズレを修正: ${avgDrift.toFixed(3)}秒`);
|
1266 |
+
syncAudioWithVideo();
|
1267 |
+
}
|
1268 |
+
}
|
|
|
|
|
|
|
|
|
1269 |
|
1270 |
// 音声を動画に同期させる関数
|
1271 |
function syncAudioWithVideo() {
|
|
|
1402 |
enablePlayerControls();
|
1403 |
|
1404 |
previewSection.style.display = 'block';
|
1405 |
+
let isCheckingSync = false;
|
1406 |
+
let isInBackgroundTab = false;
|
1407 |
+
|
1408 |
+
// visibilitychange イベントリスナーの修正
|
1409 |
document.addEventListener('visibilitychange', async () => {
|
1410 |
if (document.hidden) {
|
1411 |
+
// 他タブに移動した場合
|
1412 |
+
isInBackgroundTab = true;
|
1413 |
+
stopSyncCheck(); // 同期チェックを停止
|
1414 |
+
|
1415 |
+
try {
|
1416 |
+
// PiP表示を試みる(再生中のときのみ)
|
1417 |
+
if (!video.paused) {
|
1418 |
+
await enterPiP();
|
1419 |
+
// PiPに成功したら同期チェックを再開
|
1420 |
+
if (document.pictureInPictureElement) {
|
1421 |
+
isInBackgroundTab = false;
|
1422 |
+
startSyncCheck();
|
1423 |
+
}
|
1424 |
+
}
|
1425 |
+
} catch (e) {
|
1426 |
+
console.warn('PiP開始失敗:', e);
|
1427 |
+
// PiP失敗時は何もしない(isInBackgroundTabがtrueのまま)
|
1428 |
+
}
|
1429 |
+
} else {
|
1430 |
+
// タブに戻った場合
|
1431 |
+
isInBackgroundTab = false;
|
1432 |
+
|
1433 |
+
// PiPを終了(再生中のときのみ)
|
1434 |
if (!video.paused) {
|
|
|
|
|
1435 |
try {
|
1436 |
+
await exitPiP();
|
|
|
1437 |
} catch (e) {
|
1438 |
+
console.warn('PiP終了失敗:', e);
|
1439 |
}
|
1440 |
}
|
1441 |
+
|
1442 |
+
// タブに戻った直後に一度だけ同期チェックを実行
|
1443 |
+
if (isPlaying) {
|
1444 |
+
checkSync();
|
1445 |
+
// その後、通常通り同期チェックを再開
|
1446 |
+
startSyncCheck();
|
1447 |
}
|
1448 |
}
|
1449 |
});
|