나는 보고 있는 방의 움직임을 감지할 때마다 Arch Linux 상자의 FTP 폴더에 JPEG 이미지를 업로드하는 IP 카메라를 가지고 있습니다. 모든 모션 활동이 중지될 때까지 초당 하나의 JPEG를 업로드합니다.
다음과 같은 방식으로 JPEG 파일의 이름을 지정합니다.
이를 분석하면 다음을 의미합니다.
name-of-camera(inside)_1_YEAR-MONTH-DATE-TIME-SECONDS_imagenumber.jpg
초당 1프레임의 비디오를 만들 수 있는 스크립트를 원 ffmpeg
하지만(쉬운 줄 압니다) 서로 2초 이상 떨어져 있지 않은 이미지로만 비디오를 만들 수 있을 만큼 똑똑해야 합니다. JPEG를 사용하는 것을 제거하세요. 네트워크 지연과 프레임 손실을 방지하기 위해 "2초 간격"이라고 말합니다.
촬영 후 2초 이내에 촬영된 모든 이미지는 자체 동영상이 되어야 합니다. 따라서 기본적으로 카메라가 보는 모든 모션 "이벤트"에서 비디오를 생성할 수 있어야 합니다.
zoneminder
나는 프로그램이 motion
이것을 좋아하고 할 수 있다는 것을 알고 있지만 스크립트를 디자인하고 싶습니다. 어떤 아이디어라도 대단히 감사하겠습니다.
답변1
날짜를 기준으로 타임스탬프를 생성하고 각 파일 사이의 범위를 확인할 수 있습니다. 의견에서 이미 언급했듯이 한 가지 문제는 일광 절약 시간입니다. 날짜/시간이 로케일에 따라 다르다고 가정합니다.
stat
파일 이름 대신 기본으로 사용하는 것이 도움이 될 수 있습니다. 그러나 이 이득은 파일 업로드 방식(타임스탬프 보존 여부 등)에 따라 달라집니다.
시작점으로(예상보다 훨씬 오래 걸릴 것임) 다음과 같이 시도해 볼 수 있습니다.
#!/bin/bash
declare -a fa_tmp=() # Array holding tmp files with jpg collections.
declare dd="" # Date extracted form file name.
declare -i ts=0 # Time stamp from date.
declare -i pre=0 # Previous time stamp.
declare -i lim=2 # Limit in seconds triggering new collection.
fmt_base='+%F-%H_%M_%S' # Format for date to generate video file name.
# Perhaps better using date from file-name:
# export TZ=UTC
# stat --printf=%Y $f
# Loop all jpg files
for f in *.jpg; do
# Extract date, optionally use mktime() with gawk.
# This assumes XX_XX_DATETIME_XXX... by split on underscore.
dd=$(printf "$f" | tr '_' ' ' | awk '{
printf("%d-%02d-%02d %02d:%02d:%02d",
substr($3, 1, 4),
substr($3, 5, 2),
substr($3, 7, 2),
substr($3, 9, 2),
substr($3, 11, 2),
substr($3, 13, 2))
}')
# Create time stamp from date.
ts=$(date +%s -d "$dd")
# If duration is greater then lim, create new tmp file.
if ((ts - pre > lim)); then
f_tmp="$(mktemp)"
fa_tmp+=("$f_tmp")
# First line in tmp file is first time stamp.
printf "%s\n" "$ts" >> "$f_tmp"
fi
# Add filename to current tmp file.
printf "%s\n" "$f" >> "$f_tmp"
# Previous is current.
pre="$ts"
done
declare -i i=1
# Loop tmp files.
for f_tmp in "${fa_tmp[@]}"; do
printf "PROCESSING: %s\n---------------------------\n" "$f_tmp"
base=""
i=1
# Rename files.
while read -r img; do
# First line is time stamp and is used as base for name.
if [[ "$base" == "" ]]; then
base=$(date "$fmt_base" -d "@$img")
continue
fi
# New image name.
iname=$(printf "%s-%04d.jpg" "$base" "$i")
echo "mv '$img' => '$iname'"
mv "$img" "$iname"
((++i))
done <"$f_tmp"
# Generate video.
if ffmpeg -f image2 \
-framerate 3 \
-pattern_type sequence \
-start_number 1 \
-i "$base-%04d.jpg" \
-vcodec mpeg4 \
-r 6 \
"$base.mp4"; then
# Iff success, move jpg's to backup folder.
mkdir "$base"
mv $base-*.jpg "$base"
else
printf "FAILED:\n" >&2
ls $base-*.jpg >&2
fi
# Remove tmp file.
rm "$f_tmp"
done