Spaces:
Running
Running
Update index.html
Browse files- index.html +42 -31
index.html
CHANGED
@@ -692,7 +692,7 @@
|
|
692 |
<div class="video-placeholder" id="videoPlaceholder" style="display: none;">
|
693 |
音声/字幕のみモード
|
694 |
</div>
|
695 |
-
<video id="videoPlayer" src="v.mp4">
|
696 |
<track id="subtitleTrackElement" kind="subtitles" src="v.vtt" srclang="ja" label="日本語" default>
|
697 |
</track>
|
698 |
</video>
|
@@ -783,44 +783,55 @@
|
|
783 |
}
|
784 |
|
785 |
// プレビュー画像を生成
|
786 |
-
|
787 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
788 |
|
789 |
try {
|
790 |
-
|
791 |
-
|
|
|
|
|
|
|
792 |
|
793 |
-
//
|
794 |
-
|
795 |
|
796 |
-
|
797 |
-
video.currentTime = time;
|
798 |
-
|
799 |
-
// フレームが更新されるのを待つ
|
800 |
-
video.addEventListener('seeked', function onSeeked() {
|
801 |
-
video.removeEventListener('seeked', onSeeked);
|
802 |
-
|
803 |
-
// キャンバスにフレームを描画
|
804 |
-
const ctx = canvas.getContext('2d');
|
805 |
-
canvas.width = video.videoWidth;
|
806 |
-
canvas.height = video.videoHeight;
|
807 |
-
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
808 |
-
|
809 |
-
// プレビュー用に縮小
|
810 |
-
previewContext.drawImage(canvas, 0, 0, previewCanvas.width, previewCanvas.height);
|
811 |
-
|
812 |
// プレビューフレームに表示
|
813 |
previewFrame.style.backgroundImage = `url(${previewCanvas.toDataURL()})`;
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
}
|
819 |
} catch (e) {
|
820 |
-
console.error('
|
821 |
-
isGeneratingPreview = false;
|
822 |
}
|
823 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
824 |
|
825 |
// プレビューツールチップを表示
|
826 |
function showPreviewTooltip(e) {
|
|
|
692 |
<div class="video-placeholder" id="videoPlaceholder" style="display: none;">
|
693 |
音声/字幕のみモード
|
694 |
</div>
|
695 |
+
<video id="videoPlayer" src="v.mp4" crossorigin="anonymous">
|
696 |
<track id="subtitleTrackElement" kind="subtitles" src="v.vtt" srclang="ja" label="日本語" default>
|
697 |
</track>
|
698 |
</video>
|
|
|
783 |
}
|
784 |
|
785 |
// プレビュー画像を生成
|
786 |
+
// プレビュー画像を生成
|
787 |
+
function generatePreview(time) {
|
788 |
+
if (isGeneratingPreview) return;
|
789 |
+
|
790 |
+
try {
|
791 |
+
isGeneratingPreview = true;
|
792 |
+
createPreviewCanvas();
|
793 |
+
|
794 |
+
// 動画の現在の時間を保存
|
795 |
+
const currentTime = video.currentTime;
|
796 |
+
|
797 |
+
// 指定された時間にシーク
|
798 |
+
video.currentTime = time;
|
799 |
+
|
800 |
+
// フレームが更新されるのを待つ
|
801 |
+
video.addEventListener('seeked', function onSeeked() {
|
802 |
+
video.removeEventListener('seeked', onSeeked);
|
803 |
|
804 |
try {
|
805 |
+
// キャンバスにフレームを描画
|
806 |
+
const ctx = canvas.getContext('2d');
|
807 |
+
canvas.width = video.videoWidth;
|
808 |
+
canvas.height = video.videoHeight;
|
809 |
+
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
810 |
|
811 |
+
// プレビュー用に縮小
|
812 |
+
previewContext.drawImage(canvas, 0, 0, previewCanvas.width, previewCanvas.height);
|
813 |
|
814 |
+
try {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
815 |
// プレビューフレームに表示
|
816 |
previewFrame.style.backgroundImage = `url(${previewCanvas.toDataURL()})`;
|
817 |
+
} catch (e) {
|
818 |
+
console.error('Canvas export error:', e);
|
819 |
+
// エラー時の代替処理(単色背景など)
|
820 |
+
previewFrame.style.backgroundImage = 'linear-gradient(to bottom, #0066ff, #00aaff)';
|
821 |
+
}
|
822 |
} catch (e) {
|
823 |
+
console.error('Canvas drawing error:', e);
|
|
|
824 |
}
|
825 |
+
|
826 |
+
// 元の時間に戻す
|
827 |
+
video.currentTime = currentTime;
|
828 |
+
isGeneratingPreview = false;
|
829 |
+
});
|
830 |
+
} catch (e) {
|
831 |
+
console.error('Preview generation error:', e);
|
832 |
+
isGeneratingPreview = false;
|
833 |
+
}
|
834 |
+
}
|
835 |
|
836 |
// プレビューツールチップを表示
|
837 |
function showPreviewTooltip(e) {
|