Đằng sau những video mượt mà của Gói Hàng Chuẩn

Đằng sau những video mượt mà của Gói Hàng Chuẩn
Photo by Jakob Owens / Unsplash

Khi bạn nhìn vào goihangchuan.vn, có thể bạn sẽ nghĩ: “À, chỉ là một nền tảng lưu trữ và phát video đóng hàng thôi mà.” Nghe thì đơn giản, nhưng thực tế thì phức tạp hơn rất nhiều. Đằng sau mỗi video được phát mượt mà trên nền tảng là cả một hệ thống xử lý phức tạp, phải đối mặt với hàng loạt thách thức: từ định dạng video, codec, metadata cho tới khả năng tương thích với mọi thiết bị và trình duyệt. Và đó mới chỉ là phần nổi của tảng băng. Trong bài viết này chúng ta sẽ cùng nhau phân tích sâu hơn vấn đề này. Bài gồm 2 phần: phần đầu là phân tích sự đa dạng của video, phần hai là nói về cách tôi giải quyết vấn đề đa dạng ở goihangchuan.vn

Cảnh báo: bài này nghiên về kĩ thuật sẽ khô khan.

audio-thumbnail
Nghe bài bằng AI - Tính năng thử nghiệm
0:00
/392.010958

Đa dạng từ thiết bị

Mỗi thiết bị từ điện thoại, máy tính bảng, máy quay, webcam cho đến phần mềm ghi màn hình đều sử dụng những cài đặt khác nhau về định dạng lưu trữ video. Người dùng chỉ thấy một tệp .mp4, nhưng phía sau nó có thể là hàng loạt khác biệt về cách mã hóa, cách nén và cách lưu thông tin phụ trợ. Chính sự đa dạng này là nguyên nhân khiến backend xử lý video trở nên phức tạp hơn rất nhiều so với tưởng tượng.

Đa dạng đến công nghệ

Để hiểu tại sao cùng là một video mà có file phát được, có file lại không, chúng ta cần phân tích ba thành phần quan trọng:

Format (Container)

Đa dạng format. Nguồn: https://www.admecindia.co.in/post-production/common-file-formats-used-video-editing/

Format hay còn gọi là container là lớp bao ngoài của video, dùng để đóng gói nhiều thành phần bên trong như hình ảnh, âm thanh, phụ đề, và metadata. Một số format phổ biến gồm:

  • .mp4: thông dụng và phổ biến.
  • .mov: gốc Apple, thường thấy ở iPhone
  • .mkv: linh hoạt, nhiều track audio/phụ đề
  • .webm: tối ưu cho web

Vấn đề nằm ở chỗ: một số phần mềm hoặc thiết bị tạo ra file .mp4 không đảm bảo đúng tiêu chuẩn, dẫn đến không thể phát được trên trình duyệt web hoặc các thiết bị cũ.

Codec

Codec là thuật toán nén và giải nén nội dung hình ảnh và âm thanh. Dù có cùng định dạng .mp4, hai video có thể sử dụng hai codec khác nhau và dẫn đến mức độ tương thích hoàn toàn khác nhau.

Ví dụ:

  • H.264: phổ biến, tương thích gần như toàn bộ nền tảng
  • HEVC (H.265): nén tốt hơn nhưng không được hỗ trợ rộng rãi
  • VP9, AV1: hiện đại, mã nguồn mở, đang dần phổ biến trên web

Nếu trình duyệt hoặc phần mềm backend không hỗ trợ codec của video, việc phát hay xử lý sẽ gặp lỗi hoặc phải chuyển mã lại.

Metadata

Metadata là tập hợp các dữ liệu phụ như thời lượng, thời gian quay, độ phân giải, hướng xoay video, thông tin GPS, v.v. Những thông tin này có thể gây ảnh hưởng lớn đến việc hiển thị nếu không được xử lý đúng cách.

Ví dụ thường gặp: video quay dọc từ điện thoại nhưng bị phát nằm ngang do metadata ghi xoay 90 độ mà trình phát không hỗ trợ đọc metadata đó.

isom và khả năng stream

