直播源地址代理服务转发

最近项目上遇到,IPTV网关给的播放地址太高清了,客户的设备无法播放。并且也没有普通清晰度的地址。这里利用ffmpeg来做一层服务转发,达到降低源质量的目的。

1、服务启动脚本

复制代码
#!/bin/bash

BASE_DIR="/var/www/hls"
LOG_DIR="/var/log/live_proxy"
FFMPEG="/application/ffmpeg-7.0.2-amd64-static/ffmpeg"

RESOLUTION="320:180"
FRAMERATE=15
VIDEO_BITRATE="300k"
AUDIO_BITRATE="96k"

HLS_TIME=6
HLS_LIST_SIZE=10

mkdir -p "$BASE_DIR"
mkdir -p "$LOG_DIR"

# ===============================
# 频道列表
# ===============================
STREAMS=(
"cctv1|http://101.74.28.215:9901/tsfile/live/1005_1.m3u8?key=txiptv&playlive=0&authid=0"
"cctv2|http://183.215.134.239:19901/tsfile/live/0002_1.m3u8?key=txiptv&playlive=1&authid=0"
)

# ===============================
# 启动单个代理
# ===============================
start_stream() {

NAME=$1
URL=$2

OUT_DIR="$BASE_DIR/$NAME"
LOG_FILE="$LOG_DIR/$NAME.log"

mkdir -p "$OUT_DIR"
rm -f "$OUT_DIR"/*.ts "$OUT_DIR"/*.m3u8

while true
do

echo "$(date) 启动 $NAME" >> "$LOG_FILE"

"$FFMPEG" \
-loglevel warning \
-reconnect 1 \
-reconnect_streamed 1 \
-reconnect_delay_max 5 \
-reconnect_at_eof 1 \
-analyzeduration 20000000 \
-probesize 20000000 \
-fflags +genpts+nobuffer \
-i "$URL" \
-map 0 \
-vf scale=$RESOLUTION \
-r $FRAMERATE \
-c:v libx264 -preset ultrafast -tune zerolatency -b:v $VIDEO_BITRATE \
-c:a aac -b:a $AUDIO_BITRATE -ac 2 -ar 44100 \
-af aresample=async=1:first_pts=0 \
-f hls \
-hls_time $HLS_TIME \
-hls_list_size $HLS_LIST_SIZE \
-hls_flags delete_segments+omit_endlist \
-hls_segment_filename "$OUT_DIR/live_%05d.ts" \
"$OUT_DIR/live.m3u8" >> "$LOG_FILE" 2>&1

echo "$(date) $NAME 断流重启" >> "$LOG_FILE"

sleep 5

done

}

# ===============================
# 启动所有代理
# ===============================

for item in "${STREAMS[@]}"
do

NAME=$(echo $item | cut -d'|' -f1)
URL=$(echo $item | cut -d'|' -f2)

start_stream "$NAME" "$URL" &

echo "启动频道 $NAME"

done

echo ""
echo "=============================="
echo "直播代理启动完成"
echo "播放地址示例:"
echo "http://服务器IP/hls/cctv13/live.m3u8"
echo "http://服务器IP/hls/cctv1/live.m3u8"
echo "=============================="

启动脚本

2、停止脚本

复制代码
#!/bin/bash

echo "正在停止直播转发..."

# 杀掉 start_stream.sh 脚本循环进程
PIDS=$(pgrep -f start_stream.sh)
if [ -n "$PIDS" ]; then
    echo "找到 start_stream.sh 进程:$PIDS"
    kill $PIDS
    sleep 1
else
    echo "没有找到 start_stream.sh 进程"
fi

# 再杀掉所有 FFmpeg 子进程
FFMPEG_PIDS=$(pgrep -f "/application/ffmpeg-7.0.2-amd64-static/ffmpeg")
if [ -n "$FFMPEG_PIDS" ]; then
    echo "找到 ffmpeg 进程:$FFMPEG_PIDS"
    kill $FFMPEG_PIDS
    sleep 1
else
    echo "没有找到 ffmpeg 进程"
fi

echo "直播转发已停止。"

停止脚本

3、需要安装ffmpeg。这个很简单,不细说。

4、nginx 配置

复制代码
server {
    listen       1936;           # 拉流使用的端口
    server_name  localhost;

    # 拉 HLS 的配置
    location /hls {
        root /var/www;

        types {
            application/vnd.apple.mpegurl  m3u8;
            video/mp2t                     ts;
        }

        add_header Cache-Control  no-cache;
    }
}

Nginx

5、根据启动日志,到VCL中拉流测试就行了