Table of Contents

C3Tracker: Repair

subpage of c3tracker

Es gibt verschiedene Arten von Defekten, sowie verschiedene Lösungsansätze:

Defekte Timestamps

Falls das Recording zu früh gestoppt, oder neu gestartet wurde kann es Probleme mit den Timestamps im TS geben. Dies äußert sich z.B. dadurch das Shotcut oder VLC beim Abspielen des uncut.ts keine Timestamps mehr anzeigt.

Kappute Schnipsel verschieben

Im einfachsten Fall reicht es die kaputten Schnipsel in einen Unterordner zu verschieben, das Recording Ticket im Tracker auf recorded zu setzen und es dadurch vom entsprechenden Worker neu, und dadurch ohne diese defekten Schnipsel, auf prepared setzen zu lassen.

Timestamps mit ffmpeg reparieren

Falls das nicht funktioniert kann man die Timestamps mit ffmpeg neu setzen und diese als repair-File (siehe 'Manually repairing a Recording') zu setzen.

Important: Die Ursache für nicht-kontinuierliche Timestamps in den Schnipseln ist meist ein unterbrochenes Recording, es ist also zu prüfen ob es “Lücken” in der Aufnahme gibt! Diese werden mit diesen Schritten nahtlos weggebügelt und sind später nicht mehr automatisiert zu erkennen! Aufschluss über Anzahl und zeitliche Position der Lücken gibt sowohl der Zeitstempel als auch der Zähler im Suffix der Dateinamen der Schnipsel.

Zum Reparieren der Timestamps wird das vorhandene, aber “kaputte” uncut.ts aus dem Fusemount nochmal mit FFmpeg remuxed, das Recordingticket muss sich also mindestens im Status “prepared” befinden, wobei kein SourceReplacement gesetzt sein darf:

ffmpeg -i /video/fuse/event/room/1234/uncut.ts -c copy -f mpegts  -map 0:0 -map 0:1 -map 0:2 -map 0:3 /video/tmp/event/repair/1234-remux.ts

Anschließend mit dem Reparaturprozess (nächster Abschnitt) fortfahren.

Manually repairing a Recording (TS)

Das reparierte Material wird im gleichen Format wie das Capture zur Verfügung gestellt, also MPEG2-TS mit 4 Audiospuren etc.pp. Dabei wird im Prozess zwar noch vor dem Schnitt eingesetzt, ein Abstecken mit KDEnlive erfolgt aber nicht nochmal. Das Material sollte also bereits zugeschnitten sein (siehe auch nächster Abschnitt). Allerdings darf das ersetzte Material nicht bereits Intro oder Outro beinhalten, da dies beim Encoding angefügt wird.

Die Vorgehensweise wird vom Tracker etwas unterstützt. Das Material ist als handelsübliche Videodatei (z.B. MPEG2-TS, h264 mp4) im Verzeichnis Processing.Path.Repair abzulegen. Dabei kann ein beliebiger Dateiname gewählt werden. Im Tracker muss dieser Dateiname (ohne den Pfad!) in die Property Record.SourceReplacement am zugehörigen Recording-Ticket eingetragen werden. Das Recording-Ticket ist anschließend auf den Status recorded zu setzen. Das Mount-Skript erkennt den Sonderfall der Reparatur, und statt eines Fuse-Mounts wird einfach ein Softlink gesetzt. Achtung hier ist zu beachten, dass die Encoder das Ziel des Softlinks ebenfalls erreichen können! Daher am Besten alles unter einem Verzeichnis, z.B. /video bereitstellen.

Direkt im Anschluss kann/muss das Ticket nochmal geschnitten werden, also den Cutting-Status durchlaufen. Es wird nur der Status im Tracker durchlaufen, ein Schnitt mit KDEnlive findet nicht statt. Hier wäre jetzt der richtige Moment, um z.B. falsch gesetzte Sprachen/Übersetzungen nochmal zu korrigieren.

Ab hier läuft dann die Pipeline ganz normal weiter.

Wenn es einen Fuse/Mountfehler gibt kann es sein, dass die Mounts noch aus dem alten Durchlauf schief sind.

Camera backup Audio stereo to 2x stereo

Soll der Kameraton benutzt werden liegt dieser meist als L: original R: translation vor. Das muss im repair.ts auf 2 stereo streams geaendert werden das sollte mit dieser zeile funktionieren:

