Wie verwende ich Blob URL, MediaSource oder andere Methoden, um verkettete Blobs von Medienfragmenten abzuspielen?

8

Ich versuche, mangels einer anderen Beschreibung einen Offline-Medienkontext zu implementieren.

Das Konzept besteht darin, 1 Sekunde Blob s von aufgezeichneten Medien mit der Fähigkeit

zu erstellen
  1. Spiele die 1 Sekunde Blobs unabhängig von einem HTMLMediaElement
  2. Wiedergabe der vollständigen Medienressource von verkettetem Blob s

Das Problem besteht darin, dass nach dem Verketten der Blob s die Medienressource nicht mit HTMLMedia element unter Verwendung von Blob URL oder MediaSource wiedergegeben wird.

Die erstellte Blob URL spielt nur 1 Sekunde der verketteten Blob 's ab. MediaSource löst zwei Ausnahmen aus

%Vor%

und

%Vor%

Wie kann man die verkettete Blob s richtig codieren oder eine Umgehung implementieren, um die Medienfragmente als eine einzelne neu konstituierte Medienressource abzuspielen?

%Vor%

mit Blob URL at else Anweisung bei select change Ereignis, das nur die erste Sekunde der Medienressource spielt

%Vor%

plnkr Version Version 1 Blob URL , Version 2 MediaSource

    
guest271314 20.07.2017, 14:42
quelle

1 Antwort

6

Derzeit gibt es keine Web-API für die Videobearbeitung.
Die MediaStream- und MediaRecorder-APIs sollen sich mit Live-Quellen befassen.

Aufgrund der Struktur von Videodateien können Sie nicht nur einen Teil davon abschneiden, um ein neues Video zu erstellen, noch können Sie kleine Videodateien verketten, um einen längeren zu erstellen. In beiden Fällen müssen Sie die Metadaten neu erstellen, um eine neue Videodatei zu erstellen.
Die einzige aktuelle API, die MediaFiles erzeugen kann, ist der MediaRecorder.

Derzeit gibt es nur zwei Implementationen der MediaRecorder API, aber sie unterstützen ungefähr 3 verschiedene Codecs in zwei verschiedenen Containern, was bedeutet, dass Sie mindestens 5 Metadaten-Parser erstellen müssen, um nur aktuelle Implementierungen zu unterstützen (die beibehalten werden) wachsender Anzahl, und die aktualisiert werden müssen, wie die Implementierungen aktualisiert werden.

Klingt wie ein harter Job.

Vielleicht erlaubt uns die eingehende WebAssembly-API, ffmpeg in Browser zu portieren, was es viel einfacher machen würde, aber ich muss zugeben, dass ich WA überhaupt nicht kenne, also bin ich mir nicht einmal sicher, ob es wirklich machbar ist .

Ich höre Sie sagen: "Ok, dafür gibt es kein Tool, aber wir sind Hacker, und wir haben andere Werkzeuge mit großer Macht."
Nun ja. Wenn wir wirklich dazu bereit sind, können wir etwas hacken ...

Wie bereits erwähnt, sind MediaStream und MediaRecorder für Live-Video gedacht. Wir können also statische Videodateien mit den Methoden [HTMLVideoElement | HTMLCanvasElement].captureStream() in Livestreams konvertieren.
Wir können diese Live-Streams dank der MediaRecorder API auch in einer statischen Datei aufzeichnen.

Es ist jedoch nicht möglich, die aktuelle Stream-Quelle, mit der ein MediaRecorder gespeist wird, zu ändern.

Um kleine Videodateien zu einem längeren zusammenzuführen, müssen wir also

  • lade diese Videos in <video> elements
  • Zeichnen Sie diese <video> -Elemente in einem <canvas> -Element in der gewünschten Reihenfolge
  • Feed eine AudioContext-Stream-Quelle mit den <video> -Elemente
  • Verschmelzen Sie die Streams von canage.captureStream und AudioStreamSource in einem einzigen MediaStream
  • Zeichnen Sie diesen MediaStream auf

Aber das bedeutet, dass die Zusammenführung eigentlich eine Neuaufnahme aller Videos ist, und dies kann nur in Echtzeit (Geschwindigkeit = x1) erfolgen

Hier ist ein Live Proof of Concept, bei dem wir zuerst eine originale Videodatei in mehrere kleinere Teile zerlegen, diese Teile mischen, um etwas Montage zu imitieren, dann einen leinwandbasierten Player erstellen, der diese Montage auch aufnehmen und exportieren kann.

NotaBene: Dies ist die erste Version, und ich habe immer noch eine Menge Bugs (notabene in Firefox, sollte fast in Chrom funktionieren).

%Vor% %Vor% %Vor%
    
Kaiido 27.07.2017, 06:36
quelle