最近项目上遇到,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中拉流测试就行了
