Files
hz4th_coder 3a6d4fc683 FreeCut 自由剪辑 v1.0.0: 免费开源视频编辑器(Web)
- 多轨道时间线: 视频/图片/音频/文字, 拖拽/修剪/分割/复制/删除
- 12款滤镜特效 + 4种转场 + 4种文字动画
- 6款程序化原创配乐(Web Audio 实时合成, 零版权风险)
- Canvas 合成 + MediaRecorder 实时导出 WebM(VP9+Opus)
- 账号体系 + 每日导出额度 + 企业/AI短剧付费升级 + 管理后台
- 项目自动保存/缩略图, 移动端自适应
- 个人免费每天30次导出, 企业¥299/月 不限量, AI短剧¥499/月 不限量
2026-08-26 17:37:56 +08:00

116 lines
4.9 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>FreeCut 自由剪辑 · 编辑器</title>
<link rel="stylesheet" href="/css/style.css">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>✂️</text></svg>">
</head>
<body>
<div class="editor">
<!-- 顶栏 -->
<div class="ed-top">
<a class="logo" href="/">✂️ FreeCut</a>
<input name="projname" id="projname" value="未命名项目" maxlength="40">
<span id="quota-badge" style="font-size:12px"></span>
<span class="spacer" style="flex:1"></span>
<button class="btn small ghost" id="btn-back">← 返回</button>
<button class="btn small" id="btn-export">⬇ 导出</button>
</div>
<div class="ed-main">
<!-- 素材面板 -->
<div class="ed-left">
<div class="tabs">
<div class="tab active" data-tab="asset-tab">素材</div>
<div class="tab" data-tab="music-tab">配乐</div>
<div class="tab" data-tab="filter-tab">特效</div>
<div class="tab" data-tab="trans-tab">转场</div>
</div>
<div class="body">
<div id="asset-tab" class="tab-body">
<div class="upload-drop" id="upload-drop">📁 点击上传 / 拖入文件<br><small>视频 · 图片 · 音频</small>
<input type="file" id="file-input" multiple accept="video/*,image/*,audio/*">
</div>
<div class="asset-grid" id="asset-grid"></div>
</div>
<div id="music-tab" class="tab-body hidden"><div id="music-list"></div></div>
<div id="filter-tab" class="tab-body hidden"><div id="filter-list"></div></div>
<div id="trans-tab" class="tab-body hidden"><div id="trans-list"></div></div>
</div>
</div>
<!-- 预览区 -->
<div class="ed-center">
<div class="preview-wrap">
<canvas id="preview"></canvas>
<div class="ratio-toggle">
<button data-r="1080x1920" class="active">9:16</button>
<button data-r="1920x1080">16:9</button>
<button data-r="1080x1080">1:1</button>
</div>
</div>
<div class="play-bar">
<button class="btn-play" id="btn-play"></button>
<span class="time"><span id="cur-time">00:00</span> / <span id="tot-time">00:00</span></span>
<input type="range" id="seekbar" min="0" max="1" step="0.001" value="0">
<button class="btn small ghost" id="zoom-out"></button>
<button class="btn small ghost" id="zoom-in"></button>
<button class="btn small ghost" id="btn-split" title="在播放头分割">✂ 分割</button>
<button class="btn small danger" id="btn-del" title="删除选中">🗑</button>
</div>
<!-- 时间线 -->
<div class="timeline">
<div class="tl-head">
<span class="lbl">时间线</span>
<button class="btn small ghost" id="add-text"> 文字</button>
<span class="muted" style="font-size:12px;margin-left:auto">点选片段 · 拖动调整 · 左右端修剪</span>
</div>
<div class="inner tl-inner">
<div class="tl-ruler"></div>
<div class="tl-tracks"></div>
<div class="tl-playhead"></div>
</div>
</div>
</div>
<!-- 属性面板 -->
<div class="ed-right" id="props"></div>
</div>
</div>
<!-- 导出对话框 -->
<div class="modal-mask hidden" id="export-modal">
<div class="modal">
<h3>⬇ 导出视频</h3>
<div class="row"><label>输出分辨率(画布尺寸)</label><div><span id="ex-w"></span> × <span id="ex-h"></span></div></div>
<div class="row"><label>帧率</label>
<select id="ex-fps"><option value="24">24 fps</option><option value="30" selected>30 fps</option><option value="60">60 fps</option></select>
</div>
<div class="row"><label>格式</label><div>WebM(VP9 视频 + 混音音轨)· 浏览器本地编码,无需服务器</div></div>
<div class="row muted" id="ex-info" style="font-size:12px"></div>
<div style="display:flex;gap:10px;justify-content:flex-end">
<button class="btn ghost" id="ex-close">取消</button>
<button class="btn" id="ex-start">开始导出</button>
</div>
</div>
</div>
<!-- 导出进度 -->
<div class="modal-mask hidden" id="export-progress">
<div class="modal" style="max-width:420px">
<h3>🛠 正在导出</h3>
<div class="progress-wrap" style="width:100%;height:14px"><div class="bar" id="ex-progress-bar"></div></div>
<p class="muted" id="ex-progress-text" style="margin-top:12px;font-size:13px"></p>
<p class="muted" style="font-size:12px">导出为实时编码:请保持此页面在前台,渲染期间不要切换标签页。</p>
</div>
</div>
<script src="/js/common.js"></script>
<script src="/js/music.js"></script>
<script src="/js/renderer.js"></script>
<script src="/js/editor.js"></script>
</body>
</html>