Base64-Videocodierung – gute/schlechte Idee? [closed]

Lesezeit: 7 Minuten

Ich arbeite an einem mobilen Front-End-Projekt mit Cordova, und der Back-End-Entwickler, mit dem ich arbeite, besteht darauf, dass die Mediendateien (Bilder/Videos) als Base64-codiert in JSON-Dateien übertragen werden sollten.

Nun, mit Bildern funktioniert es soweit. Obwohl es die Benutzeroberfläche für einige Sekunden einfriert, kann es irgendwie verschoben werden.

Die Videos sind jedoch bisher mühsam zu handhaben, die Länge eines einzelnen/einfachen Videos, das übertragen wird, beträgt fast 300.000. Es bringt meinen armen Laptop durch eine wilde Drehung und bekommt den URI nach etwa 20 Sekunden, nachdem ich den Code durchgegangen bin (und es funktioniert immer noch nicht, und ich habe keine Lust, es zu debuggen, weil es meinen Laptop bei jeder Aktualisierung fast zum Absturz bringt).

Also meine Fragen sind:

  • Ist base64-Codierung eine beliebte Methode zur Übertragung von Medien in der mobilen Entwicklung?
  • Und wenn nicht, welche alternative Methode würden Sie empfehlen, um diese Videos zu übertragen/zu präsentieren?

Ich sollte jedoch erwähnen, dass die Videos von einer großen Anzahl von Personen (vielleicht Hunderten) gleichzeitig angesehen werden sollen, und der andere Entwickler sagt, dass ihre Server einen solchen Datenverkehr nicht bewältigen können.

Vielen Dank für jeden Rat, ich konnte diese Info nirgendwo finden. 🙂

  • base64 ist eine schreckliche Methode zum Übertragen von Videos aus Bandbreiten- und Leistungsperspektive. Verwenden Sie Binärdateien, um den Overhead beim Entpacken zu vermeiden.

    – dandavis

    15. Mai 2015 um 22:47 Uhr

  • Warum nicht eine der vielen kostenlosen Video-Hosting-Sites nutzen, die (eine ebenfalls kostenlose) API bereitstellen? Youtube? Vimeo? Flickr? Base64 ist hier nicht der richtige Weg, zu viele Daten, besonders für mobile Clients.

    – Rob M.

    15. Mai 2015 um 22:47 Uhr


  • Danke für die schnellen Antworten. Ich stimme zu, es scheint eine schreckliche Art zu sein, Videos zu übertragen. 🙂 Die Videos sollten nur für Mitarbeiter sein, daher möchten sie ihren Zugriff darauf einschränken. Welche anderen Alternativen könnte es da draußen geben? Vielen Dank!

    – Shay

    15. Mai 2015 um 22:51 Uhr

  • Sie können MP4-Dateien in Ihrem Intranet auf einer anderen Seite bereitstellen, die sich hinter einem Login befindet, oder die grundlegende Authentifizierung für die Videodateien selbst verwenden, sogar über Apache, wenn nichts Ausgefalleneres.

    – dandavis

    15. Mai 2015 um 22:53 Uhr

  • Das ist natürlich der einfachste Weg und ich wünschte, sie würden das tun, aber sie wollen den Datenverkehr auf ihren Servern nicht überlasten … Ist das sinnvoll oder erhöht Base64 tatsächlich den Datenverkehr? (wegen der größeren übertragenen Dateigröße)

    – Shay

    15. Mai 2015 um 22:56 Uhr

[…] der Backend-Entwickler […] besteht darauf, dass die Mediendateien (Bilder/Videos) als Base64-codiert in JSON-Dateien übertragen werden sollten.

Dies ist eine sehr schlechte (und dumme) Idee im Voraus. Du unterlassen Sie große Mengen binärer Daten als Strings übertragen möchten. Vor allem keine Unicode-Strings.

Hier müssen Sie sich bewaffnen und Ihren Backend-Entwickler-Rebellen davon überzeugen, seine Meinung mit allem, was nötig ist, zu ändern, etwas Biber oder Nickelback zu spielen oder sogar sein Hintergrundbild in etwas Hello Kitty zu ändern oder einen Schnappschuss seines Bildschirms zu machen, es einzustellen als Hintergrund und blenden Sie alle Symbole und die Leiste aus. Das sollte dir helfen, seine Meinung zu ändern. Wenn nicht, stellen Sie einen Webasto in sein Büro auf Maximum und verriegeln Sie alle Türen und Fenster.

Ist base64-Codierung eine beliebte Methode zur Übertragung von Medien in der mobilen Entwicklung?

Es ist beliebt und hat eine relativ lange Geschichte und wurde im Usenet und so weiter sehr verbreitet. Damals war die Datenmenge im Vergleich zu heute jedoch sehr gering, da alle Daten über Modems übertragen wurden.

Aber nur weil es beliebt ist, bedeutet es nicht, dass es das richtige Werkzeug für alles ist. Es ist nicht sehr effizient, da es einen Kodierungsprozess erfordert, der drei Oktetts in vier Bytes umwandelt, was eine Hinzufügung von 33 % zur Größe verursacht.

Darüber hinaus: In JavaScript wird jedes Zeichenfolgenzeichen aufgrund des Unicode-Zeichensatzes als zwei Bytes gespeichert, sodass Ihre Daten verdoppelt und um 33% erweitert werden. Ihre 300-MB-Daten sind jetzt 300 x 2 x 1,33 = 798 MB (zeigen Sie das Ihrem Backdev! :), da dies ein echter Faktor ist, wenn die Server nicht mit großem Datenverkehr umgehen können).

Dies funktioniert gut für kleinere Dateien, aber für größere Dateien wie in Ihrem Beispiel kann dies einen erheblichen Zeit- und Speicherverbrauch und natürlich die Bandbreite verursachen. Und natürlich müssten Sie auf der Serverseite den Prozess mit seinem eigenen Overhead umkehren.

Und wenn nicht, welche alternative Methode würden Sie empfehlen, um diese Videos zu übertragen/zu präsentieren?

Ich würde empfehlen:

  • Trennen Sie Metadaten als JSON mit a Hinweis zu den Daten. Keine Binärdaten im JSON.
  • Übertragen Sie die Mediendaten selbst separat in native Bytes (ArrayBuffer).
  • Senden Sie beide gleichzeitig an den Server.

Der Server muss dann nur die JSON-Daten für das Backend in essbare Werte parsen, die Binärdaten können direkt auf die Festplatte gehen.

Aktualisieren Ich habe vergessen zu erwähnen, wie es Pablo in seiner Antwort tut, dass Sie sich mit dem Streamen der Daten befassen können.

Streaming ist jedoch so ziemlich ein Synonym für Pufferung Bandbreite wird ungefähr gleich sein, nur auf eine brutalere Art und Weise bereitgestellt (normalerweise UDP gegenüber TCP, dh der Verlust von Paketen unterbricht die Übertragung nicht). Beim Streamen sind Ihre Optionen jedoch stärker eingeschränkt als beim Puffern im Client.

Meine 2 Cent…

  • Vielen Dank für eine großartige Antwort, ich muss sagen, der Backend-Entwickler war ziemlich sprachlos, hehe. 🙂

    – Shay

    16. Mai 2015 um 18:03 Uhr

  • Wie in meiner Antwort erwähnt, ist das 33% Overhead-Argument ungültig, da die base64-Zeichenfolge ziemlich trivial gzip werden kann.

    – D-Marc

    17. Oktober 2017 um 1:41 Uhr


Benutzer-Avatar
D-Marc

Ich bin mir nicht sicher, warum “33% Overhead” immer erwähnt wird, wenn das völliger Unsinn ist. Ja, es fügt zunächst ungefähr diesen Betrag hinzu, aber es gibt ein kleines Ding namens gzip (schon mal davon gehört?). Ich habe unzählige Tests durchgeführt und der Unterschied ist normalerweise vernachlässigbar. Tatsächlich ist manchmal der gzipped base64-String tatsächlich kleiner als die Binärdatei. Sieh dir das von diesem Typen an Prüfungen. Also bitte, können wir aufhören, absolute Fiktion zu verbreiten.

Base64 ist eine absolut akzeptable Methode zum Abrufen eines Videos. Tatsächlich funktioniert es für ein privates Messaging-System erstaunlich. Wenn Sie beispielsweise AWS S3 verwenden, können Sie die Dateien privat speichern, sodass es keine URL gibt.

Der Hauptnachteil (imho) der Verwendung eines gzippten Base64-Videos besteht jedoch darin, dass Sie warten müssen, bis das gesamte Video geladen ist, sodass Pseudo-Streaming nicht in Frage kommt.

  • Wie wäre es, wenn das Video in Stücke geschnitten wird; Beispielsweise kann die Client-Web-App für Echtzeit-Videokonferenzen ~ 50 KB Videoblöcke erfassen, dann base64 und gzip, dann kann der Webserver das gzippte base64-Bild an die Verbraucher/Clients senden. Würde so etwas mit base64 effizient funktionieren?

    – Quarks

    5. April 2020 um 3:13 Uhr

Base64 ist eine bequeme (aber nicht effiziente) Methode zum Übertragen von Binärdaten. Es ist ineffizient, da die Übertragungsgröße 33 % größer ist als das, was Sie ursprünglich übertragen. Si ist keine beliebte Art der Videoübertragung. Wenn Sie vorhaben, dieses Video zu streamen, sollten Sie nach einem etablierten Protokoll suchen, um genau das zu tun.

Ich würde ein Streaming-Protokoll empfehlen (es gibt viele, aus denen Sie auswählen können).

  • Danke für den Tipp, ich schaue mal nach. 🙂

    – Shay

    15. Mai 2015 um 22:57 Uhr

Ich denke, es ist eine schlechte Idee, Videodateien sind groß. Aber Sie können es mit kleinen Videodateien versuchen. Probieren Sie den Online-Encoder aus https://base64.online/encoders/encode-video-to-base64
Dort können Sie Video in Base64-Daten-URI konvertieren und versuchen, es in HTML einzufügen

Ergebnis so:

<video controls><source src="data:video/mpeg;base64,AAABuiEAAQALgBexAAABuwAMgBexBeH/wMAg4ODgAAA..."></video>

1055060cookie-checkBase64-Videocodierung – gute/schlechte Idee? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy