Mehrere Videos erfolgreich verketten

1222
Sathya

Meine Mission ist es, Videos aus alten Web-Diashows zu erstellen. Zu Beginn habe ich JPEG- und Audiodateien, die als Flash-Diashows in einem alten System funktionierten, und zwar wie folgt strukturiert:

Audiostruktur

  • my_audio_1.mp3 (diese Datei ist ein 3 Sekunden langer MP3-Ton)
  • my_audio_2.mp3
  • my_audio_3.mp3
  • my_audio_4 etc ... ungefähr 30 mp3s pro Diashow

Bildstruktur

  • my_image_1.jpg (fungiert als Eröffnungsfolie)
  • my_image_2.jpg
  • my_image_3.jpg
  • my_image_4. etc ... ungefähr 30 Bilder pro Diaschau .

Da es fast 100 Diashows gibt, die in Video konvertiert werden müssen, habe ich eine webbasierte Schnittstelle mit PHP zur Automatisierung des Prozesses erstellt, die auf einem lokalen System installiert ist und versucht, die Dateien mithilfe von shell_exec () zu kombinieren . Der Prozess verwendet den folgenden Workflow:

  1. Durchlaufen Sie jede Folie und machen Sie ein AVI oder MPEG. So zum Beispiel my_mini_video_2.avi wäre ein Video sein, das besteht aus my_image_2.jpg und hat einen Soundtrack von my_audio_2.mp3 . Diese Folie würde die Länge von my_audio_2.mp3 halten .
  2. Verbinde / stitch / concat alle Minivideos, um das endgültige Video zu erstellen (mit einer Kombination aus cat und entweder mencoder oder ffmpeg (ich habe auch avimerge versucht, aber ohne Erfolg).
  3. Transkodieren Sie das neue "Master" -Video in verschiedene Formate wie FLV usw.

Ich dachte, das wäre einfach und war bei vielen Gelegenheiten nah, aber es funktioniert trotzdem nicht. Ich komme nicht an Stufe 2 vorbei, da ich kein perfektes "Master" -Video erhalten kann. Ich habe jetzt mit Mencoder, FFMpeg experimentiert und habe anscheinend jede Kombination durchgemacht, die mir einfällt. Das Problem ist, dass Audio und Visuals niemals synchronisiert werden, egal was ich versuche.

Ich habe sogar schon einmal Mini-Videos ohne Audio erstellt, die MP3s mit cat und mp3wrap zu einem langen MP3- Player zusammengefügt und dann den neuen langen MP3 als Audiotrack zugewiesen. Dies führt jedoch entweder zu einer sehr kurzen Datei oder einer stark verlangsamten Datei runter feilen und die weibliche Stimme klingt wie ein männlicher Boxer !!!

Es scheint keine Probleme mit den Originaldateien zu geben.

Hat jemand Erfahrung damit, ein Video von demselben Ausgangspunkt aus erfolgreich zu produzieren? Oder irgendwelche Ideen, was ich falsch mache?

Als Beispiel:

Wenn ich stille Mini-Videos erstelle und sie zu "temp-master.mpg" zusammenstecke und die MP3s dann zu einer einzigen MP3-Datei namens "temp-master-audio.mp3" zusammenfügen, dauert die Audiodatei 09:10 und die Die Dauer der Videodatei beträgt 08:35. Sie sollten gleich sein und der Ton wird langsam erscheinen.

Ich habe keinen Code gepostet, da ich viele Kombinationen geschrieben habe.

AKTUALISIERT 21. März 2010

Dank der Empfehlung von Michael Steele zu AviSynth und VirtualDub (und ich habe das GScript-Plugin hinzugefügt), ist es mir gelungen, einige Fortschritte zu erzielen, und dieses Skript funktioniert fast. Das einzige Problem ist jetzt, dass, obwohl in diesem Beispiel 4 Mini-Videos nach Belieben nebeneinander hinzugefügt werden, das Mini-Video immer dasselbe ist (z. B. Video-4, Video-4, Video-4, Video- 4 anstelle von Video-1, Video-2, Video-3, Video-4 ):

# A nearly functional AVS file   # Set out some basic variables base_audio = "C:\..." base_image = "C:\..." total_slides = 4  LoopThroughFiles(total_slides, base_audio, base_image)  #This is the function for outputting each combination function AudioNImage(string mp3, string image, float fps) { audio = DirectShowSource(mp3) length = audiolengthF(audio) rate = Audiorate(audio) frames = Int((length/rate)*fps) video = ImageSource(image, end=Int(frames), fps=fps) return audiodub(video, audio) }  #Loop through the files to create the full command string # My audio and image files are in the format of VID0002.jpg and VID0002.mp3 function LoopThroughFiles(int total, string audiopath, string imagepath) { GScript(""" cmd = "" for (i=1, total) { audio = audiopath + "000" + String(i) + ".mp3" picture = imagepath + "000" + String(i) + ".jpg" cmd = cmd + "AudioNImage(audio, picture, 25)" if (i < total) { cmd = cmd + "+"  } } GEval(cmd) """) } 

Das ist also fast da, aber ich muss nur herausfinden, warum die Mini-Videos nicht inkrementieren.

5
Ist das ein Codierungsproblem? In diesem Fall erhalten Sie eine bessere Antwort unter http://stackoverflow.com. Sie müssen jedoch Code schreiben. Wenn dies der Fall ist, kann der Beitrag migriert werden (nach 5 Stimmen), sodass Sie nicht wirklich erneut posten müssen. ChrisF vor 14 Jahren 0
Es kann eine blöde Aufnahme sein, aber stimmt die Länge eines Videos mit einer Folie und der damit verwendeten MP3-Datei genau überein? Neo vor 14 Jahren 0
chrisF, ich habe das nicht auf StackOverflow gepostet, da es nicht exakt Code ist, sondern nur Befehlszeilenvariationen. Es gibt keine Probleme mit der Programmierung. Ich glaube, das hat mit den Software-Befehlen zu tun. Neo, das Seltsame ist, dass jedes einzelne Mini-Video perfekt ist. Die kombinierte Videolänge funktioniert korrekt, aber die Tondauer der kombinierten Dateien ist länger. vor 14 Jahren 0
you might ask at http://home4film.com/ which has a similar Q-n-A format and focuses on audio/video & home theater stuff. this question is welcome here but they'd appreciate it too. (and it's not part of the Stack Overflow trilogy so crossposting here and there shouldn't be a problem.) quack quixote vor 14 Jahren 0

1 Antwort auf die Frage

1
Michael Steele

Ihr Problem kann durch unterschiedliche Frameraten im Quellinhalt verursacht werden. Verwenden Sie eine Anwendung wie MediaInfo, um festzustellen, ob es sich um das Problem handelt.

Vorschlag Nr. 1

Ich hatte Erfolg mit AviSynth und VirtualDub für solche Aufgaben. Avisynth erstellt einen Videostream basierend auf einem von Ihnen erstellten Skript. Es ist ideal für das Kombinieren mehrerer kleiner Dateien, da Sie genaue Timings festlegen können. Möglicherweise müssen Sie eines der vielen Drittanbieter-Plugins verwenden, um aufeinanderfolgende JPG-Bilder für einen bestimmten Zeitraum anzuzeigen.

Wenn Sie mit dem von AviSynth produzierten Produkt zufrieden sind, können Sie es mit VirtualDub in das gewünschte Format kodieren.

Vorschlag Nr. 2

Führen Sie das Audio- und Video-Splicing separat aus und führen Sie die beiden Streams als letzten Schritt zusammen.

  1. Verwenden Sie einen Audio-Editor wie Audacity, um ein Master-.mp3 oder ein unkomprimiertes .wav zu erstellen.
  2. Erstellen Sie Ihr Diaschauvideo wie bisher.
  3. Kombiniere die beiden Streams. VirtualDub kann dies, aber für etwas so einfaches ist es etwas umständlich. Ich habe Ripbot264 verwendet. Das beliebte Handbremsenwerkzeug könnte dies wahrscheinlich auch tun.
Hallo Michael, danke für deine Empfehlungen. Ich habe AviSynth und VirtualDubMod hier auf einem PC installiert und komme näher. Ich habe ein Skript in AviSynth geschrieben, das fast funktioniert, aber die Bilder / Audiodaten nicht ändert. Ich habe meine Frage entsprechend aktualisiert ... vor 14 Jahren 0
Michael, ich werde jetzt eine Kombination aus AviSynth und VirtualDub verwenden, um meine Master-Dateien zu erstellen. Ich verwende benutzerdefinierten Code, um ein AVS-Skript für AviSynth zu generieren, und dann werde ich andere Software zum Kodieren verwenden. Danke für deinen Rat. vor 14 Jahren 0