Có một phiên bản ffmpeg chạy dưới dạng máy chủ trên VPS, chuyển đổi video RTSP thành HLS và phân phát video đó lên web (sử dụng Apache). Video RTSP đến từ một máy tính ở một nơi khác (trong trường hợp này là ở một thị trấn khác), nơi tôi có một camera IP được kết nối. Máy tính lấy dữ liệu RTSP TỪ camera IP và truyền lại cho VPS.
Đây là lệnh ffmpeg tôi đang sử dụng trên máy tính đó (tôi có thể nói là trình phát lại):
ffmpeg \
-rtsp_transport tcp \
-i rtsp://[địa chỉ IP của camera]:554/live \
-c:v sao chép \
-f rtsp \
-rtsp_transport tcp \
rtsp://[địa chỉ IP của VPS]:4445/live.sdp
Và đây là lệnh tôi đang sử dụng trên VPS:
ffmpeg \
-rtsp_flags nghe \
-listen_timeout 5 \
-thời gian chờ 5000000 \
-rtsp_transport tcp \
-i rtsp://[địa chỉ ip của VPS]:4445/live.sdp \
-bản đồ 0 \
-flags +global_header \
-flags +igndts \
-c:v sao chép \
-g 0 \
-b:v 125k \
-tối đa 250k \
-bufsize 500k\
-hls_time 1 \
-hls_list_size 15 \
-hls_wrap 15 \
-y /dev/shm/hls/video.m3u8
Mọi thứ hoạt động tốt cho đến nay: Tôi có thể đọc luồng HLS trong trình duyệt và nó khá ổn định và nhanh chóng. Sự cố xảy ra khi kết nối giữa trình phát lại và VPS bị rớt: Tôi phải ssh vào VPS và khởi động lại phiên bản ffmpeg theo cách thủ công. Có thể yêu cầu ffmpeg "sập" (hoặc đơn giản là dừng quá trình của nó) khi không có đầu vào nào xuất hiện trên -tôi
địa chỉ (ở phía VPS)? Tôi đang sử dụng tập lệnh bash tự động khởi động lại quy trình, vì vậy điều đó đã được xử lý.
Chỉ để tránh bất kỳ sự nhầm lẫn:
Dựa theo tài liệu chính thức của ffmpeg các hết giờ
cờ lấy MICROSECONDS làm giá trị và nghe_timeout
mất GIÂY. Tôi đã thấy rất nhiều bài đăng mà mọi người tranh luận về điều đó :)