Cách trích xuất caption CEA-608/708 nhúng trong MP4, TS và MXF
← Blog
🎬 Phụ đề & Caption7 phút đọc

Cách trích xuất caption CEA-608/708 nhúng trong MP4, TS và MXF

💡 Lệnh ccextractor input.mp4 -o out.srt trích xuất phụ đề CEA-608 nhúng trong file MP4, MPEG-TS hoặc MXF thành SRT. Kiểm tra stream bằng ffprobe trước. Với MXF, thêm --input mxf. Để tách Field 1 và Field 2 hoặc chọn đúng service CEA-708, dùng --output-field và --service.

Ý chính

  • CCExtractor 0.96.5 tự nhận dạng MP4, MPEG-TS và MXF; thêm --input mxf để ép kiểu khi auto-detect thất bại với file wrapper cũ.
  • Kiểm tra stream trước: ffprobe -v error -show_entries stream=index,codec_type,codec_name,codec_tag_string -of default input.mp4 hiển thị các data track riêng (codec c608 hoặc eia_608); TS và MXF nhúng caption trong video SEI nên không có stream riêng.
  • CEA-608 Field 1 chứa caption tiếng Anh chính (mặc định). Dùng --output-field 2 cho Field 2, thường chứa caption ngôn ngữ thứ hai.
  • CEA-708 DTVCC service: --service 1 cho ngôn ngữ chính, --service 1,2 cho cả ngôn ngữ chính và phụ.
  • Output mặc định là SRT. Dùng --out scc để giữ nguyên mã hóa CEA-608 gốc khi cần file broadcast để re-master hoặc QC.

Kiểm tra caption nhúng trước khi trích xuất

Trước khi chạy CCExtractor, tôi kiểm tra file thực sự chứa gì. Cách kiểm tra phụ thuộc vào container. Với MP4 và MOV, ffprobe liệt kê tất cả stream gồm cả data track riêng. Chạy lệnh sau với bất kỳ file MP4 nào:

ffprobe -v error   -show_entries stream=index,codec_type,codec_name,codec_tag_string   -of default   input.mp4

Ý nghĩa các flag:

  • -v error: chặn output thông tin, chỉ hiện dữ liệu stream.
  • -show_entries stream=...: chỉ liệt kê các trường này cho mỗi stream.
  • codec_tag_string: hiện FourCC. Data stream có tag c608 hoặc eia_608 là track CEA-608 riêng nhúng ở cấp container MP4.
  • -of default: output dạng key=value, dễ đọc mà không cần công cụ khác.

Với MPEG-TS và MXF, dữ liệu CEA-608 và CEA-708 nằm trong video stream dưới dạng H.264 SEI NAL unit. ffprobe sẽ không hiển thị stream caption riêng, điều này hoàn toàn bình thường. Nếu ffprobe chỉ thấy video và audio trong TS hoặc MXF, không có nghĩa là file không có caption: hãy chạy CCExtractor và xem log output xem có phát hiện dữ liệu caption không.

Lệnh CCExtractor cơ bản cho MP4, TS và MXF

Cách trích xuất đơn giản nhất là chuyển CEA-608 thành SRT. CCExtractor tự nhận dạng MP4 và TS. Với MXF, tôi luôn ép kiểu đầu vào vì một số MXF wrapper cũ làm sai auto-detection:

# MP4 hoặc MOV: tự nhận dạng, output SRT
ccextractor input.mp4 -o out.srt

# MPEG-TS: tự nhận dạng hoạt động tốt
ccextractor input.ts -o out.srt

# MXF: ép kiểu đầu vào để tránh lỗi auto-detect
ccextractor --input mxf input.mxf -o out.srt

# Output SCC thay vì SRT (giữ nguyên mã hóa CEA-608 gốc)
ccextractor --out scc --input mxf input.mxf -o out.scc

Ghi chú các flag:

  • -o out.srt: đường dẫn file output. Không có -o, CCExtractor tự đặt tên dựa trên file input kèm hậu tố.
  • --input mxf: kích hoạt MXF reader. Các giá trị khác: ts, mp4, m2ts, mkv, mxf, scc.
  • --out scc: định dạng output. Các tùy chọn khác: ass, webvtt, webvtt-full, sami, ccd, bin.