Một yếu tố kỹ thuật khác có thể khiến video không phát được trên web dù định dạng là .mp4 là do chuẩn cấu trúc không đúng. Trong đó, isom (ISO Base Media File Format) là một trong những chuẩn quan trọng.

Để một video có thể phát trực tiếp (pseudo-streaming), file cần có:

  • Moov atom (metadata mô tả video) phải được ghi ở đầu file
  • Format chuẩn theo isom, mp42, hoặc các brand tương thích

Nếu moov atom nằm ở cuối file, trình duyệt phải tải toàn bộ file mới phát được. Giải pháp là remux lại file với tham số -movflags +faststart trong FFmpeg để chuyển metadata lên đầu.

Tại sao lại đa dạng như vậy?

Có thể bạn sẽ thắc mắc: tại sao lại rối đến vậy? Tại sao video không thể thống nhất một chuẩn để ai cũng làm theo cho dễ? Lý do nằm ở sự kết hợp của nhiều yếu tố: lịch sử phát triển công nghệ, nhu cầu sử dụng khác nhau, và cả yếu tố bản quyền phần mềm.

Thứ nhất, tiêu chuẩn video không bị kiểm soát bởi một tổ chức duy nhất. Các công ty công nghệ như Apple, Microsoft, Google hay các tổ chức phi lợi nhuận đều có thể tạo ra định dạng, codec hay container riêng để phục vụ cho mục đích của họ. Mỗi định dạng lại tối ưu cho một ngữ cảnh sử dụng khác nhau: .mov dành cho hệ sinh thái Apple, .webm tối ưu cho trình duyệt, .mkv thì linh hoạt cho nội dung có nhiều phụ đề, nhiều track âm thanh... Không có cái nào là tốt nhất cho mọi tình huống.

Thứ hai, lịch sử để lại một hệ thống công nghệ có tính kế thừa cao. Những định dạng cũ như DivX, XviD từng phổ biến một thời, rồi đến H.264, H.265 và bây giờ là AV1. Mỗi lần nâng cấp là một bước tiến, nhưng không thể ép buộc toàn bộ hệ sinh thái cập nhật cùng lúc. Các thiết bị cũ, phần mềm cũ vẫn cần tiếp tục hoạt động. Sự tương thích ngược này góp phần làm cho bức tranh định dạng video càng thêm phức tạp.

Thứ ba, vấn đề bản quyền và chính sách sử dụng. Một số codec như H.264 hay H.265 bị ràng buộc bởi bằng sáng chế. Vì lý do chi phí, nhiều phần mềm mã nguồn mở hoặc miễn phí sẽ không dùng các codec này, mà chọn các phương án thay thế như VP8, VP9 hay AV1 hoặc những codec miễn phí bản quyền.

Tất cả những yếu tố trên kết hợp lại tạo nên một thế giới video vừa phong phú, vừa hỗn loạn. Bạn thấy đó, chỉ khi có tự do, cạnh tranh và một môi trường mở, công nghệ mới thật sự phát triển đúng hướng. Không một chuẩn mực nào có thể áp đặt mãi mãi. Khi mọi quyền lực tập trung vào tay một nhóm nhỏ dù trong kỹ thuật hay trong xã hội thì sự đa dạng, tiến bộ và tiếng nói của số đông dễ dàng bị bóp nghẹt.

Giải pháp chuẩn hóa định dạng

Để xây dựng một nền tảng có khả năng tiếp nhận và phát video ổn định từ nhiều nguồn, cần thiết lập một pipeline xử lý rõ ràng:

  1. Tiếp nhận file gốc từ người dùng.
  2. Phân tích thông tin kỹ thuật bằng công cụ như ffprobe, mediainfo.
  3. Chuẩn hóa định dạng:
    • Chuyển đổi về định dạng .mp4 sử dụng codec H.264 và audio AAC
    • Đảm bảo moov atom nằm đầu file để hỗ trợ streaming
    • Xoay video đúng hướng dựa vào metadata
    • Loại bỏ metadata không cần thiết hoặc nhạy cảm
    • Nén bitrate phù hợp với chất lượng và mục đích sử dụng
  4. Đóng gói lại video theo cấu trúc hỗ trợ stream tốt trên web.
  5. Phục vụ video qua hệ thống streaming như:
    • Progressive download (HTTP streaming cơ bản)
    • HLS / DASH nếu có nhu cầu chia nhỏ file và phân phối đa băng thông.

