вторник, 12 февраля 2013 г.

PixiVisor - передача видео через звук

Расскажу об одной необычной программе, которую выпустил несколько дней назад. Будет здорово, если найдутся люди, которым это окажется так же интересно, как мне. 
Это PixiVisor 
В основе - передача видеосигнала через звук.



Идея


Увлекаясь всякими странными штуками, я уже давненько вынашиваю план создания записывающего устройства для нарезки грампластинок, дабы получить твердую копию своей музыки, которую потом можно и увидеть и потрогать. И как-то задумавшись о применении такого аппарата, в голову пришла мысль: "а почему бы не записать на пластинку видео?" Для этого всего лишь потребуется последовательно преобразовывать каждый кадр в звук. И самый простой способ преобразования - построчно сканировать изображение, а яркость пикселя рассматривать как амплитуду отсчета (сэмпла). 
Для этого подойдет любой компьютер с дешевой звуковой картой. В качестве базовой частоты дискретизации выберем самую распространенную - 44100 Гц. Оптимальное разрешение - 64 на 64 пикселя. Кадровая частота = 44100 / ( 64 * 64 ) = 10.76. Не так уж много для качественной картинки, но для экспериментов вполне сойдет. 
Но представив реализацию этого алгоритма на базе двух компьютеров, обменивающихся изображением по аудио кабелю или через микрофон, стало ясно, что применение такой техники далеко не ограничивается записью видео на звуковой носитель. И о том, что получилось в итоге, в красочных примерах расскажу ниже.

Реализация


В качестве языка программирования был выбран Pixilang, как легко портируемый и заточенный на работу с растровой графикой.
Получилась программа, разделенная на две части: передатчик (Transmitter) и приемник (Receiver). 
Передатчик загружает картинку (JPG, PNG, GIF) или анимацию (GIF) и начинает вещать - на лету конвертировать каждый кадр в звук. Выглядит это примерно так: на экране играет анимация, а из динамиков доносится не очень приятное на слух жужжание. 
Приемник выполняет обратное преобразование - звук, принятый через микрофон или линейный вход, превращается в изображение, которое мы видим на экране. Изображение черно-белое, но для него можно назначить одну из 64 цветовых палитр. Принятую анимацию можно записывать в GIF. 
Запускаем приемник и передатчик на разных устройствах, чтобы посмотреть, как они общаются. Так как для тестирования использовались телефон (Android) и планшет (iOS), полный функционал есть только у версии PixiVisor для этих платформ. В версиях для Windows, Linux и OSX временно не работает приемник. Для начала проверим передачу по воздуху, без проводов. 



Что мы видим? 
Красивые искажения картинки, связанные в первую очередь с отражением звука в комнате и с фильтрацией на уровне железа передатчика и приемника. 
Четкая синхронизация отсутствует, поэтому нужно либо на стороне приемника подгонять пальцем картинку, либо в настройках одной из сторон менять значение параметра Finetune.
Влияние положения руки на распространение звука особенно хорошо видно в следующем ролике:



Теперь попробуем передать видеосигнал по аудио кабелю. 
На устройствах Android и iOS отсутствует линейный аудио вход, но есть возможность подключения гарнитуры через разъем TRRS (Jack) с четырьмя контактами. Этим можно воспользоваться и, спаяв нехитрый переходник, получить линейный моно вход. Схема приведена в конце следующего ролика. Можно взять и готовый конвертер. Например, iRig, или какой-нибудь внешний USB аудио интерфейс.



По проводу качество заметно улучшилось. Осталось лишь влияние фильтров на входе и выходе подопытных устройств. iPad заметно глушит низкие частоты при получении сигнала из вне. На картинке это проявляется так: более заметными становятся контуры изображения, а равномерно закрашенные области теряются. Android телефон LG Optimus Hub наоборот глушит высокие при приеме - картинка теряет четкие контуры. 
Но если теперь видео идет у нас по обычному аудио проводу, то почему бы не попробовать исказить этот сигнал при помощи звукового оборудования (процессоры эффектов, микшеры)? Для примера возьмем карманный аналоговый синтезатор Korg Monotron, который послужит нам в роли низкочастотного фильтра.