ffmpeg -i repair_rl.ts -filter_complex "channelsplit=channel_layout=stereo[l][r]" -c:v copy -c:a mp2 -b:a 192k -ar:a 48000 -map 0:0 -map "[l]" -map "[r]" -ac 2 repair_2chan.ts

Hints for repairing / manual cutting with KDEnlive

Die grundsätzliche Bedienung von KDEnlive wird hier nicht erklärt. Es ist zu beachten, dass KDEnlive (derzeit) nicht in der Lage ist, mehrere Video- oder Audiospuren zu exportieren. Für Slide-Video-Spuren oder übersetztes Audio muss man also mehrfach exportieren und die Dateien am Ende zu einer Repair- oder Masterdatei zusammenmuxen.

Ab ca. KDEnlive Version 17.x werden nicht mehr die vom MLT Framework mitgelieferten Exportprofile in der GUI zur Verfügung gestellt, sondern eine geringere Zahl von Profilen von KDEnlive selbst verwaltet. Es können custom Profile konfiguriert werden, diese werden in ~/.local/share/kdenlive/export/customprofiles.xml gespeichert. Ein Serviervorschlag ist wie folgt:

<profiles version="1">
 <profile args="an=1 vcodec=libx264 threads=0 vpre=medium preset=medium vprofile=high vlevel=4.1 crf=19 g=250 bf=0 movflags=+faststart tune=stillimage" category="VOC" extension="mp4" name="VOC H.264 slide video track without audio"/>
 <profile args="acodec=aac ab=128k vcodec=libx264 threads=0 vpre=medium preset=medium vprofile=high vlevel=4.1 crf=23 g=250 bf=2 movflags=+faststart" category="VOC" extension="mp4" name="VOC H.264 main video track with audio"/>
 <profile args="f=mpegts acodec=mp2 ab=192k vcodec=mpeg2video intra=0 vb=0 g=5 bf=0 qscale=4 threads=0" category="VOC" extension="ts" name="VOC MPEG-2 recording-like export"/>
</profiles>

Achtung da die Software “nur” libavcodec und libavformat verwendet, ist die Angabe von Filtern im Exportprofil prinzipbedingt nicht möglich. Ein Denoising, wie es in der Pipeline für die Masterfiles gemacht wird, muss als Filter auf die entsprechenden Videostücken geklickt werden!

Lokal schneiden, remote rendern

Dafür muss auf dem Encoder (oder der Server auf dem gerendert wird), muss melt installiert werden: sudo apt install melt. Beim Schneiden mit KDEnvlive sollten die Quelldateien schon an gleicher stelle wie auf dem Encoder liegen.

Wenn man fertig ist im KDEnlive auf rendern klicken, das Profil VOC H.264 main video track with audio auswählen, den richtigen Exportpfad setzen und auf Generate Script klicken. Jetzt sollte in $HOME/Videos/kdenlive-renderqueue/ eine passende .mlt-Datei liegen. Diese muss nun auf den Encoder kopiert werden. Hier kann nun in einem Screen/tmux melt $DATEINAME.mlt gestartet werden.

Convert to TS

(Not necessary for repairing)

The following ffmpeg call might be useful to convert to mpeg2 TS:

ffmpeg -v verbose -y \
    -i input.mp4 \
    -aspect 16:9 \
    -map 0:v  -filter:v scale=1920:1080 -c:v:0 mpeg2video -pix_fmt:v:0 yuv422p \
    -qscale:v:0 2 -qmin:v:0 2 -qmax:v:0 7 -keyint_min 0 -bf:0 0 -g:0 25 -intra:0 -maxrate:0 90M \
    -map 0:a -c:a mp2 -b:a 192k -ac:a 1 -ar:a 48000 \
    -f mpegts output.ts

remux TS file

ffmpeg -v verbose -y \
    -i $TALKID/uncut.ts \
    -c copy \
    -f mpegts /video/tmp/$EVENT/repair/${TALKID}_repair.ts

können

Audiospur bearbeiten

Beim Checken fällt auf, dass das Audio defekt ist z.B.

Zunächst muss man die einzelnen Audiopuren so umwandeln das Audio-Schnitt Tool wie z.B. Reaper was damit anfangen kann (vor oder nach Auphnic):

ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a
ffmpeg -i 5100-hd-audio2-auphonic.m4a -vn -c:a copy -bsf:a aac_adtstoasc 5100-hd-audio2-auphonic-echt.m4a

Fertige Audiospur in Reaper o.ä. rausrechnen, z.B. als flac Datei.

Audiospur wieder in Vortrag MP4 einpacken:

ffmpeg -threads 0 -i /video/encoded/fossgis16/5100-hd-primary-audio-only.mp4 -i 5100-audio-fixed.flac -map 0:0 -map 1:0 -map_metadata 0 -c:v copy -c:a:0 aac -vbr 4 -ar:a:0 48000  -metadata:s:a:0 language=deu 5100-hd-fixed2.mp4 

Weitere Audiospuren als nicht default markieren:

ffmpeg -i 10223-hd.mp4.orig -i /video/tmp/camp19/repair/10223-en-fixed.m4a -c copy -map 0:v:0 -map 0:v:1 -map 0:a:0 -map 1:a:0 -map_metadata 0 -metadata:s:a:1 language=eng -disposition:a:0 default -disposition:a:1 none 10223-hd.mp4

Manuelles AV/Delay mit ffmpeg von 200ms korrigieren:

ffmpeg -i 10397-hd-async.mp4 -itsoffset 0.200 -i 10397-hd-async.mp4 -c copy -map 0:v:0 -map 0:v:1 -map 1:a:0 -map_metadata 0 10397-hd.mp4

mit Avidemux

Etwas unsauber aber, falls es schnell gehen muss und eh nur nach YouTube veröffentlicht wird:

Manually repairing a Recording (DV)

Old SD process, mostly irrelevant.

When a Recording needs manual fixing (muxing in another Audio Source, Cutting a Delay in the Middle, Adding a Note), you can manually generate a .dv-File and inject it into the Pipeline. This is also very useful when you have a special source (like a camera recording to a SD-Card) and want to inject that into the Pipeline.

Assuming you have separately generated a fixed version of a Talk as .dv (does not need to be perfectly cut), you can Upload it to your Storage to /video/…/repair/ (the exact path is controlled via the Processing.Path.Repair Project Property). It can have any name.

Now place a Record.SourceReplacement propery on the Recording-Ticket and reset it to the recorded-State. It will now be prepared from the repair-File instead of the Capture-Snippets. The repair-process will create a fuse-mount that needs to be cut again, at least inframe != 0 - this is very different from TS!

Cut the last second off a recording

When the outro has additional frames (bacause of a non empty output folder after a –debug run) the files can be shortened by downloading them from media and using the fowllowing script.

#!/bin/bash

EXT=".mp4"

for video in *${EXT}; do
	echo "Processing $video"
	DURATION=$(ffprobe -v quiet -print_format json -show_format $video | jq '.format.duration|tonumber')
	DURATIONX2=$(ffprobe -v quiet -print_format json -show_format $video | jq '(.format.duration|tonumber)-1.3')

	VIDEONAME=$(basename $video ${EXT})
	REPAIRNAME=repair/${VIDEONAME}${EXT}
	echo "OLD: $DURATION"
	echo "NEW: ${DURATIONX2}"
	echo ffmpeg -hide_banner -t $DURATIONX2 -i ${VIDEONAME}${EXT} -map 0 -c copy ${REPAIRNAME}
	ffmpeg -hide_banner -t $DURATIONX2 -i ${VIDEONAME}${EXT} -map 0 -c copy ${REPAIRNAME}
done

ReLive to fusemount

If you for example screwed up a recording, it could be useful to use the ReLive-Snippets as a source for the fuse-ts. This python-script might help you. The Fahplan-ID has to be given as a argument.

import os
import sys

files = os.listdir('/video/tmp/ber-relive/36c3/5'+sys.argv[1])
relive_folder = '/video/tmp/ber-relive/36c3/5'
fuse_folder = '/video/fuse/36c3-wikipakawg/Wikipaka/'

i = 0

for file in files:
    filename = relive_folder+sys.argv[1]+'/' + file
    if filename[-3:] == '.ts':
        file = file.split('-')
        new_filename = relive_folder+sys.argv[1]+'/{}-{:05d}.ts'.format(file[0], int(file[1][:-3]))
        os.rename(filename, new_filename)
        i += 1

print("sudo umount "+fuse_folder+sys.argv[1] + ' && sudo /usr/bin/fuse-ts p="{prefix}-" c="{relive_folder}{id}" st="0000" numfiles={num} totalframes={frames} -oallow_other,use_ino "{fuse_folder}{id}"'.format(id=sys.argv[1], prefix=file[0], num=i, frames=(150*i) + 1000,relive_folder=relive_folder,fuse_folder=fuse_folder))