AVISynth - Audio-Spur Asynchron / läuft mit einer anderen Geschwindigkeit

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AVISynth - Audio-Spur Asynchron / läuft mit einer anderen Geschwindigkeit

    Anzeige
    Hallo Zusammen,

    ich hoffe das ich im richtigen Bereich poste...

    Ich habe mit OBS ein Spiel aufgenommen und mit MixCraft habe ich den Sound und meine Stimme separat aufgenommen.
    Nun habe ich in Premiere Elements festgestellt das die Stimme aus der Video und separaten Audiospur nicht synchron sind.

    Von der Geschwindigkeit her ist der Gamesound mit dem Faktor 1, also Synchron und das für die ganzen 2h.
    Bei der Mikrofonspur ist aber ein Faktor von 0.9999167360532889 was bedeutet das es anfangs synchron ist.

    Wie kann ich in AVISynth (MeGUI) nur die Mikrofonspur an den Rest anpassen?

    Zudem muss ich den Offset der Audiospuren entfernen, also die ersten 5449 Frames entfernen, jedoch weiß ich wie das geht.


    Könnt ihr mir weiterhelfen? =)


    Viele Grüße

    Dominator
  • Ich glaube mit AviSynth geht das gar nicht, oder aber es wäre ein elendes Gefrickel und Skriptgeschreibe, bei dem du dich dann länger aufhältst als nötig. Ich persönlich würde eher zu Audacity greifen und die Samplerate der zwei Tonspuren überprüfen und gegebenenfalls anpassen, und wenn das noch nicht hilft, die Mikrofonspur eben um ein winziges Stückchen verlängern. Ist zwar auch etwas Frickelarbeit, aber da kannst du dir wenigstens direkt anhören, wie das Ergebnis klingt.
  • Entweder mit AssumeSampleRate auf 44100 bringen (oder was auch immer deine Samplerate ist)
    avisynth.nl/index.php/AssumeSampleRate

    oder sogar an die FPS des Videos anpassen
    avisynth.nl/index.php/ResampleAudio

    Ersteres dürfte dein Problem dann ja schon lösen. Fragt sich mich nur, wie es von der 44100 abdriften konnte?

    AssumeFPS mit sync_audio=true würde ebenso das Audio an die Videospeed anpassen (Audio an Videospeed anpassen wäre mit Audacity zb schlecht möglich :D )

    Das ist kein Gefrickel, das ist das simpelste des Erdballs.

    Die Frames kannst ja dann in deinen Premiere entfernen, ansonsten halt Audiotrim.
    Aktuelle Projekte/Videos


  • Also ich habe mit OBS beide Spuren aufgenommen (schlechte Quali und Mikro leider nur Mono), sind im Video und wenn ich die 2 Spuren von Mixcraft nehme, dann passen die Gamesound-Spuren sauber übereinander, nur die Mikrofon Spur ist etwas langsamer, hab das gleiche Problem auch bei meinen Webcam Aufzeichnungen wenn ich das Game mit Fraps oder DXTory aufnehme.

    Da ich das Problem auch bei der Webcam habe, würde ich gerne nen Script basteln, alles andere wäre doch bei jeder Aufnahme die ich zukünftig mache, sehr unnötig und Zeit intensiver.

    Ich habe die Audiospuren mit MediaInfo angeschaut, leider keinen Unterschied, da scheint wohl OBS die Probleme zu verursachen, da es ja auch Probleme bei der Webcam gibt...

    Bei der Webcam würde ich das so machen:
    - Video Laden (Webcam ist 30FPS und soll auf 60FPS)
    - dann 60 * 0,9999167360532889 = 59,99500416319733 FPS

    - dann die Video FPS auf 60 stellen

    Somit sollte das dann auch passen oder?
    Ich habe damals festgestellt, das bei allen Aufnahmen der Faktor der gleiche ist.


    Bei meinem aktuellen Problem mit dem Sound würde ich schauen das ich die Mikrofon-Spur die passt, also die identisch mit DXTory und Fraps ist als Standard nehme und die Gaming Spur und das Gaming Video anpasse.

    Hier müsste ich aber dann das Spiel und den Spielsound mit AudioDub() zusammen fügen, die FPS anpassen und dann wieder trennen, oder?
    Ich kann leider sonst nicht den Gamesound und das Mikrofon mixen, wie stelle ich das am besten an?
    Ich würde gerne da ich die Audiospuren noch Synchronisiere, das ganze gerne nach wieder aus der Video-Variable ziehen und dann wieder als reine Audio-Variable weiterverarbeiten.
    (Also Amplify, EQ, MonoToStereo usw.)

    Ich finde nur keine Funktion die das kann, und wenn Ihr sagt das so so eine gute Möglichkeit ist, das zu machen, dann wäre es echt nur die Funktion die mir fehlt.^^

    Ich hoffe ich hab nicht ganz so wirr geschrieben!! =P

    Danke und Happy Halloween.

    Viele Grüße
    Spohky
  • Mal davon abgesehen ob ich MixCraft nutze oder nicht, dieses Problem habe ich auch wenn ich mit DXTory aufnehme und mit OBS meine Webcam, also ist es egal ob MixCraft nutze oder nicht...
    OBS nimmt scheinbar mit einer etwas unterschiedliche Geschwindigkeit auf wie MixCraft und DXTory in der Mikrofon Spur.

    Edit:
    Wie kann ich das denn am besten machen mit dem ändern der FPS?
    Also die Befehle, irgendwie kommt er mit der komma / punkt Zahl nicht klar und bringt immer eine Fehlermeldung.

    Wäre super wenn Ihr mir helfen könntet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DominatorLP () aus folgendem Grund: Editiert um keinen Doppelpost zu machen...

  • Mal ein paar Sachen von mir für AVISynth:

    Quellcode

    1. # ===================================
    2. # Längenanpassung von Video und Audio
    3. # ===================================
    4. # clip0 - Clip sollte Video und Audio haben!!!
    5. # order - Gibt an auf was angepasst werden soll
    6. # 0 (Standard) - Videolänge wird auf Audiolänge angepasst
    7. # 1 - Audiolänge wird auf Videolänge angepasst
    8. # x - Infoanzeige für die Berechnung
    9. # infosize - Schriftgröße für die Infoanzeige
    10. Function Sync(clip clip0, int "order", int "infosize") {
    11. order = Default(order, 0)
    12. infosize = Default(infosize, 18)
    13. return (order == 0) ? \
    14. clip0.AssumeFPS(clip0.framecount / (clip0.audiolengthf / clip0.audiorate)) : (order == 1) ? \
    15. clip0.AssumeSampleRate(round(clip0.audiolengthf / (float(clip0.framecount) / (float(clip0.frameratenumerator) / float(clip0.frameratedenominator))))) : \
    16. clip0.Subtitle("Input FPS = " + string(clip0.frameratenumerator) + " / " + string (clip0.frameratedenominator) + " = " + string(clip0.framerate) + "\nInput Samplerate = " + string(clip0.audiorate) + "Hz\n\nOrder 0\nSync Video to Audio with new Samplerate\n" + string(clip0.audiolength) + " Samples / (" + string(clip0.framecount) + " Frames / (" + string(clip0.frameratenumerator) + " / " + string (clip0.frameratedenominator) + ") FPS )\n= " + string(round(clip0.audiolengthf / (float(clip0.framecount) / (float(clip0.frameratenumerator) / float(clip0.frameratedenominator))))) + "Hz\n\n" + "Order 1\nSync Audio to Video with new Framerate\n" + string(clip0.framecount) + " Frames / (" + string(round(clip0.audiolengthf)) + " Samples / " + string(clip0.audiorate) + "Hz)\n= " + string(clip0.framecount / (clip0.audiolengthf / clip0.audiorate)) + " FPS" , size = infosize, lsp=1)
    17. }
    Alles anzeigen




    Lass dich nicht abschrecken davon was da steht, das meiste ist eh nur für die Infoanzeige.
    Den Rest entnimmst du Zeile 1 - 9.



    Quellcode

    1. # ====================================================================
    2. # Funktion um Versatzlänge am Ende zu korrigieren (Linkssverschiebung)
    3. # ====================================================================
    4. # clip0 - Video mit Audio Clip zusamm
    5. # versatz - Manueller Versatz in Sek nach rechts (Muss nicht angegeben werden)
    6. #
    7. # Info: Der clip0 Audiobit wird nicht konvertiert, wenn clip1 den selben besitzt
    8. Function EndDelay(Clip clip0, float "versatz") {
    9. versatz=Default(versatz, float(0))
    10. #Video und Audio voneinander trennen
    11. Video = clip0.killAudio()
    12. Audio = clip0.KillVideo()
    13. # Länge des Videos exakt ermitteln
    14. lenv = float(Video.FrameCount) / (Video.FrameRateNumerator / Video.FrameRateDenominator)
    15. # Länge des Audios exakt ermitteln
    16. lena = Audio.audiolengthf / Audio.audiorate
    17. #Differenz zwischen Video und Audiolänge und dem manuellen Audioversatz
    18. diff = lenv - lena - versatz
    19. #Verzögerung am Anfang ausgleichen und neuen Ton zurückliefern
    20. newtone = SameBpsAs(Tone(versatz, 0, Audio.Audiorate, Audio.audiochannels, "silence"), Audio) ++ Audio ++ SameBpsAs(Tone(diff, 0, Audio.Audiorate, Audio.audiochannels, "silence"), Audio)
    21. #Video und Audio wieder zurückliefern
    22. Return AudioDub(Video, newtone)
    23. }
    Alles anzeigen
    Der ganze Kram schiebt die Audiospur um x Sek nach rechts. Sprich wenn irgendwas Asynchron ist aufgrund das sich die Audiospur verschoben hat, kannst du das damit richten.

    Und hier noch der Kram für eine Links Verschiebung. Gleiches Prinzip wie eben:

    Quellcode

    1. # ======================================================================
    2. # Funktion um Versatzlänge am Anfang zu korrigieren (Rechtsverschiebung)
    3. # ======================================================================
    4. # clip0 - Video mit Audio Clip zusamm
    5. # versatz - Manueller Versatz in Sek nach links (Muss nicht angegeben werden)
    6. #
    7. # Info: Der clip0 Audiobit wird nicht konvertiert, wenn clip1 den selben besitzt
    8. Function StartDelay(Clip clip0, float "versatz") {
    9. versatz=Default(versatz, float(0))
    10. #Video und Audio voneinander trennen
    11. Video = clip0.killAudio()
    12. Audio = clip0.KillVideo()
    13. # Länge des Videos exakt ermitteln
    14. lenv = float(Video.FrameCount) / (Video.FrameRateNumerator / Video.FrameRateDenominator)
    15. # Länge des Audios exakt ermitteln
    16. lena = Audio.audiolengthf / Audio.audiorate
    17. #Differenz zwischen Video und Audiolänge und dem manuellen Audioversatz
    18. diff = lenv - lena - versatz
    19. #Verzögerung am Anfang ausgleichen und neuen Ton zurückliefern
    20. newtone = SameBpsAs(Tone(diff, 0, Audio.Audiorate, Audio.audiochannels, "silence"), Audio) ++ Audio ++ SameBpsAs(Tone(versatz, 0, Audio.Audiorate, Audio.audiochannels, "silence"), Audio)
    21. #Video und Audio wieder zurückliefern
    22. Return AudioDub(Video, newtone)
    23. }
    Alles anzeigen
    Bedenke das es fertige Funktionen sind. Du brauchst das nur in Skript entsprechend kopieren und rufst nur diese Funktion entsprechend mit den Parametern auf.

    z.B:

    Quellcode

    1. AVISource("xyz.avi", true).AssumeFPS(xyz)
    2. Sync(0)
    3. ...
    4. Irgendwo steht die Funktionen für Sync am Ende....
    5. ...
    Kannst eine Funktion auch mehrmals aufrufen.

    In dem Abstrakten Beispiel oben wird die Videolänge auf Audiolänge angepasst.
    Würde dort Sync(1) stehen würde die Audiolänge auf Videolänge angepasst werden.




    DominatorLP schrieb:

    Bei der Webcam würde ich das so machen:
    - Video Laden (Webcam ist 30FPS und soll auf 60FPS)
    - dann 60 * 0,9999167360532889 = 59,99500416319733 FPS

    - dann die Video FPS auf 60 stellen
    Wie lang sind denn beide Aufnahmen die du hast? Du solltest auf jedenfall beachten das wenn du beides simultan aufgenommen hast, beide Videos entsprechend ungefähr die gleichen Längen haben sollten.
    Das heißt eine Beschleunigung ist da dann Fail am Platze.

    Überprüfe erst mal ob es an einer Verschiebung liegt.

    Um das zu vergleichen kannst du beide Videos in AVISynth laden und die FPS mit ChangeFPS auf 60 FPS eichen.

    Die Länge ändert sich dabei nicht. Jetzt nur noch so aufbauen das du die Möglichkeit hast die Spuren entsprechend noch zu schieben und gleichzeitig am Ende eine Zusammenführung hast.

    Wenn du das mit AVSPmod machst, kannst du das so eine Track Verschiebung von Spuren machen:

    Quellcode

    1. video = AVISource("Game.avi")
    2. cam = AVISource("Webcam.avi").ChangeFPS(Video.FrameRateNumerator, Video.FrameRateDenominator).SSRC(video.AudioRate).SameBpsAs(video)
    3. right = [<"CamToRight", 0, 5000, 0>]
    4. left = [<"CamToLeft", 0, 5000, 0>]
    5. EmptyFrame = BlankClip(cam, length=right)
    6. cam = EmptyFrame ++ cam.Trim(left, cam.framecount)
    7. MixAudio(ApplyRange(video, right, cam.framecount, "Overlay", cam), cam)
    8. # ================================================
    9. # In gleiche Audiobittiefe konvertieren wie Clip x
    10. # ================================================
    11. # clip0 - Zu konvertierender Clip
    12. # clip1 - Referenz Clip
    13. #
    14. # Info: Der clip0 Audiobit wird nicht konvertiert, wenn clip1 den selben besitzt
    15. Function SameBpsAs (clip clip0, clip clip1) {
    16. #Audiobittiefe ermitteln und vergleichen.
    17. #Wenn Unterschied besteht, dann konvertieren
    18. wert1 = (clip0.audiobits == 8) ? 8 : (clip0.audiobits == 16) ? 16 : (clip0.audiobits == 24) ? 24 : 32
    19. wert2 = (clip1.audiobits == 8) ? 8 : (clip1.audiobits == 16) ? 16 : (clip1.audiobits == 24) ? 24 : 32
    20. clip0 = (wert1 == wert2) ? clip0 : (wert2 == 8) ? clip0.ConvertAudioTo8bit() : (wert2 == 16) ? clip0.ConvertAudioTo16bit() : (wert2 == 24) ? clip0.ConvertAudioTo24bit() : clip0.ConvertAudioTo32bit()
    21. #Audiobittiefe ermitteln und vergleichen (only Float) (Wichtig falls vorher beide Clips auf 32Bit waren. Unterschied zwischen 32Bit und 32Bit Float)
    22. #Wenn Unterschied besteht, dann konvertieren
    23. wert1 = (clip0.IsAudioFloat == true) ? 1 : 0
    24. wert2 = (clip1.IsAudioFloat == true) ? 1 : 0
    25. Return (wert1 == wert2) ? clip0 : (wert2 == 1) ? clip0.ConvertAudioToFloat() : clip0
    26. }
    Alles anzeigen
    In AVSPmod kannst du dann an der Seite ein Slider finden mit der du die Kamera Spur verschieben kannst. Frame für Frame entsprechend zum anderen Video. Einmal für eine Links Verschiebung und einmal für eine Rechtsverschiebung. 5000 Frames sollten da reichen. Soviel wirst du glaub ich nicht verschieben wollen.

    Abspielen kannst du dann mit der Taste neben dem Play Knopf. Wähle am besten ein externes Programm wie VDub 32Bit. Dann kannst du dir das Ganze auch anschauen.


    Joa... theoretisch hättest du dann auch schon alles um das Problem mit AVISynth zu lösen.

    Man kann vieles auch Vereinfachen mit Funktionen. Spart man sich den Schreibaufwand auf ein relatives Minimum.
  • @Sagaras wow, danke für deine Mühe! :)

    Ich weiß das ich bei x frames 2,5 Versatz habe und bei x2 frames 5.
    Es ist alles was mit OBS aufgenommen wurde, immer der gleiche Faktor.

    Die Aufnahmen die ich habe sind 1x 3h und dann noch ne 2. Session mit ca 7h und der Faktor bleibt immer gleich, egal ob ich bei 1h oder bei 5 oder bei 7h bin.

    Das Problem ist das die Aufnahmen gleich lang sind, aber bei der OBS Aufnahme in einer anderen Geschwindigkeit ablaufen und das aber nur für die Mikrofon-Spur.

    Darum würde ich ja sagen, Video mit dem Mikro zusammen packen, die FPS auf die 59,99500416319733 FPS verändern und dann sagen es sind 60 FPS und somit ist das ja angepasst, oder liege ich da falsch, ich habe versuche mit 60 auf 30 gemacht und da war es dann doppelt so lange.
    Ich nutze das ja für Wiederholungen in Schreckmomenten, da sage ich das soll langsamer abgespielt werden, und da wird das z.B. von 60 auf 30FPS gestellt und dann sage ich das sind 60 FPS und schon läuft es halb so schnell ab.

    Nur mein Problem ist das es mir immer nen Fehler an der Zeile sagt, wo ich auf 59,99500416319733 FPS stellen möchte, egal ob . oder , und da bräuchte ich einen Rat von dir, das würde mir schnell helfen und ich kann das ganze endlich an MeGUI weitergeben ohne Probleme und die Videos endlich raus hauen, :)


    Und du hast mir mit zumindest einer Sache sehr viel weiter geholfen:

    Quellcode

    1. Video = clip0.killAudio()
    2. Audio = clip0.KillVideo()

    Nun kann ich mein Script in so weit fertigstellen das es Audio von Video trennen kann, danke ich habe schon lange nach so einem Befehl gesucht, aber scheinbar mit den falschen Suchbegriffen.

    Edit:
    Oh man jetzt verstehe ich warum es den "denominator" bei AssumeFPS gibt, ja gut ich habs verstanden und vielen Dank, ich mache hier nachher Dicht =)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DominatorLP ()

  • DominatorLP schrieb:

    Oh man jetzt verstehe ich warum es den "denominator" bei AssumeFPS gibt
    Ist die gleiche Logik wenn man das Video in einem Hexeditor betrachtet.

    Daten können nur mit exakten ganzwertigen Zahlen gespeichert werden. Daher werden in einer Datei wenn es um FPS geht auch jeweils 2 Werte gespeichert. Einmal der Numerator (Zähler) und einmal der Denominator (Nenner).

    So hast du z.B. für 29,970 FPS eigentlich mit den Werten 30 / 1,001 zu tun bzw. 30000 / 1001
    Oder der Wert obliegt einem exakten Wert, weil die Software zu blöde war. Dann hast du natürlich 29970 / 100

    Und so stehen solche Werte dann halt auch in der Datei dann drin. Meist als unsigned 4 Byte pro Zahl. Sprich die FPS Angabe beträgt somit genau 8 Byte.

    Dann steht es meist so da:
    unsigned = 01 00 00 00 1E 00 00 00 -> signed = 00 00 00 01 00 00 00 1E -> dez = 1 und 30

    Das sind dann Nenner und Zähler. Sprich 30 FPS, weil 30 / 1 = 30

    Jedes Programm hantiert also genauso. Immer 2 Werte für die FPS Angabe.