Hi, ich möchte hier ein Java Programm vorstellen, dass ich selbst geschrieben habe.
edit: Achtung, dies ist die vorgängerversion meines aktuellen programmes. die aktuelle version setzt zum schneiden auf delaycut und ist hier zufinden http://board.serienjunkies.org…php?p=298626&postcount=60
Mit diesem Programm ist es möglich (in Zusammenarbeit mit dem gratis Programm mpeg2schnitt) aus ac3 Tonspuren gezielt etwas rauszuschneiden, so dass diese dann synchron mit dem Video laufen.
Geschrieben habe ich das Programm, um damit die deutsche ac3 Spur an eine englische hd Aufnahme einer Stargate Staffel anzupassen.
Da das Programm als Quelltext vorliegt, sieht das Arbeiten damit folgendermaßen aus:
Ich starte es über eine .bat Datei, es öffnet sich ein Eingabefenster, darein kopiere ich die Schnittanweisung. Daraus erstellt mein Programm eine schnittliste, die ich in mpeg2schnitt importiere.
Mein Programm kann also:
-Aus den Audioversetzungen (im vlc "Audioverzögerung" genannt) und den Schnittzeiten (also die Zeitangabe, wann sich die Audioverzögerung ändert) eine schnittliste erstellen.
Mein Programm kann nicht:
-Stille einfügen. es kann also nur Ton rausschneiden. (bzw. die Audiospur doppelt laufen lassen)
-Schneiden auf Millisekunden genau. Die Schnittzeit wird in hh:mm:ss angegeben.
-Eine Audioverzögerung von mehr als -99999ms also -100s ausgleichen.
-Das Schneiden von anderen Formaten als ac3 hab ich nicht versucht, das Programm ist durch die ac3-Framelänge von 32ms vermutlich nicht für das Schneiden von mp3 etc. geeignet.
Anwendung:
Man fügt die anzupassende Tonspur in das Video ein, so dass man das Video im vlc öffnen und mit den Hotkeys "j" und "k" die audiospur anpassen kann.
Die als synchron empfundenen Audioversetzungen notiert man sich, und dazu noch den Zeitpunkt, bis wohin diese Audioverzögerung gilt.
Diese beiden Informationen schreibt man in folgender Form in eine .txt oder .doc (xxxxxx =Audioverzögerung in ms):
xxxxxx hh:mm:ss xxxxxx hh:mm:ss xxxxxx hh:mm:ss
und so weiter, dabei ist es wichtig, das die Audioverzögerung genau 6 Zeichen lang ist, danach ein Leerzeichen folgt und das danach 8 Zeichen für die Zeit folgen.
Beispiel:
Ich habe also die Schnittdaten für eine Folge:
das bedeutet, -5200ms Audioverzögerung bis 00:06:16, danach -6100ms Audioverzögerung bis 00:12:30 dann -7950ms Audioverzögerung bis 00:41:02, die letzte Angabe ist gleichzeitig auch die Länge der entstehenden Audiodatei.
Aus dieser Eingabe macht mein Programm:
die Schnittliste wird in einer .txt Datei gespeichert.
Jetzt fügt man die ac3 Spur in mpeg2schnitt ein und lädt die schnittliste.txt. Nach dem Schneiden fügt man die ac3 Spur wieder in das Video ein und sie sollte synchron laufen.
Installation:
Da das Programm als Code vorliegt, benötigt man die "Java SDK" (http://www.chip.de/downloads/Java-SDK_12992754.html) um das Programm zu starten.
Ich starte das Programm über eine .bat Datei.
Inhalt der bat:
Die erste Zeile der .bat ist anzupassen. (zur Kontrolle: in dem Verzeichnis muss die datei javac.exe erhalten sein)
Den Quelltext des Javaprogrammes speichert man in eine Textdatei, benennt diese in "mpeg2schnitt.java" um und speichert sie in den Ordner "Mpeg2Schnitt" direkt auf C:
- import java.util.Iterator;
- import java.util.LinkedList;
- import javax.swing.*;
- import java.io.*;
- public class mpeg2Schnitt{
- public static void main(String[]args){
- try{
- String SString=JOptionPane.showInputDialog(" Programm zum erstellen von Schnittlisten für Mpeg2Schnitt\n\nDie eingabe '-00200 00:12:45 -03000 01:22:22' würde bedeuten: Audioversetzung -200ms bis min 12:45. dann audioversetzung -3000ms bis 1:22:22.\n (6 zeichen für die audioverzögerung, 1 zeichen frei, 8 zeichen für den timecode)");
- int anzversetzung=6, anzzeit=8, letzteszeichen=0, ac3frames=32;
- String Svers="1", Sh="2", Sm="3", Ss="4", Sstartzeit="", Sendzeit="";
- int hh=61,mm=61,ss=61,zeits=0, ivers=0, iverssek=0, iversmsek=0, schnittstartsek=0, vorzeits=0, schnittendsek=0;
- float fversframes=0;
- int jetzth=0,jetztm=0,jetzts=0,jetztfr=0;
- BufferedWriter aus=new BufferedWriter(new FileWriter("schnittliste.txt"));
- int anzschnitte=SString.length()/(anzversetzung+anzzeit);
- for(int i=1;i<=anzschnitte;i++)
- {
- String teilstring=SString.substring(letzteszeichen,letzteszeichen+anzversetzung+anzzeit+1);
- letzteszeichen=letzteszeichen+anzversetzung+anzzeit+2;
- Svers=teilstring.substring(0,6); Sh=teilstring.substring(7,9); Sm=teilstring.substring(10,12); Ss=teilstring.substring(13,15);
- ivers=(-1)*(Integer.parseInt(Svers));hh=Integer.parseInt(Sh);mm=Integer.parseInt(Sm);ss=Integer.parseInt (Ss);
- vorzeits=zeits;
- zeits=((hh*60)+mm)*60+ss;
- iversmsek=ivers%1000; iverssek=(ivers-iversmsek)/1000;
- schnittstartsek=vorzeits+iverssek;
- fversframes=(float)iversmsek/(float)ac3frames;
- if(fversframes<0){schnittstartsek-=1;fversframes=(float)ac3frames+fversframes;}
- jetztfr=(int)fversframes; jetzts=schnittstartsek%60; jetztm=((schnittstartsek-jetzts)/60)%60; jetzth=((schnittstartsek-jetzts)/(60*60));
- if(jetzth<=9) Sstartzeit+="0"+jetzth+":"; else Sstartzeit+=jetzth+":";
- if(jetztm<=9) Sstartzeit+="0"+jetztm+":"; else Sstartzeit+=jetztm+":";
- if(jetzts<=9) Sstartzeit+="0"+jetzts+":"; else Sstartzeit+=jetzts+":";
- if(fversframes<=9) Sstartzeit+="0"+(int)(Math.round(fversframes))+" -- "; else Sstartzeit+=(int)(Math.round(fversframes))+" -- ";
- schnittendsek=zeits+iverssek;
- jetztfr=(int)fversframes; jetzts=schnittendsek%60; jetztm=((schnittendsek-jetzts)/60)%60; jetzth=((schnittendsek-jetzts)/(60*60));
- if(fversframes==0){fversframes=1000/ac3frames;
- if(jetzts==0) {if(jetztm==0)jetzth-=1;
- else jetztm-=1;}
- else jetzts-=1;
- } else fversframes-=1;
- if(jetzth<=9) Sendzeit+="0"+jetzth+":"; else Sendzeit+=jetzth+":";
- if(jetztm<=9) Sendzeit+="0"+jetztm+":"; else Sendzeit+=jetztm+":";
- if(jetzts<=9) Sendzeit+="0"+jetzts+":"; else Sendzeit+=jetzts+":";
- if(fversframes<=9) Sendzeit+="0"+(int)(Math.round(fversframes))+" "; else Sendzeit+=(int)(int)(Math.round(fversframes))+" ";
- schnittstartsek=schnittendsek-iverssek;
- aus.write(Sstartzeit+Sendzeit);
- aus.newLine();
- Sstartzeit=""; Sendzeit="";
- }
- aus.flush();
- aus.close();
- }
- catch (Exception e){e.printStackTrace();};
- }
- }
mfg stargatefreak
PS.: Wenn jemand Fehler im Programm findet (falls das bei der Strukturierung überhaupt möglich ist :D) oder Verbesserungsvorschläge hat (z.B. wie ich Stille einfügen kann) immer raus damit