tìm hiểu được nhiều thứ khá hay
đầu tiên là HLS - HTTP Live Streaming là 1 streaming protocol dựa trên HTTP, do apple phát triển. protocol này hỗ trợ việc phân đoạn data thành các luồng (stream) data độc lập, và sẽ ghép các luồng này lại theo đúng thứ tự cần thiết ở phía client để phát cho người dùng. để biết đc thứ tự các data stream thì yêu cầu các stream này đc đánh chỉ mục và lưu vào 1 file chỉ mục, đó là file .m3u8
các data stream với trường hợp của video có thể là các Video Transport Stream (.ts file), là 1 định dạng để chứa digital data của video và audio thôi. 1 video có thể đc cắt ra thành nhiều Video Transport Stream
quay lại với file png,file ảnh nói riêng và các loại file nói chung, cơ bản thì các file đều cần có 1 định nghĩa về cấu trúc file (file structure), trong đó yêu cầu phải có 1 số đoạn/phân đoạn (chunk, segment) bắt buộc. Đại khái là phải có header chunk đc đánh dấu là các byte value nào, phải có end chunk là các byte value nào, v.v... để có thể phát triển các ứng dụng/thư viện đọc/ghi file đó. trong trường hợp file ảnh, đa số các ứng dụng/thư viện đọc file đều sẽ hoạt động theo kiểu: tìm xem có đúng header chunk ở các bytes đầu tiên của file ko, đọc phần body cho đến khi gặp end chunk, là các byte đánh dấu kết thúc dữ liệu ảnh. tuy nhiên cái "file" nó là cái container do OS định nghĩa, data trong file kết thúc ở đâu là do OS và cái file system quyết định (EOF marker khác với end chunk của image), còn các thư viện đọc dữ liệu ảnh nói chung thì chỉ đọc đến cái image end chunk là dừng. bằng cách này thì có thể chèn thêm data vào sau cái image end chunk đấy mà ko làm hỏng image data lẫn việc đọc cái image data. đây là cách che dấu thông tin vào file ảnh mà làm người dùng thông thường ko phát hiện ra, do hầu hết các OS và các ứng dụng đọc file ảnh cũng đều chỉ đọc và hiển thị đến cái image end chunk thôi
quay lại với cái HLS và m3u8, cái m3u8 file ko chỉ cho phép lưu lại chỉ mục của các data stream, còn cho phép khai báo phạm vi đọc và sử dụng data trong stream, đc hỗ trợ trong 1 cái API của HLS gọi là byte-range. google thêm document của apple (HLS do apple phát triển)
từ mấy cái trên, thì suy luận đại khái các trang phim sẽ làm như sau:
- tạo 1 file png kích thước 1x1 siêu nhỏ, dữ liệu png này có thể nói là 1 byte array bất biến
- cắt video thành các TS file với file size phù hợp với validation của các server
- ghép TS data vào png file
- upload file png mới lên các server
- tạo file m3u8 với chỉ mục theo đúng thứ tự các png file (TS file trá hình) và định nghĩa thêm byte-range để đảm bảo client chỉ đọc data của TS file, bỏ qua cái data của png (byte array bất biến)
- woah la, giờ thì đã có 1 bộ phim hoàn chỉnh