c3tracker:repair

subpage of c3tracker

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

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.

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.

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.

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 (Defaultwert, wenn nicht gesetzt: /video/tmp/<projektslug>/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.

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

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!

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.

(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
ffmpeg -v verbose -y \
    -i $TALKID/uncut.ts \
    -c copy \
    -f mpegts /video/tmp/$EVENT/repair/${TALKID}_repair.ts

können

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

  • man möchte das Backup-Audio aus der zweiten Kamera-Audiospur nutzen, oder
  • Audio-Einspieler aus der Präsentation fehlt, hat hat die Datei aber vom Vortragenden bekommen und möchte das in das Release MP4 mit einbauen

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
  • Copyright meldung im YT frontend öffen und “audio ersetzen” klicken
  • option wählen, die vorschlägt das audio zu entfernen
  • warten
  • ergebnis in YT probehören
  • audio von YT mit youtube-dl herunterladen:
    • youtube-dl -v -f 'bestaudio[ext=m4a]' Xyiczc061RQ
    • denkt an die translations!
    • heruntergeladenes audio in das master HD muxen
    • mit ffmpeg manuell:

    ffmpeg -i 35c3-9999-eng-deu-spa-The_Enemy_hd.mp4 -i 9999-eng-rB9RDJxv71E.m4a -i 9999-deu-dDB7BWfnugs.m4a -i 9999-spa-Xyiczc061RQ.m4a -c copy -map '0:v' -map '1:a' -map '2:a' -map '3:a' 9999-hd-remux.mp4

    • oder direkt mit dem remux commando aus dem tracker jobfile das normalerweise fuer das auphonic remux verwendet wird
      • cd /opt/crs/tools/tracker3.0/
      • . ./tracker-profile.sh
      • ffmpeg zeile fuer das HD master ticket id holen: ./scripts/get-encode-commands.pl 60525
        • Achtung, die Nummer ist nicht die Fahrplan-ID sondern die Ticket-ID - einfach aus der URL vom Tracker nehmen
      • in der remux zeile die filenamen der audio spuren anpassen und laufen lassen
    • das entstandene HD-Master file in die pipeline tuen (ins tmp-Verzeichnis) und das Masterticket auf encoded setzen
    • anschließend (re)releasen (Publishing.YouTube.Enable am Ticket auf no setzen!), danach Subformate neu encoden und releasen

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

  • MP4 aus /video/encoded/<talk-id>.mp4 mit Avidemux öffnen.
  • Bereich suchen und markieren
  • Bereitsgrenze auf Keyframes legen
  • Bereich löschen
  • Fertiges Video in MP4 Container mit Video codec copy und Audio codec copy exportieren
  • /video/encoded/<talk-id>.mp4 umbennen und neue Datei da hin legen
  • Wie bem Checken fortfahren

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!

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

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))
  • c3tracker/repair.txt
  • Last modified: 2021/01/13 21:04
  • by n0emis