From 8f49a9922b7c6f7c1e515cf4b048f144ec0f06a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Wed, 21 May 2025 11:36:49 +0800 Subject: [PATCH] xxx --- builder/stream.sh | 67 +++++++++++++++++++++ environment.sh | 22 ++++--- init/2.volumn.sh | 8 +++ init/7.srs.sh | 26 ++++++--- init/volumes/srs/conf/srs.conf | 30 +++++++++- nginx/Dockerfile.nginx | 4 ++ start/nginx.sh | 2 + start/stream.sh | 23 ++++++++ start/说明.md | 6 ++ test/player.html | 104 +++++++++++++++++++++++++++++++++ 10 files changed, 275 insertions(+), 17 deletions(-) create mode 100755 builder/stream.sh create mode 100755 start/stream.sh create mode 100644 test/player.html diff --git a/builder/stream.sh b/builder/stream.sh new file mode 100755 index 0000000..5521fbb --- /dev/null +++ b/builder/stream.sh @@ -0,0 +1,67 @@ +#!/bin/bash +source ../environment.sh +# 检查必要的环境变量 +if [ -z "$STREAM_REMOTE_JAR" ]; then + echo "Error: STREAM_REMOTE_JAR environment variable is not set" + exit 1 +fi + +if [ -z "$STREAM_IMAGE" ]; then + echo "Error: STREAM_IMAGE environment variable is not set" + exit 1 +fi + +if [ -z "$STREAM_JAR" ]; then + echo "Error: STREAM_JAR environment variable is not set" + exit 1 +fi + +# 创建临时构建目录 +BUILD_DIR=$(mktemp -d) +trap 'rm -rf "$BUILD_DIR"' EXIT + +# 复制JAR文件 +echo "Copying JAR file from $STREAM_REMOTE_JAR" +cp "$STREAM_REMOTE_JAR" "$BUILD_DIR/${STREAM_JAR}" + +# 检查JAR文件是否复制成功 +if [ ! -f "$BUILD_DIR/${STREAM_JAR}" ]; then + echo "Error: Failed to copy JAR file" + exit 1 +fi + +# 创建Dockerfile +cat > "$BUILD_DIR/Dockerfile" << EOF +FROM registry.t-aaron.com/tuoheng/ffmpeg:latest + +# 设置工作目录 +WORKDIR /app + +# 设置时区 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone + +# 创建数据目录 +RUN mkdir -p /data/temp && chmod 777 /data/temp +# 创建数据目录 +RUN mkdir -p /data/recording && chmod 777 /data/recording +# 创建数据目录 +RUN mkdir -p /data/record && chmod 777 /data/record + +# 复制JAR文件 +COPY ${STREAM_JAR} /app/ + +# 设置启动命令 +ENTRYPOINT ["java", "-jar", "/app/${STREAM_JAR}"] +EOF + +# 构建Docker镜像 +echo "Building Docker image: $STREAM_IMAGE" +docker build -t "$STREAM_IMAGE" "$BUILD_DIR" + +# 清理 +# rm -rf "$BUILD_DIR" + +echo "Docker image $STREAM_IMAGE has been built successfully" + +docker push $STREAM_IMAGE \ No newline at end of file diff --git a/environment.sh b/environment.sh index 819b434..b4a20d3 100644 --- a/environment.sh +++ b/environment.sh @@ -17,8 +17,9 @@ export OIDC_SERVER_DOMAIN=oidc-${DOMAIN}.${DOMAIN_END} export MINIO_DOMAIN=minio-${DOMAIN}.${DOMAIN_END} export MINIO_CONSOLE_DOMAIN=minioconsole-${DOMAIN}.${DOMAIN_END} export AIRPORT_DOMAIN=airport-${DOMAIN}.${DOMAIN_END} - +export SRS_DOMAIN=srs-${DOMAIN}.${DOMAIN_END} export REGISTRY_HOST=${REGISTRY}/tuoheng/ + #export REGISTRY_HOST="" #Nginx 配置 @@ -64,18 +65,17 @@ export KAFKA_MEMORY=1g export KAFKA_DATA=${NETWORK}_kafka_data #SRS 配置 -# SRS对外爆露端口 -export SRS_NAME=SRS_${DOMAIN} -export SRS_HTTP_PORT=8080 +# SRS对外爆露端口 Name比较特别,没有DOAMIN后缀 +export SRS_NAME=SRS +#export SRS_HTTP_PORT=8080 export SRS_RTMP_PORT=1935 export SRS_RTC_PORT=8000 export SRS_MEMORY=512m export SRS_IMAGE=registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 export SRS_DATA=${NETWORK}_srs_data - -#Minio 配置 -export MINIO_NAME=MINIO_${DOMAIN} +#Minio 配置 Name比较特别,没有DOAMIN后缀 +export MINIO_NAME=MINIO export MINIO_MEMORY=512m export MINIO_IMAGE=quay.io/minio/minio export MINIO_DATA=${NETWORK}_minio_data @@ -147,6 +147,14 @@ export GATEWAY_JAR=tuoheng_gateway.jar export GATEWAY_REMOTE_JAR=/home/th/workspace/test/swarm/dockerfile/gateway/${GATEWAY_JAR} export GATEWAY_MEMORY=1g +#流媒体录制配置 +export STREAM_NAME=STREAM +export STREAM_IMAGE=${REGISTRY_HOST}stream:${DOMAIN} +export STREAM_REMOTE_JAR=/Users/sunpeng/workspace/ideaproject/stream_server/target/stream_server-0.0.1-SNAPSHOT.jar +export STREAM_MEMORY=1g +export STREAM_JAR=stream_server-0.0.1-SNAPSHOT.jar +export STREAM_DATA=${NETWORK}_stream_data + #河湖长 export HHZ_API_NAME=HHZ-API${DOMAIN} export HHZ_API_IMAGE=${REGISTRY_HOST}hhzapi:${DOMAIN} diff --git a/init/2.volumn.sh b/init/2.volumn.sh index 7098dd3..e9feec6 100755 --- a/init/2.volumn.sh +++ b/init/2.volumn.sh @@ -50,3 +50,11 @@ if ! docker volume inspect ${KAFKA_DATA} >/dev/null 2>&1; then else echo "${KAFKA_DATA} 卷已存在" fi + +source ../environment.sh +if ! docker volume inspect ${STREAM_DATA} >/dev/null 2>&1; then + docker volume create ${STREAM_DATA} + echo "创建 ${STREAM_DATA} 卷成功" +else + echo "${STREAM_DATA} 卷已存在" +fi \ No newline at end of file diff --git a/init/7.srs.sh b/init/7.srs.sh index 0049a66..781510b 100755 --- a/init/7.srs.sh +++ b/init/7.srs.sh @@ -20,10 +20,7 @@ if [ -z "$SRS_RTMP_PORT" ]; then echo "错误: 未找到 SRS_RTMP_PORT 环境变量" exit 1 fi -if [ -z "$SRS_HTTP_PORT" ]; then -echo "错误: 未找到 SRS_HTTP_PORT 环境变量" -exit 1 -fi + if [ -z "$SRS_RTC_PORT" ]; then echo "错误: 未找到 SRS_RTC_PORT 环境变量" exit 1 @@ -39,16 +36,29 @@ if docker ps -a | grep -q ${SRS_NAME}; then docker rm ${SRS_NAME} >/dev/null 2>&1 fi +# 在容器内检查并创建必要的目录结构 +echo "检查SRS目录结构..." +docker run --rm \ + -v "${SRS_DATA}:/usr/local/srs/objs/nginx/html" \ + $SRS_IMAGE \ + /bin/sh -c ' + if [ -d "/usr/local/srs/objs/nginx/html/record" ]; then + echo "record目录已存在,跳过创建" + else + echo "创建record目录..." + mkdir -p /usr/local/srs/objs/nginx/html/record + fi + ' + # 启动SRS容器 -# 启动SRS容器 +# 启动SRS容器 默认也有8080端口 docker run -d \ --name ${SRS_NAME} \ --network $NETWORK \ --memory $SRS_MEMORY \ --restart unless-stopped \ -p ${SRS_RTMP_PORT}:1935 \ - -p ${SRS_HTTP_PORT}:8080 \ -p ${SRS_RTC_PORT}:8000/udp \ - -v "$(pwd)/volumes/srs/conf/srs.conf:/usr/local/srs/conf/srs.conf" \ - -v "${SRS_DATA}:/usr/local/srs/objs" \ + -v "$(pwd)/volumes/srs/conf/srs.conf:/usr/local/srs/conf/docker.conf" \ + -v "${SRS_DATA}:/usr/local/srs/objs/nginx/html" \ $SRS_IMAGE diff --git a/init/volumes/srs/conf/srs.conf b/init/volumes/srs/conf/srs.conf index 5ebe7e6..781bd0d 100644 --- a/init/volumes/srs/conf/srs.conf +++ b/init/volumes/srs/conf/srs.conf @@ -1,7 +1,7 @@ listen 1935; max_connections 1000; -srs_log_tank file; -srs_log_file ./objs/srs.log; +srs_log_tank console; +daemon off; http_server { enabled on; @@ -15,13 +15,39 @@ rtc_server { } vhost __defaultVhost__ { + + dvr { + enabled on; + #all表示录制所有视频流,也可以按频道录制 + #规则为/,例:live/stream1 live/stream2 + #规则为/,例:live/stream1 live/stream2 + dvr_apply all; + #dvr计划 + dvr_plan segment; + #录制的路径,详细配置规则见附录三 + dvr_path ./objs/nginx/html/record/[2006][01][02]/[app][stream]/[timestamp].flv; + #segment方式录制时间设置,单位: s + dvr_duration 900; + #开启按关键帧且flv + dvr_wait_keyframe on; + #时间戳抖动算法。full使用完全的时间戳矫正; + #zero只是保证从0开始;off不矫正时间戳。 + time_jitter full; + } + + rtc { enabled on; + # 开启rtc录制 + rtmp_to_rtc on; + rtc_to_rtmp on; } + http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } + hls { enabled on; hls_path ./objs/nginx/html; diff --git a/nginx/Dockerfile.nginx b/nginx/Dockerfile.nginx index 3f762df..8fd0ef8 100644 --- a/nginx/Dockerfile.nginx +++ b/nginx/Dockerfile.nginx @@ -6,6 +6,10 @@ RUN rm -rf /etc/nginx/conf.d/* # 创建目标目录 RUN mkdir -p /data/tuoheng_airport_web/dist +# 创建视频录制和图片的地址 +RUN mkdir -p /data/recording +RUN mkdir -p /data/srs + # 复制temp_vhosts配置到nginx配置目录 COPY temp_vhosts/ /etc/nginx/conf.d/ diff --git a/start/nginx.sh b/start/nginx.sh index 2dcf8d7..3bd44c5 100755 --- a/start/nginx.sh +++ b/start/nginx.sh @@ -16,6 +16,8 @@ docker run --pull always -d \ -p ${NGINX_HTTPS_PORT}:443 \ --env TZ=Asia/Shanghai \ --memory ${NGINX_MEMORY} \ +--volume ${STREAM_DATA}:/data/recording \ +--volume ${SRS_DATA}:/data/srs \ --restart unless-stopped \ ${NGINX_IMAGE} diff --git a/start/stream.sh b/start/stream.sh new file mode 100755 index 0000000..2b5edce --- /dev/null +++ b/start/stream.sh @@ -0,0 +1,23 @@ +source ../environment.sh + + +if docker ps -a | grep -q ${STREAM_NAME}; then + echo "停止并删除已存在的 STREAM_NAME 容器..." + docker stop ${STREAM_NAME} >/dev/null 2>&1 + docker rm ${STREAM_NAME} >/dev/null 2>&1 +fi + + +docker run --pull always -d \ +--name ${STREAM_NAME} \ +--network ${NETWORK} \ +-p 8181:8080 \ +--memory ${STREAM_MEMORY} \ +-e srs.domain=${SRS_DOMAIN} \ +-e srs.name=${SRS_NAME} \ +-e recordPath=/data/record/record/ \ +-e cangneiwai=true \ +-v ${STREAM_DATA}:/data/recording \ +-v ${SRS_DATA}:/data/record \ +--restart unless-stopped \ +${STREAM_IMAGE} \ No newline at end of file diff --git a/start/说明.md b/start/说明.md index 5e80c27..49c70eb 100644 --- a/start/说明.md +++ b/start/说明.md @@ -19,6 +19,12 @@ nginx的vhosts里面的cert文件需要更新为域名的配置文件 docker exec KAFKA_bazhong /opt/bitnami/kafka/bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list 3: 建minio的权限 +其他: + srs: 推流: rtmp://srs-bazhong.t-aaron.com/live/1 + 读流: https://srs-bazhong.t-aaron.com:2443/live/1.flv + + 录制地址:https://srs-bazhong.t-aaron.com:2443/recording/50ae8720-d8b3-40c6-9e2b-4eb31ed619e6.mp4 + 部署在大数据服务器: 低空(预备) 大数据的mysql的数据 diff --git a/test/player.html b/test/player.html new file mode 100644 index 0000000..4760855 --- /dev/null +++ b/test/player.html @@ -0,0 +1,104 @@ + + + + + + 视频播放器 + + + +
+

视频播放器

+
+ +
+
+ + + + +
+
+ + + + \ No newline at end of file