Giải pháp ở Gói Hàng Chuẩn

Ở trên, chúng ta đã nói về sự đa dạng định dạng video, và nhu cầu chuẩn hóa định dạng từ codec, metadata cho đến cấu trúc file để đảm bảo khả năng phát video mượt mà trên nền tảng.

Tuy nhiên, khi số lượng người dùng tăng lên, việc xử lý video theo kiểu người dùng upload → server xử lý ngay sẽ nhanh chóng trở thành điểm nghẽn. Lúc này, giải pháp hiệu quả hơn là tách xử lý encode video ra khỏi flow chính, và chuyển sang kiến trúc hàng đợi (queue-based).

Tại sao cần hàng đợi ?

Khi một người dùng upload video, quá trình xử lý có thể mất vài giây đến vài phút tùy vào kích thước và độ phức tạp. Nếu encode được xử lý trực tiếp trong request-response flow, hệ thống sẽ:

  • Gây timeout phía client
  • Tốn tài nguyên backend
  • Không mở rộng được theo số lượng người dùng

Vì vậy, chúng ta cần tách việc xử lý video ra thành một quy trình nền, xử lý không đồng bộ. Mô hình điển hình nhất là: Upload → Push vào queue → Worker xử lý → Cập nhật kết quả.

Kiến trúc tổng thể

Kiến trúc tổng thể Gói Hàng Chuẩn

Trong đó:

  • Client có nhiệm vụ upload video lên.
  • Queue system (RabbitMQ) sẽ chứa hàng đợi video cần xử lý.
  • Worker(s) sẽ xử lý endcode video. Số lượng worker sẽ scale theo nhu cầu hệ thống.
  • Storage: chỗ lưu video.
  • Database: lưu trạng thái.
  • Cùng một số phần phụ trợ khác.

Kĩ thuật xử lý encode

Tôi sử dụng FFmpeg để xử lý endcode.

ffmpeg -i input.mp4 \
  -c:v libx264 -profile:v high -preset fast -crf 23 \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  output.mp4

Đơn giản vậy thôi, tất nhiên tuỳ nhu cầu và hệ thống mà lệnh này cũng tuỳ biến theo.

Một số lưu ý khi triển khai thực tế

  • Retry Job: cần cơ chế retry nếu worker lỗi, nhưng tránh retry vô hạn gây nghẽn.
  • Monitoring: track queue depth, thời gian xử lý trung bình, tỷ lệ lỗi.
  • Scalability: thiết kế worker stateless để có thể scale ngang (horizontal scaling).
  • Thumbnails & Preview: xử lý sẵn snapshot hoặc preview video khi encode xong để frontend hiển thị nhanh.
  • Đóng gói theo HLS hoặc MPEG-DASH để hỗ trợ stream nếu cần.

Kết luận

Tôi tin rằng: muốn xây dựng một sản phẩm công nghệ bền vững, thì phần nền tảng (backend) phải vững chắc. Những thứ như encode, queue, streaming, logging không ai thấy, nhưng nếu làm không tốt, người dùng sẽ thấy ngay bằng lỗi.

Và cuối cùng, đây cũng chỉ là một mảnh ghép trong kiến trúc tổng thể của Gói Hàng Chuẩn. Vẫn còn nhiều thứ thú vị khác đang chờ để kể tiếp: như CDN phân phối, bảo vệ link phát, hay cách chúng tôi nhúng video vào hệ thống bán hàng, quản lý nội bộ… Nhưng hẹn bạn ở những bài sau nhé.

Cảm ơn bạn đã đọc đến cuối. Nếu bạn thấy bài này hữu ích, hoặc muốn biết thêm về phần nào cụ thể, đừng ngại nhắn mình hoặc để lại comment. Chúc bạn code vui!