Chuyển đổi hàng loạt định dạng phụ đề với SeConv (Subtitle Edit CLI)
← Blog
🎬 Phụ đề & Caption8 phút đọc

Chuyển đổi hàng loạt định dạng phụ đề với SeConv (Subtitle Edit CLI)

💡 SeConv của Subtitle Edit 5.0 chuyển định dạng phụ đề bằng một lệnh: tên định dạng là đối số thứ hai, viết liền không dấu cách. Với SCC phát sóng 29.97 DF luôn dùng ScenaristClosedCaptionsDropFrame (không phải ScenaristClosedCaptions) - DF dùng dấu chấm phẩy, NDF dùng dấu hai chấm. SRT sang SCC mất dữ liệu vì CEA-608 chỉ mã hóa bộ ký tự Latin.

Ý chính

  • Chạy seconv formats để xem danh sách định dạng; bỏ dấu cách khi dùng làm đối số thứ hai ("Scenarist Closed Captions Drop Frame" thành ScenaristClosedCaptionsDropFrame). Tên định dạng không phân biệt chữ hoa/thường.
  • SCC phát sóng 29.97 drop-frame: seconv *.srt ScenaristClosedCaptionsDropFrame --fps:29.97 --output-folder:out --overwrite
  • TTML streaming (SMPTE-TT 2052 / ST 2052-1): seconv *.srt SMPTE-TT2052 --output-folder:out --overwrite
  • Chuyển SRT sang SCC là mất dữ liệu: vị trí, định dạng in đậm/nghiêng, và ký tự ngoài bộ Latin đều bị loại bởi bộ ký tự CEA-608.
  • Flag --fps chỉ cần khi nguồn dùng đếm frame (MicroDVD .sub) hoặc khi xuất SCC để đặt frame rate timecode; không ảnh hưởng đến các chuyển đổi thuần time-based như SRT sang WebVTT.

SeConv là gì và lệnh hoạt động như thế nào?

SeConv là công cụ chuyển đổi hàng loạt không giao diện của Subtitle Edit 5.0 - dùng cùng engine định dạng như bản GUI nhưng chạy từ terminal. Tôi dùng SeConv cho mọi tác vụ seconv chuyển đổi hàng loạt định dạng phụ đề khi cần xử lý nhiều tệp hoặc tích hợp bước chuyển đổi vào một pipeline tự động.

Lệnh có ba phần theo thứ tự: glob pattern đầu vào, tên định dạng đích viết liền không dấu cách, và các flag tùy chọn. Chạy seconv formats một lần để xem bảng đầy đủ, sau đó lấy cột Format Name và bỏ hết dấu cách là được đối số thứ hai.

# Kiểm tra định dạng và encoding SeConv phát hiện trong tệp
seconv info episode01.srt

# SRT sang WebVTT (trình phát web, upload YouTube, thẻ HTML5 <track>)
seconv episode01.srt WebVTT --output-folder:out --overwrite

# Hàng loạt: mọi .srt trong thư mục hiện tại sang WebVTT
seconv *.srt WebVTT --output-folder:out --overwrite
  • info [file]: báo cáo định dạng phát hiện, encoding, số sự kiện và tổng thời lượng mà không ghi output - luôn chạy lệnh này trước khi chuyển đổi một tệp lạ.
  • --output-folder:out: ghi tệp đã chuyển đổi vào thư mục chỉ định; SeConv tự tạo thư mục nếu chưa có.
  • --overwrite: thay thế tệp output đã tồn tại mà không hỏi lại.

Tên định dạng nào dùng cho từng loại deliverable?

Bảng dưới liệt kê các tên định dạng tôi dùng thường xuyên trong công việc phát sóng và streaming. Mỗi tên đều lấy trực tiếp từ output của seconv formats, chỉ bỏ dấu cách:

Mục tiêu giao phátTên định dạng (đối số thứ hai)ĐuôiMất dữ liệu?
Web video, upload YouTube, thẻ HTML5WebVTT.vttKhông
Phát sóng Mỹ 29.97 drop-frame (CEA-608)ScenaristClosedCaptionsDropFrame.sccCó
Phát sóng non-drop-frame (CEA-608)ScenaristClosedCaptions.sccCó
Streaming TTML / SMPTE-TT (ST 2052-1)SMPTE-TT2052.xmlTối thiểu
ASS để tạo kiểu thêm hoặc burn-in với ffmpegAdvancedSubStationAlpha.assThêm style mặc định
SRT re-encode sang UTF-8 (chuẩn hóa encoding)SubRip.srtKhông

Sự khác biệt drop-frame giữa hai định dạng SCC không chỉ là hình thức. ScenaristClosedCaptionsDropFrame viết timecode với dấu chấm phẩy làm dấu tách frame (01;00;00;00 là DF), còn ScenaristClosedCaptions dùng dấu hai chấm (01:00:00:00 là NDF). Phát sóng Mỹ ở 29.97 fps dùng drop-frame; nộp SCC dạng NDF cho nội dung 29.97 sẽ khiến caption bị lệch khoảng 3,6 giây mỗi giờ phát sóng.

