#!/usr/bin/env bash
#
# push_stream.sh - 循环推视频文件到本机 ZLMediaKit
#
# 用法:
#   ./push_stream.sh <视频文件>               # MP4/H264/H265/AVI/MKV（流名=文件名）
#   ./push_stream.sh <视频文件> <流名>         # 自定义流名
#
# 环境变量（可选）:
#   ZLM_HOST       推流主机，默认 192.168.3.130
#   ZLM_RTMP_PORT  RTMP 端口，默认 1935
#   ZLM_RTSP_PORT  RTSP 端口，默认 554
#   ZLM_APP        应用名，默认 live
#   ZLM_PROTO      推流协议 rtmp|rtsp，默认 auto
#                  auto: 检测到 HEVC/H.265 时自动用 rtsp，其余用 rtmp
#                  注: 系统 ffmpeg 对 HEVC 不能 -c copy 写经典 FLV
#
# 示例:
#   ./push_stream.sh smoke_detection/cam-all/smoke-test.mp4
#   ./push_stream.sh smoke_detection/cam-all/smoke-test.mp4 smoke-test
#   ZLM_PROTO=rtsp ./push_stream.sh 64ee/206/29072026-483018.mp4 hevc-demo
#
# 拉流（默认配置下，ZLM 会协议转换）:
#   RTMP:  ffplay rtmp://192.168.3.130:1935/live/<流名>
#   RTSP:  ffplay rtsp://192.168.3.130:554/live/<流名>
#   HLS:   http://192.168.3.130/live/<流名>/hls.m3u8
#   FLV:   http://192.168.3.130/live/<流名>.live.flv
#

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# ---------- 参数 ----------
if [[ $# -lt 1 ]]; then
    echo "用法: $0 <视频文件> [流名]" >&2
    echo "      循环推流到本机 ZLMediaKit" >&2
    echo "示例: $0 smoke_detection/cam-all/smoke-test.mp4" >&2
    echo "      $0 smoke_detection/cam-all/smoke-test.mp4 smoke-test" >&2
    echo "环境变量: ZLM_HOST ZLM_RTMP_PORT ZLM_RTSP_PORT ZLM_APP ZLM_PROTO" >&2
    exit 1
fi

VIDEO="$1"
STREAM_NAME="${2:-}"

# 视频路径：相对脚本目录解析
if [[ "$VIDEO" != /* ]]; then
    VIDEO="${SCRIPT_DIR}/${VIDEO}"
fi

if [[ ! -f "$VIDEO" ]]; then
    echo "错误: 视频文件不存在: $VIDEO" >&2
    exit 1
fi

# 流名默认取视频文件名
if [[ -z "$STREAM_NAME" ]]; then
    STREAM_NAME="$(basename "$VIDEO")"
    STREAM_NAME="${STREAM_NAME%.*}"
fi

# ---------- 推流目标（本机 ZLMediaKit，可环境变量覆盖）----------
ZLM_HOST="${ZLM_HOST:-192.168.3.130}"
ZLM_RTMP_PORT="${ZLM_RTMP_PORT:-1935}"
ZLM_RTSP_PORT="${ZLM_RTSP_PORT:-554}"
ZLM_APP="${ZLM_APP:-live}"
ZLM_PROTO="${ZLM_PROTO:-auto}"

# HEVC 不能 copy 到经典 FLV/RTMP，auto 时自动切 RTSP
if [[ "${ZLM_PROTO}" == "auto" ]]; then
    VCODEC="$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 "$VIDEO" 2>/dev/null || true)"
    case "${VCODEC}" in
        hevc|h265|hevc*|h265*)
            ZLM_PROTO="rtsp"
            echo "  检测: 视频编码为 ${VCODEC}，自动使用 RTSP 推流" >&2
            ;;
        *)
            ZLM_PROTO="rtmp"
            ;;
    esac
fi

case "${ZLM_PROTO}" in
    rtmp)
        PUSH_URL="rtmp://${ZLM_HOST}:${ZLM_RTMP_PORT}/${ZLM_APP}/${STREAM_NAME}"
        FF_FMT=(-f flv)
        ;;
    rtsp)
        PUSH_URL="rtsp://${ZLM_HOST}:${ZLM_RTSP_PORT}/${ZLM_APP}/${STREAM_NAME}"
        FF_FMT=(-f rtsp -rtsp_transport tcp)
        ;;
    *)
        echo "错误: ZLM_PROTO 仅支持 auto、rtmp 或 rtsp，当前: ${ZLM_PROTO}" >&2
        exit 1
        ;;
esac

echo "  视频: ${VIDEO}"
echo "  流名: ${STREAM_NAME}"
echo "  协议: ${ZLM_PROTO}"
echo "  推送: ${PUSH_URL}"
echo "  模式: 循环推流"
echo ""
echo "  拉流:"
echo "    rtmp://${ZLM_HOST}:${ZLM_RTMP_PORT}/${ZLM_APP}/${STREAM_NAME}"
echo "    rtsp://${ZLM_HOST}:${ZLM_RTSP_PORT}/${ZLM_APP}/${STREAM_NAME}"
echo "    http://${ZLM_HOST}/${ZLM_APP}/${STREAM_NAME}.live.flv"
echo ""

set -x
exec ffmpeg \
    -re \
    -stream_loop -1 \
    -i "$VIDEO" \
    -c copy \
    "${FF_FMT[@]}" \
    "$PUSH_URL"
