0

[Open Source] #222 - ErsatzTV: Hệ thống "Đài truyền hình cá nhân" chuyên sâu với .NET 10, FFmpeg và kiến trúc Linear Playout thời gian thực

Trong khi các hệ thống như Plex hay Jellyfin tập trung vào mô hình Video-on-Demand (VOD - xem theo yêu cầu), ErsatzTV lại giải quyết một bài toán thú vị và phức tạp hơn: Biến kho dữ liệu media tĩnh thành các kênh truyền hình trực tiếp (Linear TV) hoạt động 24/7. Hệ thống cho phép người dùng tự biên tập lịch phát sóng, chèn logo đài, quản lý quảng cáo và phát trực tuyến qua giao thức IPTV. Điểm vượt trội của ErsatzTV nằm ở khả năng điều phối hàng nghìn luồng dữ liệu và chuyển mã (transcoding) thời gian thực với sự hỗ trợ tối đa từ phần cứng.

Dưới góc độ kỹ thuật, ErsatzTV là một minh chứng xuất sắc về việc ứng dụng Clean Architecture trong hệ sinh thái .NET 10, mô hình CQRS và kỹ thuật xây dựng FFmpeg Pipeline phức tạp.

Github: https://github.com/ErsatzTV/ErsatzTV


🛠️ 1. Nền tảng công nghệ: Bleeding Edge Microsoft Stack

ErsatzTV tận dụng những công nghệ mới nhất để đạt được hiệu suất xử lý video cực đại:

  • Logic Core (.NET 10 & ASP.NET Core): Sử dụng phiên bản .NET mới nhất, tận dụng các cải tiến về hiệu năng runtime và quản lý bộ nhớ để xử lý hàng nghìn sự kiện lịch phát sóng mỗi giây.
  • Media Engine (FFmpeg v7.1): Trái tim của hệ thống. ErsatzTV không chỉ gọi FFmpeg mà còn tích hợp sâu để tận dụng mọi công nghệ tăng tốc phần cứng hiện nay: Nvidia NVENC, Intel QSV, AMD AMF, VAAPIApple VideoToolbox.
  • Persistent & Search: Sử dụng Entity Framework Core hỗ trợ linh hoạt SQLite hoặc MySQL. Tích hợp Lucene.NETElasticsearch để lập chỉ mục hàng triệu tệp tin media, cho phép tìm kiếm và tạo bộ sưu tập thông minh (Smart Collections).
  • Admin UI (Blazor Server): Xây dựng giao diện quản trị động mạnh mẽ bằng Blazor, cho phép quản lý lịch phát sóng dạng kéo thả mượt mà mà vẫn duy trì logic xử lý hoàn toàn ở phía server.

🏗️ 2. Trụ cột kiến trúc: Clean Architecture và Linear Playout Engine

Kiến trúc của ErsatzTV được thiết kế để tách biệt hoàn toàn logic nghiệp vụ khỏi hạ tầng truyền tải:

  • Clean Architecture & CQRS: Sử dụng thư viện MediatR để tách biệt luồng Đọc (Queries) và Ghi (Commands). Điều này giúp hệ thống duy trì sự ổn định khi vừa phải thực hiện các tác vụ nặng như quét đĩa (Scanner), vừa phải phản hồi các yêu cầu stream từ Client.
  • Real-time Playout Logic: Khác với VOD, ErsatzTV hoạt động dựa trên một "Trục thời gian thực toàn cầu". Hệ thống liên tục tính toán: "Tại thời điểm HH:mm:ss hiện tại, kênh X phải đang phát tệp tin Y ở vị trí giây thứ Z". Logic này đòi hỏi sự chính xác tuyệt đối về thời gian để đảm bảo luồng stream không bị gián đoạn.
  • Modular FFmpeg Pipeline: ErsatzTV xây dựng một bộ máy tạo câu lệnh FFmpeg động. Dựa trên thông số của tệp nguồn và yêu cầu của kênh đầu ra (720p, 1080p, bitrate), hệ thống tự động chèn các "bộ lọc" (Filters) như: chèn Watermark, đốt phụ đề (Burn-in subtitles), hoặc chuẩn hóa âm lượng (Loudness normalization).

🔄 3. Workflow: Vòng đời từ Tệp tin đến Luồng phát sóng (Sequence Diagram)

Sơ đồ mô tả cách ErsatzTV biến một bộ phim trong ổ cứng thành một luồng truyền hình trực tiếp:

image.png


⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn

  1. HDHomeRun Emulation: ErsatzTV triển khai giao thức giả lập thiết bị phần cứng HDHomeRun. Điều này cho phép các phần mềm như Plex, Emby hoặc Channels nhận diện ErsatzTV như một đầu thu kỹ thuật số (Tuner) vật lý, mở khóa khả năng xem TV trực tiếp trên các ứng dụng này.
  2. JIT Transcoding & Segmenting: Hệ thống thực hiện chuyển mã "vừa đúng lúc" (Just-in-time). ErsatzTV không chuyển mã trước toàn bộ thư viện; nó chỉ xử lý đoạn video cần thiết cho người xem hiện tại, giúp tối ưu hóa dung lượng đĩa cứng và tài nguyên GPU.
  3. Media Server Webhooks: Tích hợp sâu với Plex và Jellyfin. Khi một bộ phim mới được thêm vào các nền tảng này, ErsatzTV nhận được thông báo qua Webhook và cập nhật thư viện phát sóng của mình ngay lập tức mà không cần quét lại toàn bộ ổ cứng.
  4. Complex Fillers & Fallbacks: Kỹ thuật xử lý "khoảng trống" lịch phát sóng. Nếu một tập phim kết thúc sớm hơn dự kiến, Playout Engine sẽ tự động chèn các đoạn phim ngắn (Fillers), cảnh báo lỗi hoặc video chờ, đảm bảo luồng stream không bao giờ trả về lỗi 404.

⚖️ 5. So sánh chiến lược

Tiêu chí ErsatzTV Plex / Jellyfin (VOD) IPTV Provider (SaaS)
Mô hình trải nghiệm Truyền hình (Linear) Xem theo yêu cầu Truyền hình
Quyền sở hữu Tuyệt đối (Self-host) Tuyệt đối Không
Tính tự động Rất cao (Scripted Schedules) Thấp (Phải chọn phim) Không (Theo nhà đài)
Yêu cầu phần cứng Cao (Cần GPU để Transcode) Trung bình Thấp
Tùy biến nội dung Vô hạn (Tự làm chủ đài) Không có Không

✅ Kết luận: Tại sao ErsatzTV là đỉnh cao của Media Middleware?

ErsatzTV chứng minh rằng với một kiến trúc đúng đắn, chúng ta có thể tái hiện lại toàn bộ hạ tầng đài phát thanh truyền hình phức tạp ngay trên một chiếc PC cá nhân. Việc kết hợp giữa hiệu năng mạnh mẽ của .NET 10 và sự linh hoạt của FFmpeg đã tạo ra một công cụ tối thượng cho những người muốn làm chủ hoàn toàn trải nghiệm giải trí gia đình.

Đối với các kỹ sư hệ thống, nghiên cứu ErsatzTV giúp bạn hiểu sâu về:

  • Kỹ thuật điều phối FFmpeg Pipeline quy mô lớn.
  • Cách triển khai Clean Architecture & CQRS trong ứng dụng thực tế.
  • Tư duy thiết kế hệ thống phát sóng thời gian thực (Broadcasting Logic).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí