diff options
Diffstat (limited to 'bin/ipcam_rtsp2hls.sh')
-rwxr-xr-x | bin/ipcam_rtsp2hls.sh | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/bin/ipcam_rtsp2hls.sh b/bin/ipcam_rtsp2hls.sh new file mode 100755 index 0000000..c321820 --- /dev/null +++ b/bin/ipcam_rtsp2hls.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +PROGNAME="$0" +OUTDIR=/var/ipcamfs # should be tmpfs +PORT=554 +NAME= +IP= +USER= +PASSWORD= +DEBUG=0 +CHANNEL=1 +FORCE_UDP=0 +FORCE_TCP=0 +CUSTOM_PATH= + +die() { + echo >&2 "error: $@" + exit 1 +} + +usage() { + cat <<EOF +usage: $PROGNAME [OPTIONS] COMMAND + +Options: + --ip camera IP + --port RTSP port (default: 554) + --name camera name (chunks will be stored under $OUTDIR/{name}/) + --user + --password + --debug + --force-tcp + --force-udp + --channel 1|2 + --custom-path PATH + +EOF + exit +} + +validate_channel() { + local c="$1" + case "$c" in + 1|2) + : + ;; + *) + die "Invalid channel" + ;; + esac +} + +[ -z "$1" ] && usage + +while [[ $# -gt 0 ]]; do + case "$1" in + --ip|--port|--name|--user|--password) + _var=${1:2} + _var=${_var^^} + printf -v "$_var" '%s' "$2" + shift + ;; + + --debug) + DEBUG=1 + ;; + + --force-tcp) + FORCE_TCP=1 + ;; + + --force-udp) + FORCE_UDP=1 + ;; + + --channel) + CHANNEL="$2" + shift + ;; + + --custom-path) + CUSTOM_PATH="$2" + shift + ;; + + *) + die "Unrecognized argument: $1" + ;; + esac + shift +done + +[ -z "$IP" ] && die "You must specify camera IP address (--ip)." +[ -z "$PORT" ] && die "Port can't be empty." +[ -z "$NAME" ] && die "You must specify camera name (--name)." +[ -z "$USER" ] && die "You must specify username (--user)." +[ -z "$PASSWORD" ] && die "You must specify username (--password)." +validate_channel "$CHANNEL" + +if [ ! -d "${OUTDIR}/${NAME}" ]; then + mkdir "${OUTDIR}/${NAME}" || die "Failed to create ${OUTDIR}/${NAME}!" +fi + +args= +if [ "$DEBUG" = "1" ]; then + args="-v info" +else + args="-nostats -loglevel error" +fi + +if [ "$FORCE_TCP" = "1" ]; then + args="$args -rtsp_transport tcp" +elif [ "$FORCE_UDP" = "1" ]; then + args="$args -rtsp_transport udp" +fi + +if [ -z "$CUSTOM_PATH" ]; then + path="/Streaming/Channels/${CHANNEL}" +else + path="$CUSTOM_PATH" +fi + +ffmpeg $args -i "rtsp://${USER}:${PASSWORD}@${IP}:${PORT}${path}" \ + -c:v copy -c:a copy -bufsize 1835k \ + -pix_fmt yuv420p \ + -flags -global_header -hls_time 2 -hls_list_size 3 -hls_flags delete_segments \ + ${OUTDIR}/${NAME}/live.m3u8 |