CCExtractor ghi log tóm tắt ở cuối mỗi lần chạy. Theo dõi dòng "Extracted X frames" và các dòng đề cập EIA-608 hoặc CEA-708. Nếu cả hai đều bằng 0, file không có dữ liệu caption nào trong các stream mà CCExtractor đọc được.

Làm thế nào để chọn đúng field, channel hoặc service CEA-708?

CEA-608 mang dữ liệu trong hai field và hai channel mỗi field. CEA-708 mang các DTVCC service đánh số. Mặc định, CCExtractor trích cả 608 lẫn 708 khi có cả hai, tạo ra hai file output. Các flag sau cho phép chọn chính xác:

Mục tiêuFlagKhi nào dùng
608 Field 1 only--output-field 1Caption tiếng Anh chính (mặc định khi không có flag field)
608 Field 2 only--output-field 2Caption phụ, thường là track ngôn ngữ thứ hai
Cả hai 608 field--output-field bothTạo hai file với hậu tố _1 và _2
Channel 2 trong một field--cc2Channel 2 của field đang chọn
708 Service 1--service 1DTVCC service ngôn ngữ chính
708 Service 1 và 2--service 1,2DTVCC service chính và phụ
Tất cả 708 service--service allTrích mọi DTVCC service có trong file

Ví dụ:

# Trích 608 Field 2 thành SRT
ccextractor --output-field 2 input.ts -o field2.srt

# Trích 608 Field 1, channel 2
ccextractor --output-field 1 --cc2 input.mp4 -o channel2.srt

# Trích CEA-708 Service 1 only
ccextractor --service 1 input.mp4 -o service1.srt

# Trích cả hai 608 field và cả hai 708 service
ccextractor --output-field both --service 1,2 input.mxf -o captions

Phần lớn tài liệu broadcast Mỹ dùng 608 Field 1, Channel 1 cho caption tiếng Anh. Field 2 đôi khi chứa caption tiếng Tây Ban Nha. CEA-708 Service 1 là service ngôn ngữ chính trong HDTV digital caption. Khi không chắc file chứa gì, tôi luôn trích với --output-field both --service all trước rồi xem file nào được tạo ra.

CCExtractor xuất được những định dạng nào?

Mặc định là SRT, đủ cho hầu hết nhu cầu chỉnh sửa và upload. Flag --out chuyển định dạng. Các lựa chọn tôi dùng thường xuyên và khi nào dùng:

Flag định dạngFile outputTrường hợp dùng
--out srt (mặc định)SubRip (.srt)Chỉnh sửa trong Subtitle Edit, upload YouTube, quy trình dịch thuật
--out sccScenarist Closed Caption (.scc)Giữ mã hóa 608 gốc; re-master hoặc QC-decode với caption-inspector
--out webvttWebVTT (.vtt)Web video player, thẻ HTML <track>
--out webvtt-fullWebVTT có stylingGiữ metadata màu sắc và vị trí khi có
--out assSubStation Alpha (.ass)Phụ đề có style cho playback hoặc burn-in với ffmpeg
--out ccdCCD disassembly (.ccd)Kiểm tra byte 608 ở cấp thấp

Sau khi trích thành SCC, tôi luôn QC-decode bằng caption-inspector để xác nhận text và vị trí trước khi giao hàng:

docker run --rm -v "$(pwd)":/data nebulabroadcast/caption-inspector   -o /data /data/out.scc

Lệnh này tạo file -C1.608 chứa text decode dạng đọc được. Đọc file này xác nhận text trích xuất đúng với mong đợi, phát hiện vấn đề mã hóa trước khi đến tay khách hàng.

Khi nào nên nhờ chuyên gia xử lý trích xuất caption?