Làm thế nào để chuyển đổi hàng loạt một thư mục SRT sang SCC phát sóng?

Glob pattern là đối số đầu tiên - SeConv tự mở rộng và xử lý tất cả các tệp khớp trong một lần chạy, không cần vòng lặp shell. Tôi dùng cách này mỗi khi cần chuyển đổi cả một bộ tập phim từ SRT sang SCC trước khi giao phát.

# Mọi .srt trong thư mục hiện tại sang SCC drop-frame
seconv *.srt ScenaristClosedCaptionsDropFrame --fps:29.97 --output-folder:broadcast --overwrite

# Mọi .srt từ một thư mục nguồn cụ thể
seconv *.srt ScenaristClosedCaptionsDropFrame --fps:29.97 --input-folder:C:subssource --output-folder:C:subsroadcast --overwrite

# QC-decode một tệp output bằng caption-inspector để xác nhận văn bản sống sót
docker run --rm -v C:subsroadcast:/data nebulabroadcast/caption-inspector -o /data /data/episode01.scc
  • --input-folder:path: giải quyết glob pattern tương đối theo thư mục này, hữu ích khi chạy lệnh từ thư mục làm việc khác.
  • caption-inspector: bước decode check mà tôi không bao giờ bỏ qua sau khi chuyển đổi SCC hàng loạt - nó ghi file .608 dạng plain-text bên cạnh file nguồn để tôi xác nhận văn bản thoại đã sống sót qua quá trình ánh xạ bộ ký tự CEA-608 trước khi giao hàng.

Flag --fps thực sự thay đổi gì trong output?

Flag --fps có hai vai trò khác nhau tùy vào định dạng nguồn và đích, và điều quan trọng là hiểu vai trò nào áp dụng cho từng trường hợp chuyển đổi của bạn.

Với định dạng nguồn tính theo frame - các định dạng lưu timecode dưới dạng số frame thay vì HH:MM:SS.mmm, như MicroDVD .sub - --fps cho SeConv biết frame rate gốc để chuyển đổi số frame thành timestamp thực. Nếu sai, mọi sự kiện trong output sẽ bị lệch thời gian.

Với nguồn time-based đang chuyển sang SCC, --fps đặt frame rate được ghi vào timecode SCC. Đây là nơi flag này quan trọng nhất trong quy trình phát sóng của tôi.

# Nguồn frame-based: MicroDVD .sub ở 25 fps sang SRT
seconv movie.sub SubRip --fps:25 --output-folder:out --overwrite

# SRT time-based sang SCC 29.97 drop-frame
seconv episode.srt ScenaristClosedCaptionsDropFrame --fps:29.97 --output-folder:out --overwrite

# Xem định dạng và fps phát hiện trước khi chuyển đổi
seconv info movie.sub

Với các chuyển đổi thuần time-based - SRT sang WebVTT, SRT sang SMPTE-TT, SRT sang ASS - flag --fps không có ý nghĩa vì cả ba định dạng đều lưu timestamp theo ký hiệu HH:MM:SS.mmm sẵn.

Chuyển đổi nào an toàn để round-trip, và chuyển đổi nào mất dữ liệu?

Không phải mọi chuyển đổi định dạng đều bảo toàn tất cả thông tin. Đây là cách tôi phân loại các đường dẫn phổ biến trong thực tế:

Chuyển đổiAn toàn round-trip?Mất hoặc thay đổi gì
SRT sang WebVTTCóDấu phẩy trong milliseconds thành dấu chấm theo W3C WebVTT; không mất nội dung hay thời gian
WebVTT sang SRTGần như cóCue settings (line:, position:, align:) và ::cue CSS bị loại bỏ
SRT sang ASSCóSeConv thêm block [V4+ Styles] mặc định; thoại gốc được giữ nguyên
ASS sang SRTMất dữ liệuMàu sắc, vị trí, font chữ và dữ liệu karaoke timing bị loại bỏ
SRT sang SMPTE-TTCóXML wrapper được thêm vào; timing được giữ nguyên chính xác
SMPTE-TT sang SRTMất nhỏInline XML styling bị loại bỏ
SRT sang SCC (608)Mất dữ liệuVị trí, in đậm/nghiêng, và ký tự ngoài Latin đều bị loại bởi bộ ký tự CEA-608 chỉ dùng Latin
SCC sang SRTMất dữ liệuVị trí hàng/cột và metadata roll-up stream bị loại bỏ

Đường dẫn SRT sang SCC là con đường tôi thận trọng nhất. Bộ ký tự CEA-608 bị giới hạn ở Latin-1 cộng thêm một bộ ký tự mở rộng nhỏ được định nghĩa trong chuẩn CTA-608 - bất kỳ ký tự nào ngoài tập đó, như dấu nháy kiểu chữ, gạch nối dài, hay bất kỳ chữ CJK nào, sẽ bị thay thế hoặc bị loại bỏ mà không có cảnh báo. Decode check bằng caption-inspector là cách duy nhất đáng tin cậy để xác nhận những gì thực sự sống sót qua quá trình ánh xạ.

