c3tracker:repair

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
c3tracker:repair [2019/01/02 21:55] – [Copyright aus audio mit hilfe von YouTube entfernen] atzec3tracker:repair [2023/03/15 17:01] (current) – [Manually repairing a Recording (TS)] jwacalex
Line 21: Line 21:
 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: 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/event/room/1234/uncut.ts -c copy -f mpegts /video/tmp/event-repair/1234-remux.ts+  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. Anschließend mit dem Reparaturprozess (nächster Abschnitt) fortfahren.
Line 27: Line 27:
  
 == Manually repairing a Recording (TS) == 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. Allerdings darf das ersetzte Material **nicht** bereits Intro oder Outro beinhalten, da dies beim Encoding angefügt wird.+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 dann 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.+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. 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.
Line 35: Line 35:
 Ab hier läuft dann die Pipeline ganz normal weiter. Ab hier läuft dann die Pipeline ganz normal weiter.
  
-=== Convert to TS+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: 
 +<code> 
 +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 
 +</code> 
 + 
 +== 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) (Not necessary for repairing)
Line 50: Line 79:
 </code> </code>
  
-=== remux TS file+== remux TS file
 <code> <code>
 ffmpeg -v verbose -y \ ffmpeg -v verbose -y \
Line 56: Line 85:
     -c copy \     -c copy \
     -f mpegts /video/tmp/$EVENT/repair/${TALKID}_repair.ts     -f mpegts /video/tmp/$EVENT/repair/${TALKID}_repair.ts
-</code>+</code>können 
 == Audiospur bearbeiten == Audiospur bearbeiten
  
Line 74: Line 104:
  
 <code> <code>
-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:libfdk_aac -vbr 4 -ar:a:0 48000  -metadata:s:a:0 language=deu 5100-hd-fixed2.mp4 +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:aac -vbr 4 -ar:a:0 48000  -metadata:s:a:0 language=deu 5100-hd-fixed2.mp4 
 </code> </code>
  
 +Weitere Audiospuren als nicht default markieren:
 +<code>
 +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
 +</code>
 +
 +Manuelles AV/Delay mit ffmpeg von 200ms korrigieren:
 +<code>
 +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
 +</code>
 == Copyright aus audio mit hilfe von YouTube entfernen   == Copyright aus audio mit hilfe von YouTube entfernen  
  
Line 88: Line 127:
   * heruntergeladenes audio in das master HD muxen   * heruntergeladenes audio in das master HD muxen
      * mit ffmpeg manuell:       * 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+  `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      * oder direkt mit dem remux commando aus dem tracker jobfile das normalerweise fuer das auphonic remux verwendet wird
Line 120: Line 159:
  
 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!** 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.
 +
 +<code>
 +#!/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
 +</code>
 +
 +== 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.
 +
 +<code>
 +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))
 +</code>
 +
  
  • c3tracker/repair.txt
  • Last modified: 2023/03/15 17:01
  • by jwacalex