CCExtractor miễn phí và xử lý tốt các trường hợp phổ biến. Tôi dùng nó trong mọi quy trình QC. Tuy nhiên, lệnh trích xuất chỉ là bước đầu trong các tình huống sau:

  • Deliverable broadcast cần QC sign-off: trích SRT từ MXF của khách nhanh thôi, nhưng nếu caption cần sửa, re-time và giao lại dưới dạng SCC hoặc SMPTE-TT cho ingest broadcast, đó là cả một quy trình caption QC đầy đủ.
  • Nội dung CEA-708 DTVCC service: CCExtractor ghi rõ 708 decoder vẫn đang phát triển. Với delivery phụ thuộc vào service layer 708, tôi xác nhận với caption-inspector và có thể cần sửa thủ công phần window styling.
  • MXF có dữ liệu ancillary VBI: một số MXF broadcast nhúng caption trong ancillary data packet thay vì video SEI. CCExtractor không đọc được trường hợp này. Cần công cụ broadcast caption chuyên dụng có hỗ trợ MXF ancillary reading.
  • Trích xuất kết hợp dịch thuật: trích timing là bước một. Tạo phụ đề dịch đúng cho bản giao nộp localised là công việc riêng với QC pass và kiểm tra CPS riêng.

Nếu bạn cần caption tiếng Anh được trích xuất, sửa lỗi và giao nộp dưới dạng file broadcast hoặc streaming, hoặc cần phụ đề tiếng Việt làm từ timing đã trích, dịch vụ QC và giao nộp caption của tôi xử lý cả hai bước.

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

CCExtractor báo không tìm thấy caption. Tôi kiểm tra gì trước?

Đầu tiên xác nhận codec video là H.264 hoặc MPEG-2, hai định dạng mang dữ liệu 608/708 SEI phổ biến nhất. Sau đó thử lại với --output-field both --service all để chắc chắn không bị lọc mất field hoặc service có caption. Nếu vẫn không thấy, file có thể không có embedded closed caption, hoặc caption nằm trong ancillary data của MXF ngoài video stream mà CCExtractor không giải mã được.

CCExtractor có trích được phụ đề từ file MKV không?

CCExtractor đọc được MKV và tìm dữ liệu CEA-608/708 trong video SEI. Nếu MKV có soft subtitle track SubRip hoặc SubStation Alpha riêng biệt thay vì dữ liệu 608/708 nhúng, CCExtractor sẽ không tìm thấy. Với soft subtitle track, dùng ffmpeg trực tiếp: ffmpeg -i input.mkv -map 0:s:0 out.srt trích track phụ đề đầu tiên mà không cần re-encode.

Làm sao biết field nào chứa caption tiếng Anh?

Cách nhanh nhất là chạy với --output-field both --service all rồi mở từng file output trong Subtitle Edit để xem file nào có text tiếng Anh đọc được. Tài liệu broadcast Mỹ hầu như luôn dùng CEA-608 Field 1, Channel 1 cho caption tiếng Anh. CEA-708 Service 1 là service ngôn ngữ chính trong HDTV digital. Field 2 đôi khi chứa track tiếng Tây Ban Nha.

SRT trích ra có ký tự loạn. Lỗi gì vậy?

CEA-608 dùng bộ ký tự Latin riêng. CCExtractor chuyển sang UTF-8 mặc định, nhưng bộ ký tự không chuẩn hoặc bị gắn nhãn sai trong source có thể tạo output loạn. Thử thêm --unicode rõ ràng. Để kiểm tra ở cấp byte, chạy với --out ccd để lấy raw hex byte pairs, giúp xác định vấn đề mã hóa trước khi sửa.

Tôi có thể chuyển file trích xuất thành SMPTE-TT trực tiếp không?

Không trực tiếp từ CCExtractor: các định dạng output của nó là SRT, SCC, ASS, WebVTT, SAMI và binary. Trích thành SRT trước, rồi chuyển bằng SeConv: seconv out.srt SMPTE-TT2052 --output-folder . --overwrite --fps 29.97. Giao SMPTE-TT (ST 2052-1) XML cho broadcast và streaming cần file cấp 708 thay vì MCC tự tạo.

Nguồn

  • CCExtractor GitHub repository - README và output --help xác nhận các flag: --input, --out, --output-field, --service, --cc2. Kiểm tra tháng 10 năm 2026.
  • Tài liệu ffprobe (FFmpeg.org) - -show_entries, -select_streams và các trường stream output. Kiểm tra tháng 10 năm 2026.
  • Subtitle Edit (Nikse.dk) - SeConv command-line converter, tên định dạng SMPTE-TT2052, flag --fps. Kiểm tra tháng 10 năm 2026.

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

Báo giáWhatsApp