Bạn có thể tự làm gì với SeConv, và khi nào cần chuyên gia phát sóng hơn là chỉ đổi định dạng?

SeConv xử lý tốt phần chuyển đổi cơ học. Các công việc định dạng sang định dạng như SRT sang WebVTT, SRT sang SMPTE-TT, và SRT sang ASS chỉ cần một lệnh và tôi chạy hàng loạt mỗi tuần mà không cần xem lại thủ công. Giao diện dòng lệnh cho phép tích hợp gọn vào pipeline lớn hơn.

Đường dẫn SRT sang SCC là nơi tôi giảm tốc. Ngoài rủi ro bộ ký tự đã nêu, các khách hàng phát sóng thường yêu cầu cài đặt vị trí caption cụ thể (roll-up so với pop-on, phân công hàng, gán channel) mà chỉ đổi định dạng không thể cấu hình được - những cài đặt đó phải được tác giả trong bản gốc trước khi chuyển đổi. Và nếu SRT nguồn được tạo không theo kỷ luật caption - CPS quá cao, dòng quá dài, sự kiện ngắn hơn thời lượng tối thiểu - thì SCC sẽ thất bại QC bất kể SeConv xuất ra gì.

Nếu bạn đang giao caption đóng cho phát sóng Mỹ hoặc SVOD - nơi FCC yêu cầu bắt buộc về độ chính xác, đồng bộ, đầy đủ và vị trí đúng - và bạn chưa có bước QC bắt lỗi encoding CEA-608 trước khi tệp rời máy, đó chính là thời điểm một người thực hành quy trình này hàng ngày sẽ giúp bạn tránh chi phí làm lại. Tham khảo dịch vụ kiểm tra QC caption để xem quy trình đó bao gồm những gì.

Câu hỏi thường gặp

Làm thế nào tìm đúng tên định dạng cho lệnh seconv?

Chạy seconv formats trong terminal. Nó in bảng có số thứ tự của mọi định dạng được hỗ trợ. Lấy cột Format Name, bỏ hết dấu cách là có đối số. Tên định dạng không phân biệt hoa thường nên webvtt và WebVTT đều hoạt động.

Tôi có cần --fps khi chuyển SRT sang WebVTT hoặc SRT sang SMPTE-TT không?

Không. SRT, WebVTT, ASS và SMPTE-TT đều lưu timestamp theo ký hiệu HH:MM:SS.mmm nên không cần chuyển đổi frame rate. Flag --fps chỉ quan trọng khi nguồn dùng số frame (MicroDVD .sub) hoặc khi ghi timecode SCC từ nguồn time-based.

SeConv có thể chuyển SCC ngược lại thành SRT không?

Được: seconv in.scc SubRip --output-folder:out --overwrite. Văn bản thoại và thời gian được giải mã đầy đủ, nhưng vị trí caption (hàng, cột, luồng roll-up) bị loại trong quá trình round-trip. Kiểm tra số sự kiện bằng seconv info out/in.srt sau khi chuyển đổi.

Tại sao có hai tên định dạng SCC - có và không có "Drop Frame"?

"Scenarist Closed Captions" (ScenaristClosedCaptions) xuất timecode NDF với dấu hai chấm (01:00:00:00). "Scenarist Closed Captions Drop Frame" (ScenaristClosedCaptionsDropFrame) xuất timecode DF với dấu chấm phẩy (01;00;00;00). Phát sóng Mỹ ở 29.97 fps dùng drop-frame; nộp SCC dạng NDF cho chương trình 29.97 sẽ gây lệch khoảng 3,6 giây mỗi giờ nội dung.

SeConv có hỗ trợ chuyển đổi phụ đề dạng ảnh (PGS .sup, VobSub .sub) sang SRT không?

Có, khi kết hợp với OCR engine. Thêm --ocr-engine:tesseract (hoặc nocr, binaryocr, llamacpp) và tùy chọn --ocr-language:eng. Chạy seconv list-ocr-engines để xem engine nào đã cài trên máy. Độ chính xác OCR tùy thuộc vào nội dung; luôn xem lại output trước khi giao phát.

Nguồn

  • Subtitle Edit - GitHub (niksedk) - Giao diện CLI SeConv 5.0, danh sách định dạng và tham chiếu tùy chọn; tên định dạng và cú pháp flag được xác minh với binary đã cài. Xác minh tháng 10/2026.
  • W3C WebVTT Level 1 Specification - Cấu trúc tệp, định dạng timestamp dùng dấu chấm, quy tắc STYLE block; xác nhận sự thay đổi dấu phẩy sang dấu chấm trong chuyển đổi SRT sang WebVTT. Xác minh tháng 10/2026.

Written by Dao Huy (Lucas), Vietnamese translator & localization specialist (EN · ZH · FR → Vietnamese). See translation services →

Báo giáWhatsApp