Tài liệu này tổng hợp đầy đủ bối cảnh dự án cho người mới: kiến trúc, giao thức HLS, luồng xử lý video, cấu trúc lưu trữ, backend, client desktop, cấu hình và các thành phần chính. Mục tiêu là đọc xong có thể hiểu dự án làm gì, dữ liệu ở đâu và HLS được tạo/stream như thế nào.
Dự án HTTP-Live-Streaming là hệ thống streaming video theo chuẩn HLS:
- Backend (Spring Boot) cung cấp REST API, xử lý video, phục vụ HLS.
- HLS được tạo bằng FFmpeg (multi-bitrate + playlists + segments).
- Client desktop (Swing + JavaFX WebView) phát HLS bằng hls.js.
- Lưu trữ HLS ở filesystem theo
movieId/quality/segments.
Cấu trúc repo:
hls-server/: backend API, xử lý video, monitor nội bộ.client-desktop/: ứng dụng desktop phát video.
- Quản lý phim, thể loại, người dùng.
- Đăng ký/đăng nhập.
- Tạo HLS từ video gốc (360p/720p).
- Phục vụ HLS qua HTTP (master/playlist/segment).
- Theo dõi hoạt động login & streaming bằng monitor nội bộ.
- Client desktop phát video và chọn chất lượng.
[Client Desktop] <---- HTTP ----> [Spring Boot HLS Server]
| |
| |-- PostgreSQL (metadata)
| |-- File Storage (HLS files)
| |-- FFmpeg/FFprobe
Luồng tổng quát:
- Video gốc được xử lý bằng FFmpeg tạo HLS.
- Server lưu file HLS trên disk và cập nhật metadata.
- Client gọi API HLS để phát.
- Monitor nội bộ ghi log các hoạt động.
Để người mới dễ hình dung theo mô hình OSI 7 tầng và TCP/IP:
- Physical: tín hiệu vật lý (không đi sâu trong dự án).
- Data Link: Ethernet/Wi-Fi (không xử lý trực tiếp).
- Network: IP routing (hệ điều hành đảm nhiệm).
- Transport: TCP (dùng cho HTTP streaming).
- Session: quản lý phiên (do HTTP/TCP + ứng dụng đảm nhiệm).
- Presentation: encoding/format (video HLS, mã hóa AAC/H.264).
- Application: HTTP API (Spring Boot), HLS playlist/segment.
- TCP: đảm bảo truyền dữ liệu ổn định và theo thứ tự cho luồng tải
.m3u8và.ts. Ở đây không dùng UDP, vì HLS chạy trên HTTP nên mặc định là TCP. - HTTP: giao thức ứng dụng để client gửi request lấy playlist/segment.
- HLS: thực chất là HTTP GET liên tục tới playlist và segment.
- Client gửi HTTP GET tới
/api/hls/...(tầng 7). - Request/response đi qua TCP (tầng 4), đóng gói IP (tầng 3).
- Server trả playlist (
.m3u8) hoặc segment (.ts) qua HTTP response. - Player đọc playlist rồi tiếp tục gọi thêm các segment => tạo luồng streaming.
- Vì dùng HTTP, có thể tận dụng cache, CDN, và proxy như các file tĩnh khác.
- Master playlist:
master.m3u8 - Variant playlist:
360p/playlist.m3u8,720p/playlist.m3u8 - Segments:
segment_000.ts,segment_001.ts, ...
- Mặc định 6 giây, cấu hình qua
app.ffmpeg.segment-duration.
Đường dẫn mặc định (application.yml):
app:
hls:
storage-path: /home/nrin31266/hls-data/videos/hls
Cấu trúc thư mục:
/home/nrin31266/hls-data/videos/hls/
├── {movieId}/
│ ├── 360p/
│ │ ├── segment_000.ts
│ │ ├── segment_001.ts
│ │ └── playlist.m3u8
│ ├── 720p/
│ │ ├── segment_000.ts
│ │ ├── segment_001.ts
│ │ └── playlist.m3u8
│ └── master.m3u8
Ý nghĩa:
- Mỗi movie có thư mục riêng theo ID.
- Mỗi chất lượng có playlist và segments riêng.
- Master playlist trỏ tới playlist con.
hls-server/src/main/java/com/rin/hlsserver/:
controller/: REST API.service/: nghiệp vụ, FFmpeg, auth.model/: entity JPA.repository/: Spring Data.dto/: request/response.monitor/: monitor GUI.exception/: xử lý lỗi.config/: cấu hình.
File: hls-server/src/main/java/com/rin/hlsserver/controller/HlsStreamingController.java
GET /api/hls/{movieId}/master.m3u8
- Kiểm tra movie tồn tại và đã xử lý.
- Đọc file master playlist.
- Có thể append
userEmailvào URL. - Trả về
application/vnd.apple.mpegurl.
GET /api/hls/{movieId}/{quality}/playlist.m3u8
- Chấp nhận
360phoặc720p. - Đọc playlist trong thư mục quality.
- Append
userEmailvào segment URLs.
GET /api/hls/{movieId}/{quality}/{segmentName}
segmentNamedạngsegment_\d{3}.ts.- Trả về
video/mp2t. - Hỗ trợ Range request (chunk ~1MB).
GET /api/hls/{movieId}/ready
- Trả
true/falsenếu movie đã publish và có master playlist.
File: hls-server/src/main/java/com/rin/hlsserver/service/FFmpegService.java
- Kiểm tra file source.
- Tạo thư mục output
hlsStoragePath/{movieId}. - Lấy thông tin video bằng
ffprobe. - Tạo HLS cho từng chất lượng (360p, 720p).
- Tạo
master.m3u8. - Trả về danh sách
VideoQuality.
- 360p: 640x360, ~800 kbps.
- 720p: 1280x720, ~2500 kbps.
- Dùng
h264_nvenckhiapp.ffmpeg.use-cuda=true. - Dùng
libx264khifalse.
-hls_timetheo config (mặc định 6s).
File: hls-server/src/main/java/com/rin/hlsserver/model/Movie.java
title,description,imageUrlsourceVideoPath: video gốcmasterPlaylistPath: đường dẫn masterduration,processingMinutesstatus: DRAFT / PROCESSING / PUBLISHED / FAILEDprocessingProgressvideoQualities(1-n)
File: hls-server/src/main/java/com/rin/hlsserver/model/VideoQuality.java
quality: Q360P/Q720PplaylistPathsegmentsPathbitrate,resolution,fileSize
User: email, passwordHash, fullName, roles.Role: name.Genre: genreId (EN), name (VI), description.
FavoriteMovie: user ↔ movie (yêu thích).WatchHistory: user ↔ movie (lịch sử xem).
- Theo dõi trạng thái xử lý video (PENDING/RUNNING/COMPLETED/...)
- Lưu progress, error, started/completed time.
File: hls-server/src/main/java/com/rin/hlsserver/controller/AuthController.java
POST /api/auth/registerPOST /api/auth/login
app.jwt.signerKeychỉ được cấu hình sẵn, hiện tại chưa dùng cho streaming.- Nếu triển khai auth cho API đăng nhập/đăng ký thì có thể dùng khóa này, còn luồng HLS hiện chạy qua HTTP GET bình thường.
Các controller chính:
MovieController: CRUD phim, xử lý video.GenreController: quản lý thể loại.UserController: quản lý người dùng.FavoriteMovieController: phim yêu thích.WatchHistoryController: lịch sử xem.
File: hls-server/MONITOR_README.md
Chức năng:
- Log login success/fail.
- Log HLS master/playlist/segment.
- Theo dõi user đang xem (sessions in-memory).
Đặc điểm:
- GUI Swing mở cùng server.
- Ring buffer 2000 log entries.
- Session timeout mặc định 10-15s.
Cấu hình trong application.yml:
spring.datasource.*(PostgreSQL).spring.jpa.hibernate.ddl-auto=update.
Entities chính:
- Movie, VideoQuality, User, Role, Genre, FavoriteMovie, WatchHistory, VideoProcessingTask.
- Module:
client-desktop/. - Swing UI + JavaFX WebView.
- Player HTML dùng hls.js.
File: client-desktop/src/main/java/raven/modal/demo/forms/VideoPlayerForm.java
- Tạo HTML runtime.
- Play/pause, seek, volume, full-screen.
- Cho phép chọn chất lượng (quality menu).
http://localhost:8080/api/hls/{movieId}/{quality}/playlist.m3u8?userEmail=...
Nếu không có quality, dùng master playlist:
http://localhost:8080/api/hls/{movieId}/master.m3u8?userEmail=...
File: hls-server/src/main/resources/application.yml
server.port: 8080app.hls.storage-path: nơi lưu HLSapp.ffmpeg.use-cuda: bật/tắt GPUapp.ffmpeg.segment-duration: độ dài segmentapp.jwt.signerKey: khóa JWTmonitor.online.timeoutSeconds: timeout session
- Tạo Movie với
sourceVideoPath. - Gọi xử lý video =>
FFmpegService.processVideoToHLS. - Tạo output folder theo movieId.
- Chạy FFmpeg tạo
360pvà720p. - Tạo
master.m3u8. - Movie được set
masterPlaylistPath. - Client bắt đầu stream qua API HLS.
- Client gọi master playlist.
- Master trả danh sách playlist theo chất lượng.
- Client chọn quality, tải playlist.
- Playlist trả segment
.ts. - Client tải segments liên tục.
- Monitor ghi nhận tất cả request.
- Đảm bảo ffmpeg/ffprobe đã cài và nằm trong PATH.
- Đường dẫn
app.hls.storage-pathphải tồn tại và có quyền ghi. - Movie phải
PUBLISHEDvà có master playlist mới stream được. - HLS segments có thể cache lâu (header cache max-age lớn).
README.md: mô tả storage layout HLS.PROJECT_CONTEXT.md: tài liệu tổng quan chi tiết.hls-server/MONITOR_README.md: monitor nội bộ.hls-server/src/main/resources/application.yml.hls-server/src/main/java/com/rin/hlsserver/controller/HlsStreamingController.java.hls-server/src/main/java/com/rin/hlsserver/service/FFmpegService.java.client-desktop/src/main/java/raven/modal/demo/forms/VideoPlayerForm.java.
cd hls-server
mvn spring-boot:run
cd client-desktop
mvn package
java -jar target/*.jar
- Thêm chất lượng 1080p/4K.
- Signed URL hoặc DRM.
- CDN/S3 storage.
- Thống kê view.
- Adaptive bitrate nâng cao.
POST /api/auth/registerPOST /api/auth/login
GET /api/hls/{movieId}/master.m3u8GET /api/hls/{movieId}/{quality}/playlist.m3u8GET /api/hls/{movieId}/{quality}/{segmentName}GET /api/hls/{movieId}/ready
GET/POST/PUT/DELETE /api/movies/*GET/POST/PUT/DELETE /api/genres/*GET/POST/PUT/DELETE /api/users/*
Dự án tập trung vào HLS streaming end-to-end:
- Backend tạo + phục vụ HLS.
- Client desktop phát HLS.
- Monitor nội bộ giúp quan sát hoạt động.
Nếu có thay đổi lớn về cấu trúc, hãy cập nhật tài liệu này để người mới luôn nắm được bối cảnh dự án.