soiz1 commited on
Commit
5c26fe6
·
1 Parent(s): 97fff55

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +66 -41
index.html CHANGED
@@ -1233,39 +1233,39 @@ document.addEventListener('DOMContentLoaded', function() {
1233
  }
1234
  });
1235
 
1236
- // 動画と音声の同期をチェックする関数
1237
- function startSyncCheck() {
1238
- if (syncCheckInterval) clearInterval(syncCheckInterval);
1239
- syncCheckInterval = setInterval(checkSync, 1000); // 100msごとにチェック
1240
- }
 
 
1241
 
1242
- function stopSyncCheck() {
1243
- if (syncCheckInterval) clearInterval(syncCheckInterval);
1244
- }
 
 
1245
 
1246
- function checkSync() {
1247
- if (!isAudioCombined || !isPlaying || isBuffering) return;
1248
-
1249
- const videoTime = video.currentTime;
1250
- const audioTime = combinedAudioElement.currentTime;
1251
- const drift = videoTime - audioTime;
1252
-
1253
- // ズレを記録(直近5回分)
1254
- syncDriftLog.push(drift);
1255
- if (syncDriftLog.length > 5) syncDriftLog.shift();
1256
-
1257
- // 平均ズレを計算
1258
- const avgDrift = syncDriftLog.reduce((a, b) => a + b, 0) / syncDriftLog.length;
1259
-
1260
- // ズレ表示を更新
1261
- syncStatusText.textContent = `同期ズレ: ${avgDrift.toFixed(3)}秒`;
1262
-
1263
- // ズレが大きい場合(0.1秒以上)に修正
1264
- if (Math.abs(avgDrift) > 0.1) {
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
- // 他タブに移動 → PiP表示(再生中のときのみ)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1408
  if (!video.paused) {
1409
- enterPiP();
1410
- } else {
1411
  try {
1412
- await video.play();
1413
- enterPiP();
1414
  } catch (e) {
1415
- console.warn('再生エラー:', e);
1416
  }
1417
  }
1418
- } else {
1419
- // タブに戻ったとき → PiP終了(再生中のときのみ)
1420
- if (!video.paused) {
1421
- exitPiP();
 
 
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
  });