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.
- 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 aus audio mit hilfe von YouTube entfernen
- 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
mit Avidemux
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
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))