WaveCode.
Оптичний код для музики та відео, Rust SDK і вебсканер.
Приклад WaveCode V1. Валідний оптичний кадр, створений Rust-кодером.
Оптичний формат для медіапосилань
WaveCode — оптичний формат для медіапосилань. Невеликий код із заокруглених смуг містить ідентифікатор треку або відео й, якщо платформа підтримує, початковий таймкод. Для декодування не потрібна власна база треків на сервері.
Я розробив Rust-бібліотеку, інструменти кодування й декодування, нативні прив’язки та окремий вебзастосунок для сканування й генерації. У браузері працює та сама Rust-реалізація, скомпільована у WebAssembly, без дублювання алгоритму на TypeScript.
Що я розробив
- Оптичний формат V1, перевірка кадру, корекція помилок і декодування.
- Rust API, CLI, FFI/JVM-прив’язки та інтерфейс WebAssembly.
- Мобільний сканер і генератор: камера, фотографії, експорт SVG/PNG.
Як кодується медіапосилання
На сторінці показаний справжній WaveCode, згенерований Rust-бібліотекою. Це не логотип: у висотах смуг записані дані.
Аналіз посилання
Кодер розпізнає платформу й виділяє ідентифікатор. Таймкод зберігається лише тоді, коли платформа підтримує відповідний формат посилання.
Формування кадру
Ідентифікатор пакується у версіоноване представлення з перевіркою цілісності та надлишковими даними для корекції помилок.
Генерація
Дані відображаються у 36 дворядних колонках, а готовий код експортується в SVG або PNG. Між рядами залишається постійний вільний канал.
Локальне сканування
Rust-декодер через WebAssembly обробляє кадр камери або завантажене фото в браузері й відновлює посилання на оригінальну платформу.
Браузер не відправляє фотографію на сервер розпізнавання, а кодек не звертається до власної бази треків.
Спробувати WaveCode
Живе сканування камерою, імпорт фото, створення кодів та експорт SVG/PNG — у повноцінному вебзастосунку.
Технічні деталі
Формат і корекція помилок
V1 має фіксовану рамку із 36 колонок. Вона містить інформацію для визначення орієнтації, контрольну суму й Reed–Solomon-корекцію помилок. Декодер підтримує обидві орієнтації та може відновлювати частину пошкоджених символів, хоча розмиття й сильна перспектива все ще заважають.
Геометрію зробив стабільною, щоб інформація не залежала від декоративного оформлення. Це важливо, коли той самий код друкується, відображається на екрані або переноситься на невеликий фізичний предмет.
Одна реалізація на Rust
Публічна Rust-бібліотека відповідає за кодування й декодування. Її API доступний із CLI, нативних прив’язок та WebAssembly. Вебзастосунок викликає кодек через worker, тому обробка зображень не блокує інтерфейс.
Так не доводиться підтримувати кілька незалежних декодерів із ризиком різної поведінки. Версіонування дозволяє вдосконалювати формат без прихованої зміни значення старих кодів.
Сканер і користувацький досвід
Вебверсія підтримує сканування камерою, завантаження фото, створення коду з посилання та експорт справжніх SVG/PNG. Сканер перевіряє різні масштаби й фрагменти зображення, а на підтримуваних пристроях доступні вибір камери та ліхтарик.
Усі зображення обробляються локально. Через обмеження камер, експозицію та розмиття не кожний кадр буде прочитаний, тому є альтернативне завантаження фото.
Що вийшло
Бібліотека і браузерний сканер уже працюють, але я продовжую їх вдосконалювати. Повний цикл генерації, сканування та експорту доступний в окремому вебзастосунку; на портфоліо є валідний приклад і перехід до нього.
WaveCode підтримує музичні сервіси та вибрані відеоплатформи, зокрема YouTube, TikTok й Instagram Reels. Проєкт відкритий, а для роботи формату не потрібен власний сервіс ідентифікаторів треків.