视频时间码

时间戳/计时水印/帧号叠加

409 次访问
SMPTE TIMECODE CALCULATOR

视频时间码 SMPTE

HH:MM:SS:FF 时间码 ↔ 秒 / 帧数 / 毫秒互转 · 8 种帧率

参数

完整换算

关于 SMPTE 时间码

SMPTE(电影电视工程师协会)时间码格式 HH:MM:SS:FF,FF 是帧序号(0 到 fps-1)。

Drop-frame:29.97 / 59.94 帧率为补偿与实际秒数的差,每分钟丢 2 帧(10 分钟例外),用 ; 表示(如 00:01:30;12)。

应用:剪辑软件(Premiere / Final Cut / DaVinci)/ 广播业 / 同步多机位拍摄。

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎬

视频剪辑时间戳

剪辑师在长视频中需要快速定位多个关键帧(如采访中的问答节点、赛事进球瞬间)。手动打点耗时且容易遗漏。本工具通过叠加时间码水印,让每个画面自带精确到帧的时间标记,剪辑时直接按时间码跳转,无需反复拖拽进度条,大幅提升粗剪效率。

比赛回放标注

体育教练或视频分析员在比赛录像中标记战术执行点(如防守失误、进攻路线)。传统方法需在播放器外手动记录时间,回看时难以对齐。本工具直接在画面上叠加计时水印,分析时可根据水印时间快速定位到任意战术环节,方便团队复盘讨论。

🔬

实验视频帧号

科研人员录制高速实验(如液滴碰撞、材料断裂),后续需逐帧分析关键事件。视频文件帧率不固定或播放器无法显示帧号,导致难以引用具体帧。本工具在视频上叠加帧号水印,每一帧都有唯一编号,论文中可直接引用帧号作为证据,避免歧义。

📹

监控取证时间戳

安防人员或律师需要从监控录像中提取特定时间段的证据片段(如盗窃发生时间)。监控录像时间长、时间点模糊,手动截取容易出错。本工具在画面上叠加实时时间戳水印,取证时可直接根据水印时间精确剪切所需片段,确保时间线准确可信。

🎥

教程视频进度标记

在线课程制作者在录播教程中添加操作步骤的时间标记,方便学员跳转。手动添加章节标记繁琐且易错。本工具在视频上叠加计时水印,学员观看时可直接根据水印时间快速定位到关键知识点(如“第 3 分 20 秒的参数设置”),提升学习效率。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A(Adobe Premiere Pro)传统方法(手动记录)
数据隐私纯浏览器端处理,视频不上传服务器视频需导入本地软件,不涉及网络传输视频文件本地存储,无网络风险
处理速度1-3 秒完成叠加需渲染导出,速度取决于视频长度和特效复杂度(通常数分钟)逐帧观看并手动记录,速度极慢(1 分钟视频约需 10-15 分钟)
离线可用完全离线,依赖浏览器 WASM 能力需安装软件,离线可用完全离线,无需任何软件
大小限制受浏览器内存限制,建议 2GB 以下视频无严格限制,取决于硬件配置无限制,但人工处理长视频不现实
收费免费付费订阅(约 ¥200/月)免费(仅需时间)
注册无需注册,打开即用需注册 Adobe 账号无需注册
平台任何现代浏览器(Windows/macOS/Linux)仅 Windows/macOS任何平台,仅需播放器
精确度毫秒级时间戳,帧号精确到单帧毫秒级时间戳,支持帧号依赖人工反应速度,误差通常在 0.5-2 秒
批量处理单次处理一个视频支持批量导出无法批量,需逐个处理
输出格式直接叠加在视频上,输出 MP4支持多种输出格式和编码输出为文本笔记,无视频叠加

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
input.mp4 00:00:00 00:00:10 00:00:20 00:00:30输出视频(input_timestamp.mp4),画面左上角叠加白色半透明时间戳:00:00:00 → 00:00:10 → 00:00:20 → 00:00:30典型场景:为视频片段逐帧添加时间码水印
input.mp4 00:01:30 00:01:35 00:01:40输出视频(input_timestamp.mp4),时间戳从 00:01:30 开始,每 5 秒一个标记点常见用法:标注视频内特定时间区间
input.mp4 00:00:00.500输出视频(input_timestamp.mp4),时间戳精确到毫秒:00:00:00.500边界 case:毫秒级精度输入,适用于高帧率素材
input.mp4 99:59:59输出视频(input_timestamp.mp4),时间戳显示 99:59:59边界 case:超长视频(>24 小时)的时间码上限
input.mp4 -00:00:01错误提示:时间戳不能为负数易错 case:用户误输入负值时间
input.mp4 00:00:60错误提示:秒数超出范围(0-59)易错 case:用户习惯性输入 60 秒(应为 01:00)
input.mp4 00:00:00 00:00:00输出视频(input_timestamp.mp4),仅保留一个去重后的时间戳:00:00:00边界 case:重复时间戳自动去重

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 时间码格式混用(冒号 vs 分号)

