Luồng phát trực tiếp 24/7 không kết nối lại giữa các video: một ffmpeg được nạp qua đường ống
Video
Một kênh trực tiếp phát các video đã hoàn thiện suốt ngày đêm có hai thiết kế đơn giản, và cả hai đều gặp vấn đề. Khởi động lại ffmpeg cho mỗi video sẽ làm mất kết nối RTMP ở mỗi lần chuyển đổi. Danh sách phát concat được đọc một lần khi bắt đầu, nên video mới phải chờ đến lần khởi động lại tiếp theo.
Thiết kế
Mỗi video được chuyển đổi một lần sang MPEG-TS ở kích thước và tốc độ khung hình của luồng; một video dọc được đặt trên một bản sao mờ của chính nó thay vì các thanh đen. Một tiến trình ffmpeg đọc MPEG-TS từ đầu vào tiêu chuẩn của nó và mã hóa ở tốc độ bit không đổi với một khung hình chính (keyframe) mỗi hai giây, như yêu cầu của luồng trực tiếp. Một bộ nạp nhỏ ghi các tệp đã chuẩn bị vào đường ống đó lần lượt, theo nhịp thời gian thực, chọn tệp tiếp theo ở mỗi lần chuyển đổi: các video chưa từng được phát trước, sau đó là video được phát lâu nhất. Bộ đọc MPEG-TS của ffmpeg nhận thấy rằng mốc thời gian của mỗi tệp bắt đầu lại và dịch chuyển chúng, để đầu ra của nó chạy liên tục mà không bị gián đoạn.
Chi tiết 1: nhịp độ tính từ byte đầu tiên
Phiên bản đầu tiên của chúng tôi bắt đầu đồng hồ khi ffmpeg khởi động. Việc chuẩn bị tệp đầu tiên mất chín giây, nên bộ nạp nghĩ rằng nó bị chậm chín giây và gửi tất cả cùng một lúc. Việc bắt đầu đồng hồ ở byte đầu tiên được ghi đã khắc phục điều này: một lần chạy 53 giây tạo ra 53 giây luồng phát.
Chi tiết 2: âm thanh tại điểm nối
Tại một lần chuyển đổi, âm thanh của tệp tiếp theo bắt đầu 17 mili giây trước khi âm thanh của tệp trước kết thúc. Bộ mã hóa cảnh báo rằng đầu vào của nó đi "ngược dòng thời gian" và bộ ghép kênh đã sửa một mốc thời gian. Việc lấy mẫu lại bằng aresample=async=1:min_hard_comp=0.01:first_pts=0 sẽ cắt bớt hoặc đệm các phần chồng chéo như vậy trước khi bộ mã hóa nhìn thấy chúng. Trong một lần chạy hơn một phút với năm lần chuyển đổi, mọi mốc thời gian âm thanh và video trong luồng nhận được đều tăng, và luồng được giải mã mà không có lỗi nào.
Chi tiết 3: một số cảnh báo là bình thường
Mỗi tệp khởi động lại các bộ đếm MPEG-TS và đồng hồ của nó, nên ffmpeg báo cáo "Packet corrupt" và "timestamp discontinuity" ở mỗi lần chuyển đổi. Những dòng này là dự kiến, và chúng tôi loại chúng khỏi nhật ký để các lỗi thực sự nổi bật.
Bộ giám sát
Nếu ffmpeg thoát hoặc tiến trình dừng trong một phút, luồng sẽ khởi động lại với các khoảng nghỉ tăng dần và gửi thông báo sau nhiều lần thất bại liên tiếp. Trong bài kiểm tra của chúng tôi, chúng tôi đã dừng bộ mã hóa theo cách thủ công; luồng đã hoạt động trở lại sau bảy giây, và một video được thêm vào giữa quá trình chạy đã tham gia vào vòng lặp mà không cần kết nối lại. Một lần khởi động lại là một lần kết nối lại ngắn, vì vậy hãy đặt phát trực tiếp YouTube để tự động bắt đầu và không tự động dừng. Khóa luồng được che trong mọi dòng nhật ký, kể cả nhật ký của ffmpeg. Studio cung cấp kênh trực tiếp này dưới dạng một dịch vụ systemd.