Drop-frame Timecode: Tại sao caption bị lệch và cách khắc phục
💡 Drop-frame timecode (dấu chấm phẩy:
HH:MM:SS;FF) là bắt buộc với caption 29.97fps NTSC. Nếu thiếu, một chương trình 30 phút sẽ lệch khoảng hai giây. Chạyffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,field_order -of default input.mp4để xác nhận frame rate nguồn trước tiên. Kết quảr_frame_rate=30000/1001nghĩa là 29.97fps, cần dùng drop-frame.
Ý chính
- Drop-frame = dấu chấm phẩy:
HH:MM:SS;FF. Non-drop = dấu hai chấm:HH:MM:SS:FF. - Nguồn 29.97fps (
r_frame_rate=30000/1001trong ffprobe): luôn dùng drop-frame cho caption broadcast NTSC. - Flag export SeConv:
ScenaristClosedCaptionsDropFramecho 29.97 DF,ScenaristClosedCaptionscho 30fps NDF. - Bẫy 1080i59.94: ffprobe có thể hiển thị
r_frame_rate=60000/1001(field rate). Caption vẫn chạy ở 29.97fps (frame rate), không phải 59.94. - Sửa drift trong Subtitle Edit: menu Subtitle > Change frame rate, nhập rate nguồn và rate đích.
Drop-frame timecode là gì và tại sao 29.97fps cần nó?
Video màu NTSC chạy ở đúng 30000/1001 khung hình mỗi giây, xấp xỉ 29.97fps. Tốc độ này chậm hơn 30fps tròn khoảng 0,1%. Sự khác biệt này xuất hiện năm 1953 khi màu sắc được thêm vào tiêu chuẩn truyền hình Mỹ: tần số sóng mang màu phải dịch chuyển nhẹ để tránh nhiễu với sóng mang âm thanh, và frame rate giảm theo.
Sai lệch 0,1% đó cộng dồn rất nhanh trong broadcast timecode. Sau 10 phút đã lệch khoảng 1,8 giây; sau một tiếng lệch khoảng 3,6 giây. Một timecode hiển thị "01:00:00:00" ở cuối một tiếng video 29.97fps sẽ chậm hơn thời gian thực 3,6 giây nếu không có gì bù đắp.
Drop-frame timecode, được định nghĩa trong SMPTE ST 12-1, giải quyết vấn đề này bằng cách bỏ qua số khung 0 và 1 ở đầu mỗi phút, trừ mỗi phút thứ 10 (tại :00, :10, :20, :30, :40, :50). Không có khung hình thực sự nào bị xóa, chỉ là nhãn timecode bị bỏ qua. Điều này loại bỏ 18 số khung mỗi 10 phút, giữ đồng hồ timecode căn chỉnh với thời gian thực dưới hai khung mỗi giờ.
Sự khác biệt về ký hiệu chỉ là một ký tự: drop-frame dùng dấu chấm phẩy trước số khung (HH:MM:SS;FF), non-drop dùng dấu hai chấm (HH:MM:SS:FF). Trong file SCC tôi có thể kiểm tra ngay: mỗi dòng timecode trong SCC broadcast NTSC phải dùng dấu chấm phẩy. Dấu hai chấm nghĩa là đã xuất nhầm non-drop và caption sẽ bị lệch trên decoder thực tế.
Cách đọc frame rate video bằng ffprobe như thế nào?
Trước khi timing bất kỳ file caption hoặc phụ đề nào, tôi luôn chạy ffprobe trên video nguồn. Trường r_frame_rate cho biết frame rate chính xác dưới dạng phân số, và field_order cho biết video có interlaced không. Cả hai đều ảnh hưởng đến quyết định timing caption.
# Đọc frame rate và chế độ interlace từ video stream đầu tiên
ffprobe -v error -select_streams v:0 \
-show_entries stream=r_frame_rate,field_order \
-of default \
input.mp4
# Đọc timecode nhúng từ stream tags (nguồn MOV, MXF, MPEG)
ffprobe -v error -select_streams v:0 \
-show_entries stream_tags=timecode \
-of default \
input.mov
# Đọc timecode từ format metadata (nguồn DV, GXF, một số AVI và MXF)
ffprobe -v error \
-show_entries format_tags=timecode \
-of default \
input.mxf
Ý nghĩa các giá trị r_frame_rate đối với timing caption:
30000/1001- 29.97fps NTSC. Dùng drop-frame. SeConv:ScenaristClosedCaptionsDropFrame --fps:29.9730/1- đúng 30fps. Dùng non-drop. SeConv:ScenaristClosedCaptions --fps:3025/1- 25fps PAL. Không cần drop-frame. Timecode dùng dấu hai chấm xuyên suốt.24000/1001- 23.976fps điện ảnh hoặc streaming. Không drop-frame trong hầu hết workflow.60000/1001trên file interlaced - kiểm trafield_ordertiếp theo (xem phần 1080i bên dưới).
Đối với output TAG:timecode: giá trị như 01:00:00;00 (dấu chấm phẩy) xác nhận master nguồn dùng drop-frame. Giá trị như 01:00:00:00 (toàn dấu hai chấm) là non-drop. Loại timecode của file caption phải khớp với master.
Drop-frame vs non-drop: bảng so sánh thông số
Tôi giữ bảng này trong ghi chú dự án để kiểm tra nhanh khi cài đặt format. Nó bao gồm các điểm khác biệt quan trọng nhất cho caption delivery.
| Đặc điểm | Drop-frame (DF) | Non-drop (NDF) |
|---|---|---|
| Ký tự phân cách timecode | Dấu chấm phẩy: HH:MM:SS;FF | Dấu hai chấm: HH:MM:SS:FF |
| Frame rate | 29.97fps (30000/1001) | 30fps (30/1), hoặc master PAL/24fps |
| Lệch so với thời gian thực (1 giờ) | Dưới 2 khung hình | ~3,6 giây ở 29.97fps |
| Số khung bị bỏ qua | 0 và 1 mỗi phút, trừ mỗi phút thứ 10 | Không có |
| Flag export SeConv SCC | ScenaristClosedCaptionsDropFrame | ScenaristClosedCaptions |
| Trường hợp sử dụng | Broadcast Mỹ (NTSC), streaming Mỹ | Nội dung PAL, archival 30fps, master phi-NTSC |
| Tiêu chuẩn | SMPTE ST 12-1 | SMPTE ST 12-1 |
Tại sao video 1080i của tôi hiển thị 59.94, và dùng rate nào cho caption?
Đây là bẫy tôi gặp nhiều nhất trong các dự án broadcast. Master 1080i NTSC dùng quét interlaced: mỗi khung hình được chia thành hai field chụp ở hai thời điểm khác nhau, cho 59.94 field mỗi giây. Một số demuxer của ffprobe báo field rate thay vì frame rate. Bạn chạy ffprobe và thấy r_frame_rate=60000/1001, trông như 59.94fps.
Nội dung video vẫn là 29.97 khung hình mỗi giây. Giá trị field_order=tt hoặc field_order=bb trong output ffprobe là dấu hiệu: nó xác nhận video là interlaced. Với master 1080i59.94, frame rate đúng cho caption timing là 29.97fps, không phải 59.94fps. Đặt rate 59.94fps khi timing caption sẽ tạo ra timecode chạy gấp đôi tốc độ đồng hồ chương trình: caption được đặt xuất hiện ở giây thứ 60 sẽ hiển thị ở giây thứ 30.
Quy tắc của tôi: khi field_order là bất cứ gì khác progressive, tôi dùng caption frame rate bằng một nửa giá trị r_frame_rate được báo. Nếu ffprobe cho r_frame_rate=60000/1001 và field_order=tt, frame rate cho caption là 30000/1001 = 29.97fps, drop-frame.
Cách sửa caption bị lệch trong Subtitle Edit như thế nào?
Khi file caption được tạo ở sai frame rate, tôi dùng hộp thoại Change frame rate trong Subtitle Edit. Thao tác này nhân mỗi timestamp trong file với tỷ lệ giữa rate đích và rate nguồn, sửa toàn bộ drift mà không đụng đến text caption.
Đường dẫn trong Subtitle Edit: menu Subtitle > Change frame rate. Trong hộp thoại, đặt "From" là rate captions đang dùng (rate sai), và "To" là rate đúng. Ví dụ, caption timed nhầm ở 25fps trong khi video là 29.97fps:
# Subtitle Edit: Subtitle > Change frame rate
# From: 25
# To: 29.97
# Mỗi timestamp nhân với 29.97 / 25 = 1,19880
# Cue tại 1:00.000 trở thành 1:11.928 sau khi sửa
Sau khi sửa timestamp, tôi xuất SCC với flag drop-frame đúng:
# Xuất caption đã sửa dưới dạng SCC 29.97 drop-frame (broadcast NTSC)
seconv.exe corrected.srt ScenaristClosedCaptionsDropFrame --fps:29.97 --output-folder:out --overwrite
Sau đó tôi mở file SCC đầu ra trong text editor để xác nhận các timecode đầu tiên dùng dấu chấm phẩy (00:00:01;15 không phải 00:00:01:15), rồi chạy decode check bằng caption-inspector trước khi nộp. Hai phút kiểm tra ở đây tránh được việc bị broadcaster từ chối sau đó.
Tự làm được đến đâu, và khi nào cần chuyên gia broadcast?
Chẩn đoán lệch frame rate là miễn phí và nhanh: ffprobe đi kèm với ffmpeg, Subtitle Edit là phần mềm mã nguồn mở, và thao tác Change frame rate chỉ cần một hộp thoại. Với trường hợp đơn giản - biết frame rate của cả video nguồn lẫn file caption - những công cụ này xử lý hoàn toàn được.
Chuyên gia tiết kiệm thời gian và giảm rủi ro trong các tình huống sau: master nguồn có timecode sai hoặc không đồng nhất bên trong; deliverable yêu cầu format 708-service như SMPTE-TT thay vì SCC đơn thuần; hoặc dự án đi qua hệ thống ingest tự động của broadcaster với yêu cầu QC cụ thể. Các deliverable broadcast và streaming Mỹ cần tuân thủ FCC là nơi tôi xử lý quy trình caption QC toàn diện - từ chẩn đoán frame rate ban đầu đến xuất SCC đúng format và xác minh decode.
Câu hỏi thường gặp
Điều gì xảy ra nếu tôi dùng non-drop timecode trong SCC 29.97fps?
Caption sẽ lệch ngày càng nhiều khi chương trình chạy. Non-drop và drop-frame bắt đầu tại cùng điểm nhưng phân kỳ ở tốc độ 0,1%, khoảng 1,8 giây mỗi 10 phút. Ở phút thứ 30, caption timed ở non-drop sẽ hiện chậm hơn khoảng 1,8 giây. Hệ thống QC broadcast thường phát hiện và gắn cờ lỗi này tự động khi ingest.
Nhìn vào file SCC có biết được nó dùng drop-frame không?
Có. Mở SCC trong text editor bất kỳ. File bắt đầu bằng dòng header Scenarist_SCC V1.0, sau đó mỗi dòng caption bắt đầu bằng timecode. Dấu chấm phẩy trước số khung nghĩa là drop-frame: 00:01:00;02. Dấu hai chấm nghĩa là non-drop: 00:01:00:02. SCC broadcast NTSC 29.97fps phải dùng dấu chấm phẩy. Nếu thấy toàn dấu hai chấm, xuất lại bằng ScenaristClosedCaptionsDropFrame trong SeConv.
Tại sao ffprobe hiển thị 60000/1001 cho master 1080i của tôi?
Một số demuxer báo field rate (59.94 field mỗi giây) thay vì frame rate (29.97 khung mỗi giây) cho video interlaced. Giá trị field_order trong output ffprobe là tín hiệu: tt (top-field-first) hoặc bb (bottom-field-first) xác nhận video là interlaced. Với bất kỳ nguồn interlaced nào, frame rate cho caption timing là một nửa giá trị r_frame_rate được báo. 1080i59.94 chạy caption ở 29.97fps, drop-frame.
Cách kiểm tra lỗi timecode trong SCC trước khi nộp như thế nào?
Tôi chạy hai bước kiểm tra. Đầu tiên, mở SCC trong text editor và xác nhận các timecode đầu tiên dùng dấu chấm phẩy cho file 29.97 DF. Thứ hai, decode bằng caption-inspector:
docker run --rm -v /path/to/captions:/data nebulabroadcast/caption-inspector -o /data /data/file.scc
File output -C1.608 hiển thị text và control codes đã decode đúng như decoder CEA-608 thực tế nhìn thấy. Lỗi timing, caption bị bỏ qua và ký tự sai đều hiển thị ở đó. Chi tiết về cách đọc output này có trong hướng dẫn quy trình caption QC.
Drift bao nhiêu cho chương trình 60 phút dùng sai loại timecode?
Ở 29.97fps, non-drop timecode chạy nhanh hơn thời gian thực 3,6 giây mỗi giờ. Chương trình 60 phút được caption ở non-drop khi đáng lẽ phải drop-frame sẽ có caption đến sai khoảng 3,6 giây vào cuối giờ. Drift tỷ lệ thuận: 10 phút = khoảng 1,8 giây, 30 phút = khoảng 5,4 giây. Drop-frame timecode theo SMPTE ST 12-1 giảm sai số này xuống dưới hai khung hình mỗi giờ.
Nguồn
- Tài liệu ffprobe (ffmpeg.org) -
-show_entries,-select_streams, stream fieldsr_frame_ratevàfield_order, stream tags và format tags cho timecode. Verified tháng 10 năm 2026. - SMPTE timecode (Wikipedia) - Cơ chế drop-frame vs non-drop, ký hiệu chấm phẩy/hai chấm, con số 3,6 giây/giờ drift, cách thức bỏ qua số khung. Verified tháng 10 năm 2026.
- Subtitle Edit / SeConv (nikse.dk) - Hộp thoại Change frame rate, tên format SeConv
ScenaristClosedCaptionsDropFramevàScenaristClosedCaptions, flag export. Verified tháng 10 năm 2026. - Comcast caption-inspector (GitHub) - Lệnh decode Docker, mô tả file output để QC SCC. Verified tháng 10 năm 2026.
Written by Dao Huy (Lucas), Vietnamese translator & localization specialist (EN · ZH · FR → Vietnamese). See translation services →