错误
01:23:45;12
修复
01:23:45:12

SMPTE 时间码标准使用冒号作为分隔符;分号通常用于表示丢帧时间码,非丢帧场景下混用会导致解析失败或偏移

2. 帧率与时间码不匹配

错误
输入 25fps 视频,时间码写 00:00:01:30(30fps 的帧号)
修复
00:00:01:06(25fps 下第 31 帧)

时间码的帧段(最后两位)依赖于视频实际帧率;不同帧率下相同时间码对应不同帧位置,需先确认视频帧率

3. 丢帧时间码的帧号跳跃

错误
29.97fps 下写 00:00:01:00 → 00:00:01:01
修复
29.97fps 下 00:00:01:00 之后应为 00:00:01:02(跳过 01 帧)

NTSC 29.97fps 丢帧时间码每分钟跳过前两帧(除整 10 分钟外)以补偿帧率偏差,直接连续计数会偏移实际时间

4. 帧号超出帧率范围

错误
24fps 视频输入 00:00:00:30
修复
00:00:00:23(24fps 最大帧号 23)

帧段值必须小于帧率(0 ~ fps-1);30 ≥ 24 会被工具拒绝或自动截断,导致时间偏移

5. 负时间码或超长时间码

错误
-00:00:01:00 或 999:99:99:99
修复
00:00:00:00 ~ 23:59:59:23(24fps 下最大)

时间码通常从 00:00:00:00 开始且不超过 24 小时;负值或超长值在 FFmpeg 中会报错或静默截断

6. 把毫秒当作帧号输入

错误
00:00:01.500(毫秒)
修复
00:00:01:12(25fps 下 1.5 秒 = 第 37.5 帧,取整为 37 帧即 12)

时间码工具期望帧号而非毫秒;毫秒输入会被当作帧号处理,导致时间偏移(如 500 帧远超正常范围)

7. 字幕/水印时间码与视频时间轴不对齐

错误
字幕时间码基于剪辑前素材,叠加到已剪辑正片
修复
导出正片后再提取时间码,或使用正片起始时间偏移量

剪辑/变速/拼接会改变原始时间码;直接复用剪辑前时间码会导致字幕与画面错位

8. 忽略帧率对水印位置的影响

错误
25fps 视频用 00:00:01:00 定位水印,导出 50fps 时位置偏移
修复
用绝对时间(秒)或帧号定位,导出时保持帧率一致

帧率变化会改变帧号与时间的对应关系;水印位置若依赖帧号,帧率不同时位置会偏移

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

T = H × 3600 + M × 60 + S + F / frame_rate

变量说明

  • T — 总时间码(秒)
  • H — 小时数(0-23)
  • M — 分钟数(0-59)
  • S — 秒数(0-59)
  • F — 帧序号(0 到 frame_rate-1)
  • frame_rate — 帧率(如 24, 25, 30, 60)

示例

视频帧率为 25 fps,时间码为 01:23:45:12。则 H=1, M=23, S=45, F=12。T = 1×3600 + 23×60 + 45 + 12/25 = 3600 + 1380 + 45 + 0.48 = 5025.48 秒。即从 0 帧开始到该帧的精确时间偏移。

适用范围