Лично меня результат впечатлил. Monotron размывает картинку по горизонтали. При этом параметр Peak (Resonance) добавляет контрастные хвосты и искажает изображение до неузнаваемости. 
Попробуем воспользоваться аналоговым микшером Behringer Xenyx 1202FX для микширования двух видеосигналов и наложения эффектов Reverb и Delay (микшер имеет встроенный процессор эффектов).



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

Выводы


Для передачи плавной анимации с разрешением хотя бы 320x240 эта технология конечно не годится. 

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

Синхронизацию можно попробовать реализовать по тому же принципу, что и во "взрослом" телевидении - включив синхроимпульсы между кадров. Но это несколько усложнит алгоритм и внесет дополнительные неудобства для легкого микширования и обработки видеосигналов. 

Чтобы микширование и обработка минимально зависели от синхронизации, на стороне приемника картинку нужно делать бесшовной (как текстура). В этом случае на второй план уходит передача осмысленных изображений с четкими границами кадра (например, фотографии). А на первом плане оказывается передача бесшовных паттернов, которые хорошо показаны в последнем видеоролике. Здесь можно провести аналогию с синтезом звука. Например, один звуковой генератор выдает синус, другой - белый шум. Их можно смешивать, перемножать, не подгоняя фазу одного генератора под фазу другого. Точно так же и с видео в формате PixiVisor: один передатчик выдает бесшовную картинку (паттерн) синуса, другой - белый шум. И эти два сигнала без проблем смешиваются, фильтруются, а на выходе получается красивая анимация, в которой границы кадра не имеют значения. 

Конечно же видеоарт - не единственное достойное применение для программы. Я уверен, что кто-нибудь в процессе экспериментов с PixiVisor найдет еще что-нибудь интересное.

7 комментариев:

Deam комментирует...

Ваще!

soloveev комментирует...

Спасибо!

Сегодня, еще до знакомства с pixilang думал о возможности создания, приложения, которое бы преобразовывало изображение в звук. Такой звуковой инстаграмм. Механика проста — человек фоткает любую фото на телефон, после чего по алгоритму кадр преобразуется в звук. Какафония гармонизируется, можно сделать чтобы, например, белые цвета звучали мягче, темные мрачнее (грубо говоря, хрустальный стакан на фото и небо и темный лес звучали по разному настроению). После чего человек может на полученный семпл звуковой фильтр как в инстаграмме (или поиграться с немногочисленными настройками).
наложить
После этого фото и звук уходят в соц.сеть

screenget комментирует...
Этот комментарий был удален автором.
Unknown комментирует...

Приветствую. Хвалю за реализацию. Написать свой язык и делать на нем программы это круто. Что касательно самой Pixivisor, то вещь уникальная, хоть и технология по сути не нова, думаю многие пользователи позиционируют её просто как игрушку, и не больше, недооценивая её потенциал. Как я понял качество зависит от частоты дескритизации, т.е улучшить качество можно. Вот если бы качество видео доходило бы до 300p при 15 fps и была возможность потокового преобразования с веб-камеры, это было бы ОЧЕНЬ круто, думаю эту программу подхватили бы радиолюбители коем я являюсь, по сути было бы возрождение atv. Так что надеюсь вы не будете забрасывать pixivisor, тема этой проги не раскрыта полностью на мой взгляд). Удачи в ваших проектах)

NightRadio комментирует...

Спасибо!
Увы, в данном варианте высокому разрешению как раз мешает низкая частота дискретизации. А в радио она еще понизится. Там нужно что-то иное выдумывать, и о синхронизации кадров заботиться. А это делать, если честно, не очень хочется :) PixiVisor мне нравится как раз за фантастическую простоту реализации :)

Pavelk комментирует...

Это просто шикарно. Знаете, для чего я искал нечто подобное? Для того, чтобы передавать видео с дрона, используя мобильную связь. Трафик стоит денег, а звонок бесплатный, в одну сторону радиоуправление, а обратно видео, с телеметрией, и такого незамысловатого качества вполне достаточно!
Другой вариант - организовать пакетную передачу, как в диалапе, но это намного сложнее для начинающего программиста.

NightRadio комментирует...

Не уверен, что мобильная связь подойдет - там слишком агрессивное сжатие звука, от исходного сигнала ничего не останется. А для PixiVisor желательно честные 44100 Гц. Да и синхронизация понадобится, чтобы картинку постоянно не подгонять пальцем - но это, я надеюсь, появится в ближайшем обновлении.