Vùng an toàn cho caption video 9:16: TikTok, Reels và YouTube Shorts
← Blog
🎬 Phụ đề & Caption6 phút đọc

Vùng an toàn cho caption video 9:16: TikTok, Reels và YouTube Shorts

💡 Với video dọc 1080x1920, MarginV=180 trong dòng Style .ass tránh được khối nút tương tác trên TikTok, Reels và YouTube Shorts. Dùng MarginV=350 để tránh thêm phần mô tả của TikTok. Dải nút bên phải (~80-110px từ mép phải) hiếm khi đụng caption căn giữa. Các con số này là số đo thực tế: nền tảng không công bố thông số pixel vùng an toàn cho caption.

Ý chính

  • MarginV=180 tránh được khối nút tương tác trên cả ba nền tảng. MarginV=350 tránh thêm phần chữ mô tả của TikTok, vốn nằm cao hơn khối nút đó trong frame.
  • Dải nút bên phải rộng khoảng 80-110px tính từ mép phải. Caption căn giữa với MarginL=MarginR=20 sẽ tránh được dải đó ở độ dài dòng bình thường (tối đa 12 từ ở Fontsize=68).
  • TikTok, Instagram và YouTube đều không công bố thông số pixel vùng an toàn cho caption. Các số đo dưới đây là kết quả tôi tự kiểm tra trực quan trên iOS app hiện tại của từng nền tảng.
  • Nếu đăng video lên cả ba nền tảng, MarginV=250 là mức an toàn chung, đủ khoảng cách trên tất cả các khối nút.
  • Để đẩy một cue lên đầu frame, thêm {\an8} vào đầu trường Text của dòng Dialogue đó. Các cue còn lại vẫn dùng vị trí mặc định trong Style.

Vùng UI nào bao phủ frame 9:16 của bạn?

Mỗi nền tảng video dọc đều đặt các điều khiển tương tác trực tiếp lên canvas video. Có ba vùng cần kiểm tra trước khi đặt lề cho caption trên frame 1080x1920.

Vùng phía dưới là quan trọng nhất. Các nút like, bình luận, chia sẻ và theo dõi xếp dọc theo phía dưới bên phải frame. Với TikTok và Instagram Reels, chữ mô tả, tên tài khoản và nhãn âm thanh cũng phủ lên phần dưới bên trái, khiến vùng phía dưới cao hơn so với chỉ có khối nút.

Dải bên phải chứa các biểu tượng nút tương tác. Dải này rộng khoảng 80-110px tính từ mép phải. Các biểu tượng chạy dọc xuống phía phải nhưng chiều ngang hẹp, nên caption căn giữa với độ dài dòng thông thường không bị che.

Thanh điều hướng trên cùng là dải mỏng trên đầu frame, cao khoảng 60-80px, hiển thị logo nền tảng. Chỉ ảnh hưởng nếu bạn đẩy một cue lên đầu bằng tag override {\an8}.

Chiều cao vùng UI đã đo: TikTok, Reels và Shorts

Bảng dưới đây là chiều cao các vùng UI tôi đo trực quan trên 1080x1920, dựa trên iOS app hiện tại của từng nền tảng. Đây không phải thông số chính thức. Khi nền tảng cập nhật giao diện, các con số có thể thay đổi 20-40px.

VùngTikTokInstagram ReelsYouTube Shorts
Thanh điều hướng trên cùng~75px~75px~80px
Dải nút bên phải (tính từ mép phải)~110px~110px~100px
Dưới: khối nút tương tác~165px~160px~140px
Dưới: chữ mô tả + khối nút~340px~275px~220px

Điểm khác biệt then chốt: phần mô tả của TikTok cao hơn Reels và Shorts vì TikTok hiển thị nhiều dòng mô tả hơn trước khi cắt bớt. Caption đặt ở MarginV=180 tránh được khối nút nhưng vẫn nằm trong vùng mô tả của TikTok khi mô tả có nhiều chữ. Nếu mô tả ngắn hoặc video không có mô tả dài, MarginV=180 là ổn. Nếu muốn chắc chắn, dùng MarginV=350 khi tải lên TikTok.

Cài đặt .ass nào phù hợp với từng vùng?

Với mỗi dự án, tôi giữ một file .ass với một Style duy nhất tên "Default" và chỉ thay đổi giá trị MarginV trước khi render lại cho nền tảng khác. Đây là ba giá trị tôi dùng:

[Script Info]
ScriptType: v4.00+
PlayResX: 1080
PlayResY: 1920
WrapStyle: 0
ScaledBorderAndShadow: yes

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding

; Tránh khối nút YouTube Shorts (MarginV=160)
Style: Default,Arial,68,&H00FFFFFF,&H000000FF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,3,0,2,20,20,160,1

; An toàn cho cả ba nền tảng - tránh khối nút (MarginV=250)
; Style: Default,Arial,68,&H00FFFFFF,&H000000FF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,3,0,2,20,20,250,1

; Tránh khối nút và phần mô tả của TikTok (MarginV=350)
; Style: Default,Arial,68,&H00FFFFFF,&H000000FF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,3,0,2,20,20,350,1

Bỏ dấu chú thích (dấu chấm phẩy ;) ở dòng phù hợp với nền tảng đích. Ba giá trị MarginV tương ứng với ba hàng trong bảng:

  • MarginV=160: ngay trên khối nút YouTube Shorts (~140px đã đo), khoảng cách ~20px.
  • MarginV=250: mức an toàn chung, tránh khối nút trên cả ba nền tảng (cao nhất ~165px đã đo) với khoảng cách 85px trở lên.
  • MarginV=350: dành riêng cho TikTok, tránh cả khối nút lẫn phần chữ mô tả (~340px đã đo).

Hướng dẫn đầy đủ về các trường khác trong Style (Fontsize, PrimaryColour, Outline, WrapStyle) có trong bài hướng dẫn tạo style subtitle .ass cho video dọc 1080x1920.

Dải nút bên phải có ảnh hưởng đến caption căn giữa không?

Với Alignment=2 (dưới giữa), vùng chứa chữ caption trải dài từ MarginL đến PlayResX - MarginR. Với MarginL=MarginR=20, vùng này rộng 1040px và chữ được căn giữa trong đó.

Một dòng Arial 68pt dài 10 đến 12 từ thường rộng khoảng 550 đến 700px. Khoảng cách hai bên còn lại ít nhất 170px trước khi đụng vào lề. Dải nút bên phải ~110px nằm trong vùng lề phải, nên caption căn giữa không đụng vào ở độ dài dòng bình thường.

Dải này chỉ ảnh hưởng trong hai trường hợp: dùng Alignment=3 (dưới phải) khiến chữ dồn sát mép phải, hoặc dòng quá dài (hơn 15 từ ở Fontsize=68). Trong các trường hợp đó, tăng MarginR=120. Lưu ý rằng điều này làm vùng chứa chữ hẹp hơn 100px bên phải, khiến tâm của chữ dịch sang trái một chút so với tâm frame.

Làm thế nào để kiểm tra lề trước khi tải lên?

Tôi luôn xem trước file .ass bằng ffplay trước khi encode cuối. Lệnh này render subtitle theo thời gian thực mà không ghi file:

ffplay -vf "ass=in.ass" input.mp4

Với 1080x1920, cửa sổ xem trước hiển thị đúng độ phân giải thực, giúp kiểm tra caption có nằm trên vùng nút (khoảng 10-18% phía dưới frame) hay không, và có dòng nào chạm vào lề phải không.

Lệnh encode cuối để nhúng cứng:

ffmpeg -i input.mp4 \
  -vf "ass=in.ass" \
  -c:v libx264 -crf 18 -preset slow \
  -pix_fmt yuv420p \
  -c:a copy \
  output.mp4

Sau khi tải lên TikTok hoặc Reels, tôi luôn kiểm tra preview trong app trước khi đăng. Đây là kiểm tra đáng tin cậy nhất vì hiển thị đúng vị trí UI phủ lên video thực tế.

Tôi tự làm được gì và khi nào cần chuyên gia?

Các cài đặt .ass và quy trình xem trước bằng ffplay trên đây đủ cho hầu hết các trường hợp tự làm caption creator. Một file template, một lệnh ffmpeg và kiểm tra trực quan trong app là toàn bộ quy trình.

