soiz1 commited on
Commit
ce84b9c
·
verified ·
1 Parent(s): 28e42ca

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +59 -101
index.html CHANGED
@@ -1,73 +1,3 @@
1
- <!DOCTYPE html>
2
- <html lang="ja">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>動画プレイヤー</title>
6
- <style>
7
- body {
8
- display: flex;
9
- flex-direction: column;
10
- align-items: center;
11
- background-color: #f0f0f0;
12
- font-family: sans-serif;
13
- padding: 20px;
14
- }
15
- video {
16
- max-width: 100%;
17
- height: auto;
18
- margin-bottom: 10px;
19
- }
20
- .controls {
21
- display: flex;
22
- flex-direction: column;
23
- gap: 15px;
24
- width: 100%;
25
- max-width: 500px;
26
- }
27
- .control-group {
28
- display: flex;
29
- align-items: center;
30
- justify-content: space-between;
31
- gap: 10px;
32
- }
33
- input[type="range"] {
34
- flex: 1;
35
- }
36
- input[type="number"] {
37
- width: 60px;
38
- }
39
- #audioWarning {
40
- color: red;
41
- display: none;
42
- }
43
- </style>
44
- </head>
45
- <body>
46
- <h1>動画プレイヤー</h1>
47
- <video id="videoPlayer" src="v.mp4" controls></video>
48
- <p id="audioWarning">音量増幅機能を使用するには、動画を再生してください</p>
49
-
50
- <div class="controls">
51
- <div class="control-group">
52
- <label for="speedRange">再生速度:</label>
53
- <input type="range" id="speedRange" min="0.0001" max="5" step="0.0001" value="1">
54
- <input type="number" id="speedInput" min="0.0001" step="0.0001" value="1">
55
- </div>
56
-
57
- <div class="control-group">
58
- <label for="volumeRange">音量:</label>
59
- <input type="range" id="volumeRange" min="0" max="1000" step="1" value="100">
60
- <input type="number" id="volumeInput" min="0" max="1000" step="1" value="100">%
61
- </div>
62
-
63
- <div class="control-group">
64
- <label for="loopCheckbox">ループ再生:</label>
65
- <input type="checkbox" id="loopCheckbox" checked>
66
- </div>
67
-
68
- <button onclick="goFullscreen()">全画面</button>
69
- </div>
70
-
71
  <script>
72
  const video = document.getElementById('videoPlayer');
73
  const speedRange = document.getElementById('speedRange');
@@ -77,7 +7,6 @@
77
  const loopCheckbox = document.getElementById('loopCheckbox');
78
  const audioWarning = document.getElementById('audioWarning');
79
 
80
- // Web Audio APIの変数
81
  let audioContext = null;
82
  let source = null;
83
  let gainNode = null;
@@ -88,22 +17,28 @@
88
  audioContext = new (window.AudioContext || window.webkitAudioContext)();
89
  source = audioContext.createMediaElementSource(video);
90
  gainNode = audioContext.createGain();
91
-
92
  source.connect(gainNode);
93
  gainNode.connect(audioContext.destination);
94
-
95
  updateVolume(volumeRange.value);
96
  audioInitialized = true;
97
  audioWarning.style.display = 'none';
98
  } catch (e) {
99
- console.error("AudioContextの初期化に失敗しました:", e);
100
- audioWarning.textContent = "音量増幅機能が使用できません: " + e.message;
101
  audioWarning.style.display = 'block';
 
102
  }
103
  }
104
 
105
  function updatePlaybackRate(value) {
106
  const speed = parseFloat(value);
 
 
 
 
 
107
  speedInput.value = speed;
108
  speedRange.value = speed;
109
  video.playbackRate = speed;
@@ -111,18 +46,31 @@
111
 
112
  function updateVolume(value) {
113
  const volume = parseFloat(value);
 
 
 
 
 
114
  volumeInput.value = volume;
115
  volumeRange.value = volume;
116
-
117
  if (audioInitialized && gainNode) {
118
- gainNode.gain.value = volume / 100;
 
 
 
 
 
119
  } else {
120
- // Web Audio APIが初期化される前は通常の音量制御を使用
121
- video.volume = Math.min(volume / 100, 1);
 
 
 
 
122
  }
123
  }
124
 
125
- // イベントリスナーの設定
126
  ['input', 'change', 'mouseup'].forEach(eventName => {
127
  speedRange.addEventListener(eventName, () => {
128
  updatePlaybackRate(speedRange.value);
@@ -145,33 +93,43 @@
145
  });
146
 
147
  function goFullscreen() {
148
- if (video.requestFullscreen) {
149
- video.requestFullscreen();
150
- } else if (video.webkitRequestFullscreen) {
151
- video.webkitRequestFullscreen();
152
- } else if (video.msRequestFullscreen) {
153
- video.msRequestFullscreen();
 
 
 
 
 
 
154
  }
155
  }
156
 
157
- video.addEventListener('play', () => {
158
- // AudioContextがまだ初期化されていなければ初期化
159
- if (!audioInitialized) {
160
- setupAudio();
161
- } else if (audioContext && audioContext.state === 'suspended') {
162
- audioContext.resume();
163
- }
164
- });
165
-
 
166
 
167
  video.addEventListener('loadedmetadata', () => {
168
- updatePlaybackRate(speedRange.value);
169
- updateVolume(volumeRange.value);
170
- video.loop = loopCheckbox.checked;
 
 
 
 
171
  });
172
 
173
- // ページ読み込み時に警告を表示
174
  audioWarning.style.display = 'block';
 
175
  </script>
176
- </body>
177
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <script>
2
  const video = document.getElementById('videoPlayer');
3
  const speedRange = document.getElementById('speedRange');
 
7
  const loopCheckbox = document.getElementById('loopCheckbox');
8
  const audioWarning = document.getElementById('audioWarning');
9
 
 
10
  let audioContext = null;
11
  let source = null;
12
  let gainNode = null;
 
17
  audioContext = new (window.AudioContext || window.webkitAudioContext)();
18
  source = audioContext.createMediaElementSource(video);
19
  gainNode = audioContext.createGain();
20
+
21
  source.connect(gainNode);
22
  gainNode.connect(audioContext.destination);
23
+
24
  updateVolume(volumeRange.value);
25
  audioInitialized = true;
26
  audioWarning.style.display = 'none';
27
  } catch (e) {
28
+ const msg = "音量増幅機能が使用できません: " + e.message;
29
+ audioWarning.textContent = msg;
30
  audioWarning.style.display = 'block';
31
+ alert(msg);
32
  }
33
  }
34
 
35
  function updatePlaybackRate(value) {
36
  const speed = parseFloat(value);
37
+ if (isNaN(speed) || speed <= 0) {
38
+ const msg = "再生速度が不正です: " + value;
39
+ alert(msg);
40
+ return;
41
+ }
42
  speedInput.value = speed;
43
  speedRange.value = speed;
44
  video.playbackRate = speed;
 
46
 
47
  function updateVolume(value) {
48
  const volume = parseFloat(value);
49
+ if (isNaN(volume) || volume < 0) {
50
+ const msg = "音量の値が不正です: " + value;
51
+ alert(msg);
52
+ return;
53
+ }
54
  volumeInput.value = volume;
55
  volumeRange.value = volume;
56
+
57
  if (audioInitialized && gainNode) {
58
+ try {
59
+ gainNode.gain.value = volume / 100;
60
+ } catch (e) {
61
+ const msg = "音量設定中にエラーが発生しました: " + e.message;
62
+ alert(msg);
63
+ }
64
  } else {
65
+ try {
66
+ video.volume = Math.min(volume / 100, 1);
67
+ } catch (e) {
68
+ const msg = "標準音量設定に失敗しました: " + e.message;
69
+ alert(msg);
70
+ }
71
  }
72
  }
73
 
 
74
  ['input', 'change', 'mouseup'].forEach(eventName => {
75
  speedRange.addEventListener(eventName, () => {
76
  updatePlaybackRate(speedRange.value);
 
93
  });
94
 
95
  function goFullscreen() {
96
+ try {
97
+ if (video.requestFullscreen) {
98
+ video.requestFullscreen();
99
+ } else if (video.webkitRequestFullscreen) {
100
+ video.webkitRequestFullscreen();
101
+ } else if (video.msRequestFullscreen) {
102
+ video.msRequestFullscreen();
103
+ } else {
104
+ alert("全画面表示はこのブラウザではサポートされていません。");
105
+ }
106
+ } catch (e) {
107
+ alert("全画面モードに失敗しました: " + e.message);
108
  }
109
  }
110
 
111
+ video.addEventListener('play', () => {
112
+ if (!audioInitialized) {
113
+ setupAudio();
114
+ } else if (audioContext && audioContext.state === 'suspended') {
115
+ audioContext.resume().catch(e => {
116
+ const msg = "AudioContextの再開に失敗しました: " + e.message;
117
+ alert(msg);
118
+ });
119
+ }
120
+ });
121
 
122
  video.addEventListener('loadedmetadata', () => {
123
+ try {
124
+ updatePlaybackRate(speedRange.value);
125
+ updateVolume(volumeRange.value);
126
+ video.loop = loopCheckbox.checked;
127
+ } catch (e) {
128
+ alert("動画のメタデータ読み込み処理でエラーが発生しました: " + e.message);
129
+ }
130
  });
131
 
132
+ // 初期警告表示
133
  audioWarning.style.display = 'block';
134
+ alert("音量増幅機能を使用するには、動画を再生してください");
135
  </script>