118 lines
1.9 KiB
Bash
Executable File
118 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
PROGNAME="$0"
|
|
PORT=554
|
|
IP=
|
|
CREDS=
|
|
DEBUG=0
|
|
CHANNEL=1
|
|
FORCE_UDP=0
|
|
FORCE_TCP=0
|
|
EXTENSION="mp4"
|
|
|
|
die() {
|
|
echo >&2 "error: $@"
|
|
exit 1
|
|
}
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
usage: $PROGNAME [OPTIONS] COMMAND
|
|
|
|
Options:
|
|
--outdir output directory
|
|
--ip camera IP
|
|
--port RTSP port (default: 554)
|
|
--creds
|
|
--debug
|
|
--force-tcp
|
|
--force-udp
|
|
--channel 1|2
|
|
|
|
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 | --creds | --outdir)
|
|
_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
|
|
;;
|
|
|
|
--mov)
|
|
EXTENSION="mov"
|
|
;;
|
|
|
|
--mpv)
|
|
EXTENSION="mpv"
|
|
;;
|
|
|
|
*)
|
|
die "Unrecognized argument: $1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
[ -z "$OUTDIR" ] && die "You must specify output directory (--outdir)."
|
|
[ -z "$IP" ] && die "You must specify camera IP address (--ip)."
|
|
[ -z "$PORT" ] && die "Port can't be empty."
|
|
[ -z "$CREDS" ] && die "You must specify credentials (--creds)."
|
|
validate_channel "$CHANNEL"
|
|
|
|
mountpoint "$(dirname "$OUTDIR")" || die "$(dirname "$OUTDIR") is not a mountpint!"
|
|
|
|
if [ ! -d "${OUTDIR}" ]; then
|
|
mkdir "${OUTDIR}" || die "Failed to create ${OUTDIR}/${NAME}!"
|
|
echo "Created $OUTDIR."
|
|
fi
|
|
|
|
args=
|
|
if [ "$DEBUG" = "1" ]; then
|
|
args="$args -v info"
|
|
else
|
|
args="$args -nostats -loglevel warning"
|
|
fi
|
|
|
|
[ ! -z "$CREDS" ] && CREDS="${CREDS}@"
|
|
|
|
ffmpeg -nostdin $args -rtsp_transport tcp -i rtsp://${CREDS}${IP}:${PORT}/Streaming/Channels/${CHANNEL} \
|
|
-c copy -f segment -strftime 1 -segment_time 00:10:00 -segment_format_options movflags=+faststart \
|
|
-segment_time_delta 0.01 -segment_atclocktime 1 -reset_timestamps 1 -bufsize 2M \
|
|
-reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 2 \
|
|
"$OUTDIR/record_%Y-%m-%d-%H.%M.%S.${EXTENSION}"
|