-
-
Save kou1okada/0446b9166c893774fbb836b1ca20daa7 to your computer and use it in GitHub Desktop.
checkdvgap.sh - Check DV-AVI files which have timecode gap.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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