Spaces:
Running
Running
Update index.html
Browse files- index.html +40 -26
index.html
CHANGED
@@ -36,11 +36,16 @@
|
|
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">
|
@@ -70,23 +75,31 @@
|
|
70 |
const volumeRange = document.getElementById('volumeRange');
|
71 |
const volumeInput = document.getElementById('volumeInput');
|
72 |
const loopCheckbox = document.getElementById('loopCheckbox');
|
|
|
73 |
|
74 |
-
// Web Audio API
|
75 |
-
let audioContext;
|
76 |
-
let source;
|
77 |
-
let gainNode;
|
|
|
78 |
|
79 |
function setupAudio() {
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
}
|
91 |
|
92 |
function updatePlaybackRate(value) {
|
@@ -101,8 +114,7 @@
|
|
101 |
volumeInput.value = volume;
|
102 |
volumeRange.value = volume;
|
103 |
|
104 |
-
if (gainNode) {
|
105 |
-
// 0-300%を0-3の値に変換 (100% = 1.0)
|
106 |
gainNode.gain.value = volume / 100;
|
107 |
} else {
|
108 |
// Web Audio APIが初期化される前は通常の音量制御を使用
|
@@ -110,6 +122,7 @@
|
|
110 |
}
|
111 |
}
|
112 |
|
|
|
113 |
['input', 'change', 'mouseup'].forEach(eventName => {
|
114 |
speedRange.addEventListener(eventName, () => {
|
115 |
updatePlaybackRate(speedRange.value);
|
@@ -141,22 +154,23 @@
|
|
141 |
}
|
142 |
}
|
143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
video.addEventListener('loadedmetadata', () => {
|
145 |
updatePlaybackRate(speedRange.value);
|
146 |
updateVolume(volumeRange.value);
|
147 |
video.loop = loopCheckbox.checked;
|
148 |
-
|
149 |
-
// Web Audio APIをセットアップ
|
150 |
-
setupAudio();
|
151 |
});
|
152 |
|
153 |
-
//
|
154 |
-
|
155 |
-
document.addEventListener('click', () => {
|
156 |
-
if (audioContext && audioContext.state === 'suspended') {
|
157 |
-
audioContext.resume();
|
158 |
-
}
|
159 |
-
}, { once: true });
|
160 |
</script>
|
161 |
</body>
|
162 |
</html>
|
|
|
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">
|
|
|
75 |
const volumeRange = document.getElementById('volumeRange');
|
76 |
const volumeInput = document.getElementById('volumeInput');
|
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;
|
84 |
+
let audioInitialized = false;
|
85 |
|
86 |
function setupAudio() {
|
87 |
+
try {
|
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) {
|
|
|
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が初期化される前は通常の音量制御を使用
|
|
|
122 |
}
|
123 |
}
|
124 |
|
125 |
+
// イベントリスナーの設定
|
126 |
['input', 'change', 'mouseup'].forEach(eventName => {
|
127 |
speedRange.addEventListener(eventName, () => {
|
128 |
updatePlaybackRate(speedRange.value);
|
|
|
154 |
}
|
155 |
}
|
156 |
|
157 |
+
// 動画再生開始時にAudioContextを初期化
|
158 |
+
video.addEventListener('play', () => {
|
159 |
+
if (!audioInitialized) {
|
160 |
+
setupAudio();
|
161 |
+
} else if (audioContext && audioContext.state === 'suspended') {
|
162 |
+
audioContext.resume();
|
163 |
+
}
|
164 |
+
});
|
165 |
+
|
166 |
video.addEventListener('loadedmetadata', () => {
|
167 |
updatePlaybackRate(speedRange.value);
|
168 |
updateVolume(volumeRange.value);
|
169 |
video.loop = loopCheckbox.checked;
|
|
|
|
|
|
|
170 |
});
|
171 |
|
172 |
+
// ページ読み込み時に警告を表示
|
173 |
+
audioWarning.style.display = 'block';
|
|
|
|
|
|
|
|
|
|
|
174 |
</script>
|
175 |
</body>
|
176 |
</html>
|