FALMOVIE / public /index.html
Logankunfall's picture
Upload 8 files
337ee27 verified
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FAL AI 视频生成器</title>
<link rel="stylesheet" href="style.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<div class="container">
<!-- 头部 -->
<header class="header">
<div class="header-content">
<h1 class="title">
<i class="fas fa-video"></i>
FAL AI 视频生成器
</h1>
<div class="header-controls">
<button id="apiKeyButton" class="api-key-button" title="API 密钥设置">
<i class="fas fa-key"></i>
<span id="apiKeyStatus">未配置</span>
</button>
<button id="themeToggle" class="theme-toggle" title="切换主题">
<i class="fas fa-moon"></i>
</button>
</div>
</div>
</header>
<!-- API Key 设置弹窗 -->
<div id="apiKeyModal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h3><i class="fas fa-key"></i> API 密钥设置</h3>
<button id="closeModal" class="close-button">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<div class="api-key-info">
<p><strong>当前状态:</strong> <span id="modalApiKeyStatus">检查中...</span></p>
<p class="api-key-hint">
<i class="fas fa-info-circle"></i>
请在 <a href="https://fal.ai/dashboard" target="_blank">FAL AI 控制台</a> 获取您的 API 密钥
</p>
<p class="api-key-warning">
<i class="fas fa-shield-alt"></i>
<strong>重要提醒:</strong> "测试连接" 使用免费健康检查端点,不会消耗 API 配额或产生费用
</p>
</div>
<div class="form-group">
<label for="apiKeyInput" class="form-label">
<i class="fas fa-key"></i>
FAL AI API 密钥
</label>
<div class="api-key-input-group">
<input
type="password"
id="apiKeyInput"
class="form-input"
placeholder="输入您的 FAL AI API 密钥"
>
<button id="toggleApiKeyVisibility" class="toggle-visibility" type="button">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
<div class="api-key-options">
<label class="checkbox-label">
<input type="checkbox" id="saveApiKey" checked>
<span class="checkmark"></span>
保存 API 密钥到本地(下次自动使用)
</label>
</div>
<div class="modal-actions">
<button id="saveApiKeyButton" class="save-button">
<i class="fas fa-save"></i>
保存设置
</button>
<button id="testApiKeyButton" class="test-button">
<i class="fas fa-plug"></i>
测试连接
</button>
</div>
</div>
</div>
</div>
<!-- 主要内容 -->
<main class="main">
<!-- 功能选择标签 -->
<div class="tabs">
<button class="tab-button active" data-tab="image-to-video">
<i class="fas fa-image"></i>
图片转视频
</button>
<button class="tab-button" data-tab="text-to-video">
<i class="fas fa-text-width"></i>
文本转视频
</button>
<button class="tab-button" data-tab="video-library">
<i class="fas fa-video"></i>
视频库
</button>
</div>
<!-- 生成队列(生成栏进度) -->
<div id="generationQueue" class="generation-queue">
<div class="queue-header">
<h3><i class="fas fa-tasks"></i> 生成队列</h3>
<span id="queueCount" class="queue-count">0 任务</span>
</div>
<div id="queueList" class="queue-list empty">
<div class="empty-queue">
<i class="fas fa-hourglass-half"></i>
<p>暂无进行中的任务</p>
<p class="upload-hint">点击上方“生成视频”即可开始一个新任务</p>
</div>
</div>
</div>
<!-- 图片转视频面板 -->
<div id="image-to-video" class="tab-content active">
<div class="form-container">
<form id="imageToVideoForm" class="generation-form">
<!-- 图片上传区域 -->
<div class="form-group">
<label class="form-label">
<i class="fas fa-image"></i>
选择图片
</label>
<div class="image-upload-area" id="imageUploadArea">
<div class="upload-placeholder">
<i class="fas fa-cloud-upload-alt"></i>
<p>点击或拖拽上传图片</p>
<p class="upload-hint">支持 JPG, PNG, GIF 格式,最大 50MB</p>
</div>
<input type="file" id="imageFile" accept="image/*" style="display: none;">
<div class="image-preview" id="imagePreview" style="display: none;">
<img id="previewImg" src="" alt="预览图片">
<button type="button" class="remove-image" id="removeImage">
<i class="fas fa-times"></i>
</button>
</div>
</div>
<div class="form-group">
<label class="form-label">或输入图片URL</label>
<input type="url" id="imageUrl" class="form-input" placeholder="https://example.com/image.jpg">
</div>
</div>
<!-- 文本提示 -->
<div class="form-group">
<label for="i2vPrompt" class="form-label">
<i class="fas fa-edit"></i>
文本描述 *
</label>
<textarea
id="i2vPrompt"
class="form-textarea"
placeholder="描述你想要生成的视频内容,例如:白龙战士静静站立,眼中充满决心和力量。摄像机慢慢靠近或围绕战士转动,突出角色的强大存在感和英雄气质。"
required
></textarea>
</div>
<!-- 模型切换(图片转视频) -->
<div class="form-group">
<label for="i2vModel" class="form-label">
<i class="fas fa-brain"></i>
模型选择
</label>
<select id="i2vModel" class="form-select">
<option value="seedance-pro-fast" selected>Seedance 1.0 Pro Fast(Bytedance)</option>
<option value="wan-v2.2-a14b">WAN v2.2-a14b(FAL AI)</option>
</select>
<p class="upload-hint">不同模型支持的参数不同,选择后将自动切换对应设置。</p>
</div>
<!-- 高级设置 -->
<details class="advanced-settings">
<summary>
<i class="fas fa-cog"></i>
高级设置
</summary>
<div class="settings-grid">
<!-- WAN 模型设置(图片转视频) -->
<div id="i2vWanSettings" class="model-settings" style="display: none;">
<div class="form-group">
<label for="i2vNegativePrompt" class="form-label">负面提示</label>
<textarea id="i2vNegativePrompt" class="form-textarea" placeholder="描述不希望出现的内容"></textarea>
</div>
<div class="form-group">
<label for="i2vFrames" class="form-label">帧数 (17-121)</label>
<input type="range" id="i2vFrames" class="form-range" min="17" max="121" value="81">
<span class="range-value" id="i2vFramesValue">81</span>
</div>
<div class="form-group">
<label for="i2vFps" class="form-label">帧率 (4-60)</label>
<input type="range" id="i2vFps" class="form-range" min="4" max="60" value="16">
<span class="range-value" id="i2vFpsValue">16</span>
</div>
<div class="form-group">
<label for="i2vResolution" class="form-label">分辨率</label>
<select id="i2vResolution" class="form-select">
<option value="480p">480p</option>
<option value="580p">580p</option>
<option value="720p" selected>720p</option>
</select>
</div>
<div class="form-group">
<label for="i2vAspectRatio" class="form-label">宽高比</label>
<select id="i2vAspectRatio" class="form-select">
<option value="auto" selected>自动</option>
<option value="16:9">16:9</option>
<option value="9:16">9:16</option>
<option value="1:1">1:1</option>
</select>
</div>
<div class="form-group">
<label for="i2vQuality" class="form-label">视频质量</label>
<select id="i2vQuality" class="form-select">
<option value="low"></option>
<option value="medium"></option>
<option value="high" selected></option>
<option value="maximum">最高</option>
</select>
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="i2vDisableSafety">
<span class="checkmark"></span>
关闭内容审查 (生成更自由的内容)
</label>
</div>
</div>
<!-- Seedance 1.0 Pro Fast 模型设置(图片转视频) -->
<div id="i2vSeedanceSettings" class="model-settings">
<div class="form-group">
<label for="i2vSeedAspectRatio" class="form-label">宽高比</label>
<select id="i2vSeedAspectRatio" class="form-select">
<option value="auto" selected>自动</option>
<option value="16:9">16:9</option>
<option value="21:9">21:9</option>
<option value="4:3">4:3</option>
<option value="1:1">1:1</option>
<option value="3:4">3:4</option>
<option value="9:16">9:16</option>
</select>
</div>
<div class="form-group">
<label for="i2vSeedResolution" class="form-label">分辨率</label>
<select id="i2vSeedResolution" class="form-select">
<option value="480p">480p</option>
<option value="720p">720p</option>
<option value="1080p" selected>1080p</option>
</select>
</div>
<div class="form-group">
<label for="i2vSeedDuration" class="form-label">时长(秒)</label>
<select id="i2vSeedDuration" class="form-select">
<option value="3">3</option>
<option value="4">4</option>
<option value="5" selected>5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="i2vCameraFixed">
<span class="checkmark"></span>
固定相机(camera_fixed)
</label>
</div>
<div class="form-group">
<label for="i2vSeedValue" class="form-label">随机种子(-1 为随机)</label>
<input type="number" id="i2vSeedValue" class="form-input" value="-1" step="1" min="-1" placeholder="-1">
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="i2vEnableSafety" checked>
<span class="checkmark"></span>
启用内容审查(enable_safety_checker)
</label>
<p class="upload-hint">提示:Playground 可能不允许关闭安全审查;通过 API 可配置。</p>
</div>
</div>
</div>
</details>
<!-- 提交按钮 -->
<button type="submit" class="submit-button" id="i2vSubmitButton">
<i class="fas fa-magic"></i>
生成视频
</button>
</form>
</div>
</div>
<!-- 文本转视频面板 -->
<div id="text-to-video" class="tab-content">
<div class="form-container">
<form id="textToVideoForm" class="generation-form">
<!-- 文本提示 -->
<div class="form-group">
<label for="t2vPrompt" class="form-label">
<i class="fas fa-edit"></i>
文本描述 *
</label>
<textarea
id="t2vPrompt"
class="form-textarea"
placeholder="描述你想要生成的视频内容,例如:一只可爱的小猫在花园里玩耍,阳光透过树叶洒下斑驳的光影。"
required
></textarea>
</div>
<!-- 模型切换 -->
<div class="form-group">
<label for="t2vModel" class="form-label">
<i class="fas fa-brain"></i>
模型选择
</label>
<select id="t2vModel" class="form-select">
<option value="seedance-pro-fast" selected>Seedance 1.0 Pro Fast(Bytedance)</option>
<option value="wan-v2.2-a14b">WAN v2.2-a14b(FAL AI)</option>
</select>
<p class="upload-hint">不同模型支持的参数不同,选择后将自动切换对应设置。</p>
</div>
<!-- 高级设置 -->
<details class="advanced-settings">
<summary>
<i class="fas fa-cog"></i>
高级设置
</summary>
<div class="settings-grid">
<!-- WAN 模型设置 -->
<div id="wanSettings" class="model-settings" style="display: none;">
<div class="form-group">
<label for="t2vNegativePrompt" class="form-label">负面提示</label>
<textarea id="t2vNegativePrompt" class="form-textarea" placeholder="描述不希望出现的内容"></textarea>
</div>
<div class="form-group">
<label for="t2vFrames" class="form-label">帧数 (17-121)</label>
<input type="range" id="t2vFrames" class="form-range" min="17" max="121" value="81">
<span class="range-value" id="t2vFramesValue">81</span>
</div>
<div class="form-group">
<label for="t2vFps" class="form-label">帧率 (4-60)</label>
<input type="range" id="t2vFps" class="form-range" min="4" max="60" value="16">
<span class="range-value" id="t2vFpsValue">16</span>
</div>
<div class="form-group">
<label for="t2vResolution" class="form-label">分辨率</label>
<select id="t2vResolution" class="form-select">
<option value="480p">480p</option>
<option value="580p">580p</option>
<option value="720p" selected>720p</option>
</select>
</div>
<div class="form-group">
<label for="t2vAspectRatio" class="form-label">宽高比</label>
<select id="t2vAspectRatio" class="form-select">
<option value="16:9" selected>16:9</option>
<option value="9:16">9:16</option>
<option value="1:1">1:1</option>
</select>
</div>
<div class="form-group">
<label for="t2vQuality" class="form-label">视频质量</label>
<select id="t2vQuality" class="form-select">
<option value="low"></option>
<option value="medium"></option>
<option value="high" selected></option>
<option value="maximum">最高</option>
</select>
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="t2vDisableSafety">
<span class="checkmark"></span>
关闭内容审查 (生成更自由的内容)
</label>
</div>
</div>
<!-- Seedance 1.0 Pro Fast 模型设置 -->
<div id="seedanceSettings" class="model-settings">
<div class="form-group">
<label for="seedAspectRatio" class="form-label">宽高比</label>
<select id="seedAspectRatio" class="form-select">
<option value="16:9" selected>16:9</option>
<option value="21:9">21:9</option>
<option value="4:3">4:3</option>
<option value="1:1">1:1</option>
<option value="3:4">3:4</option>
<option value="9:16">9:16</option>
</select>
</div>
<div class="form-group">
<label for="seedResolution" class="form-label">分辨率</label>
<select id="seedResolution" class="form-select">
<option value="480p">480p</option>
<option value="720p">720p</option>
<option value="1080p" selected>1080p</option>
</select>
</div>
<div class="form-group">
<label for="seedDuration" class="form-label">时长(秒)</label>
<select id="seedDuration" class="form-select">
<option value="3">3</option>
<option value="4">4</option>
<option value="5" selected>5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="t2vCameraFixed">
<span class="checkmark"></span>
固定相机(camera_fixed)
</label>
</div>
<div class="form-group">
<label for="t2vSeed" class="form-label">随机种子(-1 为随机)</label>
<input type="number" id="t2vSeed" class="form-input" value="-1" step="1" min="-1" placeholder="-1">
</div>
<div class="form-group">
<label class="checkbox-label">
<input type="checkbox" id="t2vEnableSafety" checked>
<span class="checkmark"></span>
启用内容审查(enable_safety_checker)
</label>
<p class="upload-hint">提示:部分平台的 Playground 不允许关闭安全审查;API 可配置。</p>
</div>
</div>
</div>
</details>
<!-- 提交按钮 -->
<button type="submit" class="submit-button" id="t2vSubmitButton">
<i class="fas fa-magic"></i>
生成视频
</button>
</form>
</div>
</div>
<!-- 视频库面板 -->
<div id="video-library" class="tab-content">
<div class="form-container">
<div class="video-library-header">
<h3><i class="fas fa-video"></i> 本地视频库</h3>
<div class="library-controls">
<button id="refreshLibrary" class="refresh-button">
<i class="fas fa-sync-alt"></i>
刷新
</button>
<span id="videoCount" class="video-count">共 0 个视频</span>
</div>
</div>
<div id="videoLibraryContent" class="video-library-content">
<div class="loading-library">
<i class="fas fa-spinner fa-spin"></i>
正在加载视频库...
</div>
</div>
</div>
</div>
<!-- 结果显示区域 -->
<div id="resultContainer" class="result-container" style="display: none;">
<div class="result-header">
<h3><i class="fas fa-video"></i> 生成结果</h3>
<button id="clearResult" class="clear-button">
<i class="fas fa-times"></i>
</button>
</div>
<div class="result-content">
<video id="resultVideo" controls class="result-video">
您的浏览器不支持视频播放。
</video>
<div class="result-actions">
<a id="downloadLink" class="download-button" download>
<i class="fas fa-download"></i>
下载视频
</a>
</div>
</div>
</div>
<!-- 加载状态 -->
<div id="loadingContainer" class="loading-container" style="display: none;">
<div class="loading-content">
<div class="loading-spinner"></div>
<h3>正在生成视频...</h3>
<p id="loadingMessage">请稍候,这可能需要几分钟时间</p>
<div class="loading-progress">
<div class="progress-bar">
<div class="progress-fill" id="progressFill"></div>
</div>
</div>
</div>
</div>
</main>
<!-- 底部 -->
<footer class="footer">
<p>&copy; 2024 FAL AI 视频生成器 | 基于 FAL AI 技术</p>
</footer>
</div>
<script src="script.js"></script>
</body>
</html>