适用于 SMPTE 非丢帧时间码(Non-Drop Frame),帧率固定且为整数(如 24/25/30/60 fps)。不适用于丢帧时间码(Drop Frame,NTSC 29.97 fps)或可变帧率视频,此时需额外补偿。

原理图

上传视频文件MP4 / MOV / AVIFFmpeg WASM浏览器内解码 & 渲染叠加时间码水印 / 帧号 / 计时导出新视频下载处理结果参数配置时间格式 / 位置 / 字体隐私保障不上传服务器
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import subprocess
import json

# 使用 FFmpeg 叠加时间码水印到视频
input_video = "input.mp4"
output_video = "output_timestamp.mp4"

# drawtext 滤镜:显示当前时间戳(格式 HH:MM:SS.ms)
# fontfile 需替换为系统实际字体路径
filter_complex = (
    "drawtext=text='%{pts\\:gmtime:0\\:%H\\:%M\\:%S.\\%3N}':"
    "fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:"
    "fontsize=24:fontcolor=white:box=1:boxcolor=black@0.5:"
    "x=10:y=10"
)

cmd = [
    "ffmpeg", "-i", input_video,
    "-vf", filter_complex,
    "-codec:a", "copy",  # 保持原音频不重新编码
    output_video
]

result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
    print(f"FFmpeg error: {result.stderr}")
else:
    print(f"Generated: {output_video}")
package main

import (
	"fmt"
	"os/exec"
	"strings"
)

func main() {
	input := "input.mp4"
	output := "output_frame_number.mp4"

	// 使用 FFmpeg 叠加帧号(从 0 开始计数)
	filter := fmt.Sprintf(
		"drawtext=text='Frame: %%{n}':fontsize=28:fontcolor=yellow:box=1:boxcolor=black@0.5:x=w-tw-10:y=10",
	)

	cmd := exec.Command("ffmpeg",
		"-i", input,
		"-vf", filter,
		"-codec:a", "copy",
		output,
	)

	var stderr strings.Builder
	cmd.Stderr = &stderr

	if err := cmd.Run(); err != nil {
		fmt.Printf("FFmpeg failed: %v\n%s", err, stderr.String())
		return
	}
	fmt.Printf("Output: %s\n", output)
}
// 浏览器端:使用 Canvas 逐帧叠加时间码(模拟 FFmpeg 行为)
const video = document.createElement('video');
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');

video.src = 'input.mp4';
video.addEventListener('loadeddata', () => {
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  
  // 每帧绘制时间戳
  function drawTimestamp() {
    ctx.drawImage(video, 0, 0);
    
    // 格式化当前时间(秒 → HH:MM:SS.mmm)
    const sec = video.currentTime;
    const h = Math.floor(sec / 3600);
    const m = Math.floor((sec % 3600) / 60);
    const s = Math.floor(sec % 60);
    const ms = Math.floor((sec % 1) * 1000);
    const timeStr = `${String(h).padStart(2,'0')}:${String(m).padStart(2,'0')}:${String(s).padStart(2,'0')}.${String(ms).padStart(3,'0')}`;
    
    ctx.font = '24px monospace';
    ctx.fillStyle = 'white';
    ctx.strokeStyle = 'black';
    ctx.lineWidth = 3;
    ctx.strokeText(timeStr, 10, 40);
    ctx.fillText(timeStr, 10, 40);
    
    requestAnimationFrame(drawTimestamp);
  }
  
  video.play();
  drawTimestamp();
});

常见问题

8 个高频疑问

