summaryrefslogtreecommitdiff
path: root/bin/ipcam_rtsp2hls.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/ipcam_rtsp2hls.sh')
-rwxr-xr-xbin/ipcam_rtsp2hls.sh127
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