Целью websockify + websock.js является прозрачная поддержка потоковых двоичных данных (подробнее об этом ниже).Данные, которые вы получаете из очереди приема, уже декодируются в base64.Однако схема URI данных ожидает строку в кодировке base64, поэтому вам необходимо кодировать данные изображения в base64.Вы можете использовать встроенный window.btoa () для кодирования base64 двоичной строки:
img.src = "data:image/png;base64," + window.btoa(str);
Или, для большей эффективности, вы можете использовать модуль Base64 из include / base64.js, но вам нужно будет передатьэто массив байтов, который вы получили бы от rQshiftBytes:
msg(ws.rQshiftBytes());
img.src = "data:image/png;base64," + Base64.encode(data); // str -> data
Относительно использования base64 в websockify:
Websockify использует base64 для кодирования данных для поддержкибраузеры, которые не поддерживают двоичные данные напрямую.В дополнение к таким популярным браузерам Hixie, таким как iOS Safari и настольный Safari, некоторые версии браузеров в дикой природе используют HyBi, но не поддерживают двоичную поддержку.И, к сожалению, в случае с Chrome у них также была ошибка WebIDL примерно в то же время, которая препятствовала обнаружению двоичной поддержки перед установлением соединения.
Кроме того, основной вариант использования WebSockets в Opera, firefox 3.6-5IE 8 и 9 - это web-socket-js .web-socket-js поддерживает HyBi, но не имеет бинарной поддержки и, вероятно, не будет, потому что большинство старых браузеров, на которые он ориентирован, не поддерживают собственные двоичные типы (Blob и Typed Arrays).
Доля рынкабраузеров, которые поддерживают HyBi и двоичные данные, в настоящее время довольно мало.Тем не менее, в будущем Websockify будет определять (либо путем обнаружения объектов, либо путем определения версии браузера), поддерживает ли браузер двоичные данные и использует их непосредственно, без необходимости кодирования / декодирования base64.
Задержка (и ЦП)) накладные расходы на кодирование / декодирование base64 довольно низки и обычно так или иначе вымываются сетевыми задержками.Издержки пропускной способности для данных, закодированных в base64, составляют около 25% (то есть, необработанные данные становятся на 33% больше), но они дают двоичные данные через WebSockets практически во всех браузерах без изменений (с polyfill / shim web-socket-js, которыйпрозрачно используется websockify, если необходимо).