การเขียน script run ffmpeg stream (rtmp,udp,hls) และ check process down ให้กลับมาเล่นใหม่อีกครั้ง
การเขียน Script sh แปลง Stream (rtmp,udp,hls) และ check process ถ้าดับให้ทำการ restart process
1. ไปที่ /home/user (path ที่ต้องการเขียน script)
2. nano streams.txt (สร้างไฟล์ streams.txt) ใส่ค่า ดังนี้
# รูปแบบใช้เครื่องหมาย , หลังลิ้ง stream เพื่อตั้งเป็นชื่อของ stream นั้นๆ
rtmp://192.168.1.50/live/stream1,stream1
rtmp://192.168.1.50/live/stream2,stream2
rtmp://192.168.1.50/live/stream3,stream3
udp://@239.0.187.23:1234?fifo_size=5000000,stream4
udp://@239.0.187.24:1234?fifo_size=5000000,stream5
เสร็จแล้วกด ctrl + x และกด y เพื่อทำการบันทึก
3. nano live_monitor.sh (สร้างไฟล์ live_monitor.sh) ใส่ค่า ดังนี้
#!/bin/bash
# โฟลเดอร์หลักสำหรับเก็บไฟล์ HLS (.m3u8 และ .ts)
HLS_OUTPUT_DIR="/var/www/html/m3u8/"
CONFIG_FILE="streams.txt"
# ตรวจสอบว่ามีโฟลเดอร์ Output หรือยัง
mkdir -p "$HLS_OUTPUT_DIR"
echo "=== Starting Stream Monitor Service ==="
while true; do
# อ่านไฟล์ streams.txt ทีละบรรทัด
while IFS=',' read -r rtmp_url stream_name || [ -n "$rtmp_url" ]; do
# ข้ามบรรทัดว่างหรือบรรทัดที่เป็น Comment (#)
[[ -z "$rtmp_url" || "$rtmp_url" =~ ^# ]] && continue
# กำหนดโฟลเดอร์ย่อยของแต่ละ stream
OUTPUT_PATH="$HLS_OUTPUT_DIR/$stream_name"
mkdir -p "$OUTPUT_PATH"
# เช็คว่ามี process ffmpeg ของ stream นี้รันอยู่หรือไม่
# โดยการค้นหาจากชื่อ stream_name ในคำสั่ง ps
PID=$(ps aux | grep "ffmpeg" | grep "$rtmp_url" | grep -v grep | awk '{print $2}')
if [ -z "$PID" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stream '$stream_name' โหลดดับไป! กำลังเริ่มรันใหม่..."
# คำสั่ง FFmpeg สำหรับแปลง RTMP,hls,udp เป็น HLS (ปรับแต่ง Flag ได้ตามต้องการ)
ffmpeg -fflags +genpts -async 1 \
-avoid_negative_ts make_zero \
-i "$rtmp_url" \
-c:v copy -c:a copy \
-f hls \
-hls_time 4 \
-hls_list_size 5 \
-hls_flags delete_segments+append_list \
-hls_segment_filename "$OUTPUT_PATH/seq_%d.ts" \
"$OUTPUT_PATH/index.m3u8" > /dev/null 2>&1 &
# หมายเหตุ: -c:v copy และ -c:a copy คือการส่งผ่านสัญญาณโดยไม่ Encode ใหม่ ซึ่งประหยัด CPU มาก
# หากต้องการย่อขนาดหรือปรับบิตเรต ต้องเปลี่ยนตรงนี้ (แต่ถ้ามากกว่า 70 ลิ้ง stream CPU อาจจะพุ่งสูง)
fi
done < "$CONFIG_FILE"
# เว้นระยะเวลาในการเช็คทุกๆ 10 วินาที เพื่อไม่ให้กิน CPU เกินไป
sleep 10
done
เสร็จแล้วกด ctrl + x และกด y เพื่อทำการบันทึก
4. พิมพ์ chmod +x live_monitor.sh (กำหนดสิทธิ์ในการ execute ไฟล์)
5. nano restart_process.sh (สร้างไฟล์ restart_process.sh) และใส่ค่า ดังนี้
#!/bin/sh
# 1. Terminate the existing process gracefully
pkill -f "ffmpeg"
# 2. Wait a brief moment for the process to release resources (กำหนดหน่วงเวลาหน่วยเป็นวินาที)
sleep 2
# 3. Start the process again in the background
nohup /home/user/live_monitor.sh > /home/user/monitor.log 2>&1 &
เสร็จแล้วกด ctrl + x และกด y เพื่อทำการบันทึก
6. พิมพ์ chmod +x live_monitor.sh (กำหนดสิทธิ์ในการ execute ไฟล์)
7. run คำสั่ง /home/user/restart_process.sh > /home/user/restart_process.log 2>&1 & (จะรันคำสั่ง kill process ffmpeg และ run ffmpeg เพื่อแปลงไฟล์อีกครั้งเพื่อแก้ไข process ffmpeg เกิดจอดำ และ ffmpeg ดับไป จะกลับมารันไหม่อีกครั้ง โดยสามารถเอา command ไปตั้งเป็น schedule crontab ในการตั้งเวลา run command ได้ครับ)
ความคิดเห็น
แสดงความคิดเห็น