web-dev-qa-db-ja.com

Base64ビデオエンコーディング-good \ bad idea?

Cordovaを使用するモバイルフロントエンドプロジェクトで作業しています。私が使用しているバックエンド開発者は、メディアファイル(画像/ビデオ)をjsonファイルでエンコードされたbase64として転送する必要があると主張しています。

今、画像でこれまでのところ機能しています。 UIが数秒間フリーズしますが、なんとかして延期できます。

ただし、これまでのところビデオの処理は面倒であり、転送される単一/単純なビデオの長さは約300,000です。それは私の貧弱なラップトップを乱暴に通過させ、コードを実行して約20秒後にURIを取得します(そしてそれでも機能しません、そしてデバッグする気がしないので、更新するたびにラップトップがほとんどクラッシュします)。

だから私の質問は:

  • Base64エンコードは、モバイル開発でメディアを転送する一般的な方法ですか?
  • そうでない場合、これらのビデオを転送/提示するために使用することをお勧めする代替方法は何ですか?

ただし、動画は多数の人(おそらく数百人)が一度に視聴するためのものであり、他の開発者はサーバーがそのようなトラフィックを処理できないと述べています。

アドバイスをありがとう、私はどこにもこの情報を見つけることができませんでした。 :)

20
Shay

[...]バックエンド開発者[...]は、メディアファイル(画像/動画)をjsonファイルにエンコードされたbase64として転送する必要があると主張しています。

これは非常に悪い(そしてばかげた)アイデアです。大量のバイナリデータを文字列として転送したいしない。特にUnicode文字列ではありません。

ここでは、バックエンドの開発者に準備を整えて説得して、必要なもので心を変えたり、BiberやNickelbackをプレイしたり、背景画像をハローキティに変えたり、画面のスナップショットを撮ったり、設定したりする必要があります。背景として、すべてのアイコンとバーを非表示にします。これはあなたが彼の心を変えるのに役立つはずです。そうでない場合は、ウェバストを彼のオフィスに最大に置き、すべてのドアと窓をロックします。

Base64エンコードは、モバイル開発でメディアを転送する一般的な方法ですか?

それは人気があり、比較的長い歴史があり、Usenetなどで非常に一般的になりました。しかし、当時はすべてのデータがモデム経由で転送されていたため、データ量は今日に比べて非常に少なかった。

ただし、人気があるからといって、それがすべてに適したツールであるとは限りません。 3オクテットを4バイトに変換するエンコードプロセスが必要であり、サイズが33%増加するため、あまり効率的ではありません。

その上:JavaScriptでは、Unicodeの文字セットにより、各文字列の文字が2バイトとして格納されるため、データが2倍になり、33%拡張されます。これで、300 mbのデータは300 x 2 x 1.33 = 798 mbになります(それをbackdevに表示してください!:)。これは、サーバーが大量のトラフィックを処理できない場合の実際の要因です)。

これはファイルが小さい場合は問題なく機能しますが、例のようにファイルが大きい場合は、時間とメモリの使用量、そしてもちろん帯域幅の両方に大きなオーバーヘッドが発生する可能性があります。そしてもちろん、サーバー側では独自のオーバーヘッドでプロセスを逆にする必要があります。

そうでない場合、これらのビデオを転送/提示するために使用することをお勧めする代替方法は何ですか?

私がお勧めします:

  • データへのreferenceを使用して、メタデータをJSONとして分離します。 JSONにバイナリデータはありません。
  • メディアデータ自体を個別にnative bytes(ArrayBuffer)で転送します。
  • 同時に両方をサーバーに送信します。

サーバーは、JSONデータを解析してバックエンドの食用に変換するだけでよく、バイナリデータを直接ディスクに送ることができます。

更新 Pabloが彼の回答で行っているように、データのストリーミングを調べることができることを言及するのを忘れていました。

ただし、ストリーミングはバッファリングの同義語であるため、bandwidthはほぼ同じで、より強力な方法(通常はUDPとTCP、つまり、パケットの損失によって転送が中断されることはありません)。ただし、クライアントでのバッファリングよりもオプションを制限したストリーミング。

私の2セント...

13
user1693593

なぜ「33%のオーバーヘッド」が常に言及されているのかはわかりません。はい、最初は大体その量を追加しますが、gzipと呼ばれる小さなものがあります(聞いたことはありますか?)。私はたくさんのテストをしてきましたが、その違いは通常ごくわずかです。実際、gzipされたbase64文字列は、バイナリファイルよりも実際に小さい場合があります。この男の tests をチェックしてください。ですから、絶対的なフィクションを広めるのをやめてください。

Base64は、ビデオを取得するための完全に受け入れ可能な方法です。実際には、プライベートメッセージングシステムには素晴らしい働きをします。たとえば、AWS S3を使用している場合は、ファイルをプライベートに保存して、URLをなくすことができます。

ただし、gzip圧縮されたbase64ビデオを使用することの主な欠点(imho)は、ビデオ全体がロードされるまで待機する必要があるため、疑似ストリーミングは問題外です。

6
D-Marc

Base64は、バイナリデータを転送する便利な(ただし効率的ではない)方法です。転送サイズは元の転送サイズより33%大きくなるため、非効率的です。 Siそれはビデオを送信する一般的な方法ではありません。そのビデオをストリーミングする予定がある場合は、それを行うための確立されたプロトコルを探す必要があります。

ストリーミングプロトコルをお勧めします(選択肢はたくさんあります)。

1