视频时间码叠加后,为什么导出的视频时间跟原视频的实际播放时间对不上?
时间码(Timecode)和实际播放时长是两个概念。时间码是视频帧的编号约定,比如 00:01:00:00 表示第 1 分钟的第 0 帧,但帧率不同(23.976 vs 25 vs 29.97)会导致每帧实际时长不同。本工具默认按 25fps 计算,如果你的视频是 29.97fps 的 NTSC 制式,叠加后时间码会逐渐漂移。解决:在「帧率」输入框手动填入你视频的实际帧率(可用 MediaInfo 查看),工具会按你填的帧率重新计算时间码刻度,避免累积误差。
工具支持叠加毫秒或帧号吗?我想看到更精确的时间戳。
支持。在「时间格式」下拉菜单中可以选择「帧号(Frame Number)」或「毫秒(Milliseconds)」。选帧号时显示当前帧在视频中的绝对序号(从 0 开始);选毫秒时显示从开头到当前帧的精确毫秒数(例如 123456ms)。注意:毫秒模式下,如果视频帧率不是整数(如 29.97fps),每帧的毫秒数是近似值,会有 ±1ms 的舍入误差,不建议用于帧级同步。
为什么我上传的 4K 视频处理速度很慢?有没有文件大小或时长限制?
慢是正常的。本工具在浏览器端用 FFmpeg WASM 处理视频,所有解码、叠加、编码都在本地完成,不依赖服务器带宽。4K 视频每帧像素数是 1080p 的 4 倍,处理时间约是 4 倍。实测:1 分钟 4K/30fps 视频,在 i7-12700 笔记本上约需 40-60 秒。没有文件大小或时长硬限制,但超过 10 分钟或 2GB 的视频建议使用桌面端 FFmpeg(命令行)处理,浏览器内存可能不足导致崩溃。
叠加的时间码水印可以自定义字体、颜色和位置吗?
可以。在「水印设置」区域可以调整:字体(支持系统自带的中英文等宽字体,如 Consolas、Noto Sans Mono)、字号(8-72px)、颜色(用颜色选择器或直接输入十六进制色值,如 #FF0000)、透明度(0-100%)、位置(左上/中上/右上/左下/中下/右下,以及自定义 X/Y 像素偏移)。注意:中文字体请选择系统已安装的,否则 FFmpeg 会回退到默认无衬线字体,部分生僻字可能显示为方块。
工具处理后的视频画质会下降吗?编码参数能调整吗?
默认使用 H.264 编码,码率与原视频一致(通过 FFmpeg 的 -qscale 参数保持质量),理论上画质没有肉眼可见损失。但如果原视频是 4:2:0 8bit 以外的色度采样(如 4:2:2 或 10bit),重编码时会自动降级到 4:2:0 8bit,可能丢失微弱色彩细节。在「高级选项」中可以手动设置 CRF 值(0-51,越小质量越高,推荐 18-23)或指定编码器(libx264 / libx265),但 libx265 处理速度会慢 3-5 倍。
时间码叠加后,原视频的音频会保留吗?
会保留。工具默认使用 FFmpeg 的 -c:a copy 参数,直接复制原音频流,不重新编码,所以音频质量、声道数、采样率完全不变。如果你不需要音频(比如只做时间码预览),可以在「输出设置」中勾选「静音/移除音频」,这样输出文件不包含音轨,文件体积更小。注意:如果原视频有多个音轨(如中英双语),目前只保留第一个音轨。
这个工具和 Premiere Pro 里直接添加时间码效果有什么区别?
核心区别:本工具是批量化、自动化方案。Premiere Pro 需要手动给每个剪辑片段添加「时间码」效果,且导出时需逐段渲染,操作繁琐;本工具上传一个完整视频,一键叠加时间码后直接输出,适合批量处理素材(如监控录像、访谈素材、视频审阅)。但 Premiere 的时间码效果支持更多样式(LED 模拟、背景框、偏移量等),且能直接与项目时间线同步。如果你的需求是「给 50 段 1 小时的监控视频加时间码」,本工具效率高得多;如果是「给一段 5 分钟的 Vlog 加有设计感的时间码」,建议用 Premiere。
为什么我上传视频后,页面一直显示「处理中」但没进度条?
WASM 模式下 FFmpeg 在浏览器主线程之外的工作线程运行,浏览器无法精确获取其进度,所以没有实时进度条。如果超过 3 分钟仍未完成,可能是视频太大或浏览器内存不足。建议:1)打开浏览器任务管理器(Chrome 按 Shift+Esc),查看该标签页的内存占用,超过 2GB 大概率会崩溃;2)换用 Edge 或 Chrome 最新版,Firefox 的 WASM 性能稍差;3)如果视频超过 500MB,建议用桌面端 FFmpeg 命令行处理(本工具也提供命令行代码示例供复制)。
选择 打开 +新窗口 esc关闭