การเขียน 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 ได้ครับ)

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Install and configure Zabbix Debian 12 and apache2

Batch file copy folder to another folder by date (ตั้งค่า copy folder เพื่อ backup โดยการ copy อัตโนมัติไปเก็บใน Folder ที่สร้างตามวันที่ปัจจุบัน)

วิธีการเช็ค Windows แท้ และดู Keys Windows 10/11