Chuyên gia tiết kiệm thời gian khi:

  • Dịch sang tiếng Việt hoặc ngôn ngữ khác: dòng tiếng Việt thường dài hơn tiếng Anh đáng kể, có thể vượt giới hạn CPS hoặc chạm vào dải nút bên phải. Tôi xử lý điều này trong Subtitle Edit với chế độ xem song ngữ và kiểm tra CPS từng dòng.
  • Giao hàng cho nền tảng streaming: Netflix, Amazon và Apple TV+ yêu cầu file subtitle riêng theo định dạng cụ thể, không phải video đã nhúng cứng. Vùng an toàn cho các giao hàng đó được Netflix ghi rõ trong Netflix Timed Text Style Guide.
  • Encode nhiều phiên bản nền tảng: nếu cần bản riêng cho TikTok (MarginV=350) và Shorts (MarginV=160) từ cùng file gốc, quy trình tự động hóa nhanh hơn nhiều so với encode thủ công từng lần.

Để tư vấn về burn-in caption creator lẫn giao hàng subtitle cho streaming, bao gồm dịch sang tiếng Việt, xem dịch vụ phụ đề và caption dọc của tôi.

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

MarginV có hoạt động theo cách tương tự trong SRT hoặc WebVTT không?

Không. SRT không có siêu dữ liệu vị trí; trình phát tự quyết định nơi hiển thị cue. WebVTT hỗ trợ cài đặt cue theo phần trăm (line:, position:) nhưng hoạt động khác nhau trên từng trình duyệt. Để nhúng cứng video dọc, .ass với MarginV là định dạng duy nhất cho phép kiểm soát vị trí pixel chính xác trước khi encode. Với video web (thẻ <video>), WebVTT với line:90% cho vị trí ở gần dưới cùng frame.

Tôi có thể dùng cùng giá trị MarginV cho canvas 4K dọc (2160x3840) không?

Không trực tiếp. Giá trị ASS scale theo PlayResY. Để có cùng vị trí nhìn thấy trên canvas 2160x3840, nhân đôi MarginV: 160 thành 320, 250 thành 500, 350 thành 700. Tỉ lệ vẫn giữ nguyên; con số pixel tăng gấp đôi vì PlayResY tăng gấp đôi. Luôn đặt PlayResX và PlayResY khớp với kích thước đầu ra thực tế trước tiên.

Nền tảng cập nhật giao diện và lề của tôi không đủ nữa, phải làm gì?

Chạy ffplay -vf "ass=in.ass" input.mp4 để xem trước file hiện tại, rồi tải lên một video test ngắn và kiểm tra preview trong app trước khi đăng chính thức. Cập nhật giao diện thường dịch chuyển vùng 20-40px; điều chỉnh MarginV theo đó rồi encode lại. Tôi coi các số trong bảng là điểm xuất phát, không phải thông số cố định vĩnh viễn.

Tôi có thể thêm hộp nền mờ phía sau caption để dễ đọc hơn không?

Được. Đổi BorderStyle=3 trong dòng Style. Điều này thay chế độ viền bằng hộp nền sau mỗi cue. Dùng BackColour=&H80000000 cho hộp đen bán trong suốt (hai ký tự hex đầu là kênh alpha: 80 = khoảng 50% trong suốt). Hộp nền giúp chữ dễ đọc trên bất kỳ nội dung video hoặc giao diện nền tảng nào, đặc biệt hữu ích khi nền cảnh quay sáng hoặc phức tạp.

Caption TikTok của tôi bị đè lên chữ mô tả của video. Khắc phục thế nào?

Tăng MarginV từ 180 lên 350. Điều này đẩy đường cơ của caption lên 350px trên mép dưới, vượt qua vùng chữ mô tả của TikTok (~340px đã đo). Nếu cần caption hiển thị đồng thời với mô tả dài, đặt caption ở đầu frame sẽ hiệu quả hơn: đổi Alignment=8 và MarginV=100 trong dòng Style để đặt caption ở trên giữa frame theo mặc định, hoàn toàn tránh xa phần mô tả.

Nguồn

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

Báo giáWhatsApp