-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpublish
executable file
·82 lines (69 loc) · 2.78 KB
/
publish
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/sh
set -e
# source env
. /tmp/livebox.env
# session id
SESSION="$(date -u +%s)"
# input arguments
APP="${1:-live}"
STREAM="${2:-livestream}"
echo "[$(date)] publish ${APP} stream ${STREAM} session ${SESSION} started"
cat /tmp/livebox.env
# setup the master m3u8 file for live
mkdir -p "${ROOT}" "${TMP}"
echo "#EXTM3U" > "${TMP}/${APP}.${STREAM}.m3u8"
for SUBSTREAM in ${SUBSTREAMS}; do
BITRATE="$(eval echo \${SUBSTREAM_${SUBSTREAM}_BITRATE:-4252000})"
CODECS="$(eval echo \${SUBSTREAM_${SUBSTREAM}_CODECS:-avc1.4d401f,mp4a.40.2})"
VIDEO_SIZE="$(eval echo \${SUBSTREAM_${SUBSTREAM}_VIDEO_SIZE:-1280x720})"
echo "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=${BITRATE},RESOLUTION=${VIDEO_SIZE},CODECS=\"${CODECS}\",NAME=\"${SUBSTREAM}\"" >> "${TMP}/${APP}.${STREAM}.m3u8"
echo "${STREAM}/${SUBSTREAM}.m3u8" >> "${TMP}/${APP}.${STREAM}.m3u8"
done
mv -f "${TMP}/${APP}.${STREAM}.m3u8" "${ROOT}/${STREAM}.m3u8"
# setup directory
mkdir -p "${ROOT}/${STREAM}/${APP}" "${ARCHIVE}"
cd "${ROOT}/${STREAM}/${APP}"
# parameters
OUTPUTS="-c copy -f flv ${ARCHIVE}/${APP}.${STREAM}.${SESSION}.flv"
for FORWARD in ${FORWARDS}; do
OUTPUTS="${OUTPUTS} -c copy -f flv rtmp://${FORWARD}/${APP}/${STREAM}"
done
SPLIT="0"
for SUBSTREAM in ${SUBSTREAMS}; do
SPLIT="$(expr 1 + ${SPLIT})"
done
FILTER="[0:v]split=${SPLIT}"
for SUBSTREAM in ${SUBSTREAMS}; do
FILTER="${FILTER}[${SUBSTREAM}-in]"
done
for SUBSTREAM in ${SUBSTREAMS}; do
VIDEO_SIZE="$(eval echo \${SUBSTREAM_${SUBSTREAM}_VIDEO_SIZE:-1280x720})"
VIDEO_FPS="$(eval echo \${SUBSTREAM_${SUBSTREAM}_VIDEO_FPS:-25})"
FILTER="${FILTER};[${SUBSTREAM}-in]fps=${VIDEO_FPS},scale=${VIDEO_SIZE}[${SUBSTREAM}-out]"
done
MAPS="-map 0:a"
for SUBSTREAM in ${SUBSTREAMS}; do
MAPS="${MAPS} -map [${SUBSTREAM}-out]"
done
TEE=""
V="0"
for SUBSTREAM in ${SUBSTREAMS}; do
TEE="${TEE}|[select=\'v\:${V},a\':hls_time=${HLS_TIME}:hls_list_size=$(expr 3 \* ${HLS_LIST_SIZE}):use_localtime=1:hls_flags=66:hls_segment_filename=${SESSION}.${SUBSTREAM}.%s.ts]${SUBSTREAM}.m3u8"
V="$(expr 1 + ${V})"
done
TEE="${TEE#|}"
# go
echo /bin/ffmpeg \
-i "rtmp://127.0.0.1/${APP}/${STREAM}" ${OUTPUTS} \
-c:v libx264 -vprofile ${VIDEO_PROFILE} -vlevel ${VIDEO_LEVEL} -c:a aac -ar ${AUDIO_SAMPLING_RATE} -ac ${AUDIO_CHANNELS} -b:a ${AUDIO_BITRATE} \
${EXTRA_OPTIONS} \
-force_key_frames "expr:gte(t,n_forced*${HLS_TIME})" \
-filter_complex "${FILTER}" \
${MAPS} -f tee "${TEE}"
exec /bin/ffmpeg \
-i "rtmp://127.0.0.1/${APP}/${STREAM}" ${OUTPUTS} \
-c:v libx264 -vprofile ${VIDEO_PROFILE} -vlevel ${VIDEO_LEVEL} -c:a aac -ar ${AUDIO_SAMPLING_RATE} -ac ${AUDIO_CHANNELS} -b:a ${AUDIO_BITRATE} \
${EXTRA_OPTIONS} \
-force_key_frames "expr:gte(t,n_forced*${HLS_TIME})" \
-filter_complex "${FILTER}" \
${MAPS} -f tee "${TEE}"