För några år sedan så digitaliserade jag våra videoband hemma i Tvärlandsböle. Den gången använde jag mig av VirtualDub tillsammans med ett PCI-capturekort från Hauppauge. VirtualDub är ett mycket kompetent program och fungerade ypperligt för ändamålet. Nackdelen är dock att det inte har någon Linux-version utan endast fungerar på Windows.
För någon månad sedan så erbjöd jag mig att digitalisera videobanden som Patricias familj spelat in. Det är inspelningar från perioden 1992-2003, totalt 19 band av typen VHS-C, några 30-minutersband och de flesta 45-minutersband.
Denna gång ville jag göra allt med hjälp av Linux och öppen källkod eftersom det finns en mängd verktyg för video-fångning och -bearbetning skrivna för just Linux. Jag tänker på bland annat Libav, FFMPEG, gstreamer, VLC, MLT och säkert många andra.
En fördel med dessa verktyg är att de till skillnad från många Windows-baserade verktyg har ett så kallat CLI (command line interface). Det vill säga att det går att styra programmen med hjälp av textkommandon. Detta öppnar för möjligheten att skripta sekvensen av kommandon som krävs för hela processen med videobearbetningen.
Arbetet utmynnade i två skript, det första fångar video och bild i råformat i realtid till hårddisken.
#!/bin/bash
# Args:
# 1: filename
# Create output-folder if it dont exist
mkdir -p raw
filename=raw/${1}.avi
# Check available disk space
echo 'Available disk space: '
df -kh /home | tail -1 | awk '{ print $4}'
sudo nice -n -19 gst-launch-1.0 -v avimux name=mux v4l2src device=/dev/video0 do-timestamp=true ! \
'video/x-raw,format=(string)YV12,width=(int)720,height=(int)576' ! videorate ! \
'video/x-raw,format=(string)YV12,framerate=25/1' ! videoconvert ! \
'video/x-raw,format=(string)YV12,width=(int)720,height=(int)576' ! jpegenc quality=95 ! \
queue ! mux. alsasrc device=default ! \
'audio/x-raw,format=(string)S16LE,rate=(int)48000,channels=(int)2' ! \
audiorate ! audioresample ! 'audio/x-raw,rate=(int)44100' ! \
audioconvert ! 'audio/x-raw,channels=(int)1' ! \
queue ! mux. mux. ! \
filesink location=$filename
Det andra skriptet trimmar längden på filmen och komprimerar ljud och bild till ett format som tar mycket mindre plats.
#!/bin/bash
# Create folders if they dont exist
mkdir -p output
# Argss:
# 1: filename
# 2: start_time = hh:mm:ss
# 3: duration = end_time - start_time (hh:mm:ss)
# 4: part_nr of band (Optional)
# Filenames
infile=raw/${1}.avi
if [ ${4} ]; then
outfile=output/${1}_${4}.mp4
else
outfile=output/${1}.mp4
fi
start_time=${2}
duration=${3}
echo 'Encode h.264/mp3 output'
avconv \
-i $infile \
-ss $start_time \
-t $duration \
-c:a mp3 \
-ar 44100 \
-ab 96k \
-c:v libx264 \
-crf 26 \
-crf_max 35 \
-aspect 4:3 \
-vf yadif \
$outfile
Videon komprimeras med ett H.264-baserat codec som heter x264. Ljudet komprimeras MP3-format.
För att få en uppfattning om skillnaderna i filstorlek kan jag som riktlinje säga att den okomprimerade filmen är på ca 7 GB för en 45-minuters film och efter komprimeringen tar den upp ca 0,5 GB. Detta alltså utan syn- eller hörbar försämring av bild- och ljudkvalitet.
Den senaste versionen av skripten finns alltid på min Github-sida för den som är intresserad.
Sammanfattningsvis var det ett mycket intressant och lärorikt projekt. Och nu när man har arbetat framett arbetssätt och en uppsättning skript så kommer arbetet att gå betydligt fortare nästa gång det är dags för ett video-digitaliseringsprojekt.