Skip to content

Instantly share code, notes, and snippets.

@kou1okada
Last active April 1, 2021 11:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kou1okada/0446b9166c893774fbb836b1ca20daa7 to your computer and use it in GitHub Desktop.
Save kou1okada/0446b9166c893774fbb836b1ca20daa7 to your computer and use it in GitHub Desktop.
checkdvgap.sh - Check DV-AVI files which have timecode gap.
#!/usr/bin/env bash
#
# checkdvgap.sh - Check DV-AVI files which have timecode gap.
# Copyright (c) 2021 Koichi OKADA. All rights reserved.
# This script is distributed under the MIT license.
#
source hhs.bash 0.2.0
function sec2hms () # [-v <var>] <sec>
{
local d h m s="${@: -1}"
local d=$((s / 86400)); s=$((s % 86400))
local h=$((s / 3600)); s=$((s % 3600))
local m=$((s / 60)); s=$((s % 60))
printf ${3:+${@:1:2}} "%d d %02d:%02d:%02d${3:-\n}" $d $h $m $s
}
function duration () # <DV-AVI file>
{
ffprobe -hide_banner -show_format -i "$1" 2>/dev/null | awk -vFS== '$1=="duration"{print $2}'
}
function checkdvgapone () # <DV-AVI file>
{
local fn="$1"
local tmpfn1="$(mktemp -u).avi"
local tmpfn2="$(mktemp -u).avi"
local dur0; read dur0 < <(duration "$fn")
local recdate0; read recdate0 < <(mediainfo --Inform="General;%Recorded_Date%" "$fn")
local recstamp0; read recstamp0 < <(date -d "$recdate0" +%s)
ffmpeg -hide_banner -i "$fn" -ss 5 -t 5 -c copy "$tmpfn1" 2>/dev/null
local dur1; read dur1 < <(duration "$tmpfn1")
local recdate1; read recdate1 < <(mediainfo --Inform="General;%Recorded_Date%" "$tmpfn1")
local recstamp1; read recstamp1 < <(date -d "$recdate1" +%s)
ffmpeg -hide_banner -ss $(bc <<< "$dur0 - 5") -i "$fn" -c copy "$tmpfn2" 2>/dev/null
local dur2; read dur2 < <(duration "$tmpfn1")
local recdate2; read recdate2 < <(mediainfo --Inform="General;%Recorded_Date%" "$tmpfn2")
local recstamp2; read recstamp2 < <(date -d "$recdate2" +%s)
local gap; let "gap = (recstamp2 - recstamp1) - (${dur0%.*} - ${dur2%.*})"
local dur; dur=$( bc <<< "$recstamp2 - $recstamp1 + $dur2 + 5" )
echo "$fn"
echo "clip0 : $recdate0 $recstamp0 $dur0"
echo "clip1 : $recdate1 $recstamp1 $dur1"
echo "clip2 : $recdate2 $recstamp2 $dur2"
printf "Total : %15.6f (%s)\n" $dur "$(sec2hms ${dur%.*})"
printf "Duration : %15.6f (%s)\n" $dur0 "$(sec2hms ${dur0%.*})"
printf "Duration1 : %15.6f (%s)\n" $dur1 "$(sec2hms ${dur1%.*})"
printf "Duration2 : %15.6f (%s)\n" $dur2 "$(sec2hms ${dur2%.*})"
printf "Gap : %15.6f (%s)\n" $gap "$(sec2hms $gap)"
if (( gap > 10 )); then
echo "May be have a gap."
fi
echo
rm "$tmpfn1" "$tmpfn2"
}
function checkdvgap () # [<DV-AVI file> ...]
# Check DV-AVI files which have timecode gap.
{
(( $# <= 0 )) && { invoke_usage; exit; }
local i
for i; do
checkdvgapone "$i"
done
}
invoke_command "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment