2015-05-15 3 views
5

Я работаю над мобильным интерфейсом проекта с использованием cordova, а разработчик backend, с которым я работаю, настаивает на том, чтобы медиафайлы (изображения/видео) были переданы как base64, закодированные в json-файлах.Base64 кодирование видео - хорошая плохая идея?

Теперь, с изображениями, он до сих пор работает. Хотя он замораживает пользовательский интерфейс в течение нескольких секунд, его можно отложить как-то.

Видео, однако, до сих пор является болью для обработки, длина передаваемого одиночного/простого видео составляет почти 300 000 в длину. Это приносит мой плохой ноутбук с диким вращением и получает uri примерно через 20 секунд после прохождения кода (и он все еще не работает, и мне не хочется отлаживать его, потому что он почти сбивает мой ноутбук при каждом обновлении).

Так что мои вопросы:

  • ли кодирование base64 популярный способ передачи медиа в разработке мобильных приложений?
  • А если нет, какой альтернативный способ вы бы рекомендовали использовать для передачи/представления этих видео?

Следует отметить, что видео должны быть просмотрены сразу множеством людей (возможно, сотни), а другой разработчик говорит, что их серверы не могут обрабатывать такой трафик.

Большое спасибо за любой совет, я не смог найти эту информацию в никуда. :)

+0

base64 - ужасный способ передачи видео с точки зрения пропускной способности и производительности, используйте двоичный код, чтобы избежать распаковки служебных данных. – dandavis

+0

Почему бы не использовать один из множества бесплатных хостинговых сайтов, которые предоставляют (а также бесплатный) API? YouTube? Vimeo? Flickr? Base64 - это не путь, слишком много данных, особенно * для мобильных клиентов. –

+0

Спасибо за быстрые ответы. Я согласен, это кажется ужасным способом передачи видео. :) Видео должны быть только для сотрудников, поэтому они хотят ограничить их доступ к ним. Какие еще альтернативы могут быть там? Благодаря! – Shay

ответ

5

[...] разработчик бэкэнд [...] настаивает на том, чтобы медиафайлы (изображения/видео) были переданы как base64, закодированные в json-файлах.

Это очень плохая (и глупая) идея вверх. Вы не хотите передать большое количество двоичных данных в виде строк. Особенно не строки Unicode.

Здесь вам нужно поднять руку и убедить своего бэкэнда-повстанца, чтобы передумать с тем, что потребуется, играть в Biber или Nickelback или даже сменить его фоновое изображение на что-то Hello Kitty или сделать снимок его экран, установите его как фон и скройте все значки и панель. Это должно помочь вам передумать. Если нет, поместите webasto в свой офис по максимуму и заблокируйте все двери и окна.

Является ли base64 кодировкой популярного способа передачи мультимедиа в мобильные разработки?

Он популярен и имеет относительно долгую историю и стал очень распространенным явлением на Usenet и так далее. Однако в те дни количество данных было очень низким по сравнению с сегодняшним днем ​​как все данные, переданные по модемам.

Однако, поскольку это популярно, это не значит, что это правильный инструмент для всего. Это не очень эффективно, так как для этого требуется процесс кодирования, который преобразует три октета в четыре байта, вызывая добавление 33% к размеру.

Кроме того: в JavaScript каждый строковый символ хранится в виде двух байтов из-за набора символов Unicode, поэтому ваши данные удваиваются и расширяются на 33%. Ваши 300 мб данных теперь 300 х 2 х 1,33 = 798 мб (покажите это на вашем backdev! :), поскольку это реальный фактор, если серверы не могут обрабатывать большой объем трафика).

Это работает отлично для небольших файлов, но для более крупного файла, как в вашем примере, это может вызвать значительные накладные расходы как при использовании времени, так и в памяти, и, конечно же, пропускную способность. И, конечно же, на стороне сервера вам нужно будет перевернуть процесс со своими собственными накладными расходами.

А если нет, то какой альтернативный способ вы бы рекомендовали использовать для передачи/представления этих видео?

Я бы рекомендовал:

  • Отдельные мета-данные, как JSON с ссылкой к данным. В JSON нет двоичных данных.
  • Передача самих данных мультимедиа отдельно в собственных байтах (ArrayBuffer).
  • Отправляйте оба сервера одновременно.

Серверу тогда необходимо только разобрать данные JSON в съедобные для бэкэнд, двоичные данные могут перейти прямо на диск.

Обновление Я забыл упомянуть, как Пабло делает в своем ответе, что вы можете просматривать потоковые данные.

Однако, потоковый в значительной степени синонима с буферизацией так пропускная способностью будет примерно таким же, только при условии, в более грубой силу пути (обычно UDP по сравнению с TCP, то есть. Потеря пакетов не нарушает перевод). Потоковая передача с ограничением ваших вариантов больше, чем буферизация на клиенте.

Мои 2 цента ...

+0

Спасибо за отличный ответ, я должен сказать, что бэкэнд-разработчик остался довольно безмолвным хе-хе. :) – Shay

+0

Как упоминалось в [моем ответе] (https://stackoverflow.com/a/46763939/3822526), ​​33% -ный служебный аргумент недопустим из-за возможности gzip строки base64 довольно тривиально. –

1

Base64 - удобный (но не эффективный) способ передачи двоичных данных. Это неэффективно, потому что размер передачи будет на 33% больше, чем вы первоначально переносите. Si это не популярный способ передачи видео. Если вы планируете передавать это видео, вам следует искать установленный протокол для этого.

Я бы порекомендовал протокол потоковой передачи (есть много чего выбрать).

+0

Спасибо за совет, я посмотрю. :) – Shay

1

Не знаю, почему «33% накладных расходов» всегда упоминается, когда это полная чушь. Да, это изначально грубо добавляет эту сумму, но есть ли что-то вроде gzip (когда-либо слышали об этом?). Я провел тонны тестов, и разница, как правило, незначительна. На самом деле, иногда строка gzipped base64 на самом деле меньше, чем двоичный файл. Проверьте этот парень tests. Поэтому, пожалуйста, мы можем прекратить распространение абсолютной фантастики.

Base64 - вполне приемлемый способ извлечения видео. На самом деле, он отлично работает для частной системы обмена сообщениями. Например, если вы используете AWS S3, вы можете хранить файлы в частном порядке, чтобы не было URL-адреса.

Однако основной недостаток (imho) использования видео с поддержкой gzipped base64 заключается в том, что вам нужно дождаться загрузки всего видео, поэтому для псевдопотока не может быть и речи.

Смежные вопросы