Spaces:
Running
Running
Update index.html
Browse files- index.html +14 -95
index.html
CHANGED
@@ -36,16 +36,11 @@
|
|
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">
|
@@ -56,8 +51,8 @@
|
|
56 |
|
57 |
<div class="control-group">
|
58 |
<label for="volumeRange">音量:</label>
|
59 |
-
<input type="range" id="volumeRange" min="0" max="
|
60 |
-
<input type="number" id="volumeInput" min="0" max="
|
61 |
</div>
|
62 |
|
63 |
<div class="control-group">
|
@@ -67,6 +62,7 @@
|
|
67 |
|
68 |
<button onclick="goFullscreen()">全画面</button>
|
69 |
</div>
|
|
|
70 |
<script>
|
71 |
const video = document.getElementById('videoPlayer');
|
72 |
const speedRange = document.getElementById('speedRange');
|
@@ -74,40 +70,9 @@
|
|
74 |
const volumeRange = document.getElementById('volumeRange');
|
75 |
const volumeInput = document.getElementById('volumeInput');
|
76 |
const loopCheckbox = document.getElementById('loopCheckbox');
|
77 |
-
const audioWarning = document.getElementById('audioWarning');
|
78 |
-
|
79 |
-
let audioContext = null;
|
80 |
-
let source = null;
|
81 |
-
let gainNode = null;
|
82 |
-
let audioInitialized = false;
|
83 |
-
|
84 |
-
function setupAudio() {
|
85 |
-
try {
|
86 |
-
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
87 |
-
source = audioContext.createMediaElementSource(video);
|
88 |
-
gainNode = audioContext.createGain();
|
89 |
-
|
90 |
-
source.connect(gainNode);
|
91 |
-
gainNode.connect(audioContext.destination);
|
92 |
-
|
93 |
-
updateVolume(volumeRange.value);
|
94 |
-
audioInitialized = true;
|
95 |
-
audioWarning.style.display = 'none';
|
96 |
-
} catch (e) {
|
97 |
-
const msg = "音量増幅機能が使用できません: " + e.message;
|
98 |
-
audioWarning.textContent = msg;
|
99 |
-
audioWarning.style.display = 'block';
|
100 |
-
alert(msg);
|
101 |
-
}
|
102 |
-
}
|
103 |
|
104 |
function updatePlaybackRate(value) {
|
105 |
const speed = parseFloat(value);
|
106 |
-
if (isNaN(speed) || speed <= 0) {
|
107 |
-
const msg = "再生速度が不正です: " + value;
|
108 |
-
alert(msg);
|
109 |
-
return;
|
110 |
-
}
|
111 |
speedInput.value = speed;
|
112 |
speedRange.value = speed;
|
113 |
video.playbackRate = speed;
|
@@ -115,29 +80,9 @@
|
|
115 |
|
116 |
function updateVolume(value) {
|
117 |
const volume = parseFloat(value);
|
118 |
-
if (isNaN(volume) || volume < 0) {
|
119 |
-
const msg = "音量の値が不正です: " + value;
|
120 |
-
alert(msg);
|
121 |
-
return;
|
122 |
-
}
|
123 |
volumeInput.value = volume;
|
124 |
volumeRange.value = volume;
|
125 |
-
|
126 |
-
if (audioInitialized && gainNode) {
|
127 |
-
try {
|
128 |
-
gainNode.gain.value = volume / 100;
|
129 |
-
} catch (e) {
|
130 |
-
const msg = "音量設定中にエラーが発生しました: " + e.message;
|
131 |
-
alert(msg);
|
132 |
-
}
|
133 |
-
} else {
|
134 |
-
try {
|
135 |
-
video.volume = Math.min(volume / 100, 1);
|
136 |
-
} catch (e) {
|
137 |
-
const msg = "標準音量設定に失敗しました: " + e.message;
|
138 |
-
alert(msg);
|
139 |
-
}
|
140 |
-
}
|
141 |
}
|
142 |
|
143 |
['input', 'change', 'mouseup'].forEach(eventName => {
|
@@ -162,46 +107,20 @@
|
|
162 |
});
|
163 |
|
164 |
function goFullscreen() {
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
video.msRequestFullscreen();
|
172 |
-
} else {
|
173 |
-
alert("全画面表示はこのブラウザではサポートされていません。");
|
174 |
-
}
|
175 |
-
} catch (e) {
|
176 |
-
alert("全画面モードに失敗しました: " + e.message);
|
177 |
}
|
178 |
}
|
179 |
|
180 |
-
video.addEventListener('play', () => {
|
181 |
-
if (!audioInitialized) {
|
182 |
-
setupAudio();
|
183 |
-
} else if (audioContext && audioContext.state === 'suspended') {
|
184 |
-
audioContext.resume().catch(e => {
|
185 |
-
const msg = "AudioContextの再開に失敗しました: " + e.message;
|
186 |
-
alert(msg);
|
187 |
-
});
|
188 |
-
}
|
189 |
-
});
|
190 |
-
|
191 |
video.addEventListener('loadedmetadata', () => {
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
video.loop = loopCheckbox.checked;
|
196 |
-
} catch (e) {
|
197 |
-
alert("動画のメタデータ読み込み処理でエラーが発生しました: " + e.message);
|
198 |
-
}
|
199 |
});
|
200 |
-
|
201 |
-
// 初期警告表示
|
202 |
-
audioWarning.style.display = 'block';
|
203 |
-
alert("音量増幅機能を使用するには、動画を再生してください");
|
204 |
</script>
|
205 |
-
|
206 |
</body>
|
207 |
-
</html>
|
|
|
36 |
input[type="number"] {
|
37 |
width: 60px;
|
38 |
}
|
|
|
|
|
|
|
|
|
39 |
</style>
|
40 |
</head>
|
41 |
<body>
|
42 |
<h1>動画プレイヤー</h1>
|
43 |
<video id="videoPlayer" src="v.mp4" controls></video>
|
|
|
44 |
|
45 |
<div class="controls">
|
46 |
<div class="control-group">
|
|
|
51 |
|
52 |
<div class="control-group">
|
53 |
<label for="volumeRange">音量:</label>
|
54 |
+
<input type="range" id="volumeRange" min="0" max="1" step="0.01" value="1">
|
55 |
+
<input type="number" id="volumeInput" min="0" max="1" step="0.01" value="1">
|
56 |
</div>
|
57 |
|
58 |
<div class="control-group">
|
|
|
62 |
|
63 |
<button onclick="goFullscreen()">全画面</button>
|
64 |
</div>
|
65 |
+
|
66 |
<script>
|
67 |
const video = document.getElementById('videoPlayer');
|
68 |
const speedRange = document.getElementById('speedRange');
|
|
|
70 |
const volumeRange = document.getElementById('volumeRange');
|
71 |
const volumeInput = document.getElementById('volumeInput');
|
72 |
const loopCheckbox = document.getElementById('loopCheckbox');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
function updatePlaybackRate(value) {
|
75 |
const speed = parseFloat(value);
|
|
|
|
|
|
|
|
|
|
|
76 |
speedInput.value = speed;
|
77 |
speedRange.value = speed;
|
78 |
video.playbackRate = speed;
|
|
|
80 |
|
81 |
function updateVolume(value) {
|
82 |
const volume = parseFloat(value);
|
|
|
|
|
|
|
|
|
|
|
83 |
volumeInput.value = volume;
|
84 |
volumeRange.value = volume;
|
85 |
+
video.volume = volume;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
}
|
87 |
|
88 |
['input', 'change', 'mouseup'].forEach(eventName => {
|
|
|
107 |
});
|
108 |
|
109 |
function goFullscreen() {
|
110 |
+
if (video.requestFullscreen) {
|
111 |
+
video.requestFullscreen();
|
112 |
+
} else if (video.webkitRequestFullscreen) {
|
113 |
+
video.webkitRequestFullscreen();
|
114 |
+
} else if (video.msRequestFullscreen) {
|
115 |
+
video.msRequestFullscreen();
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
}
|
117 |
}
|
118 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
video.addEventListener('loadedmetadata', () => {
|
120 |
+
updatePlaybackRate(speedRange.value);
|
121 |
+
updateVolume(volumeRange.value);
|
122 |
+
video.loop = loopCheckbox.checked;
|
|
|
|
|
|
|
|
|
123 |
});
|
|
|
|
|
|
|
|
|
124 |
</script>
|
|
|
125 |
</body>
|
126 |
+
</html>
|