4

Видео запеченное с данными, вам с каким соусом подавать?

Приветствую жителей уютного мира Пикабу и людей которые решили на меня подписаться.

Пишу в продолжение к моему предыдущему посту о программе для запихивания и извлечения произвольных файлов (данных) внутрь видео файлов.

Предыдущий пост http://pikabu.ru/story/vpikhivaet_lyubyie_dannyie_v_video_il...

Цель данного поста - спросить у вас что вы хотели бы в данную программу добавить, а что изменить.


На данный момент я заканчиваю переписывать внутреннюю структуру алгоритма с бOльшим упором на модульность под вдохновением используемой в некоторых программах системы нод. Конечно, до структур как в Blender или UE4 мне еще далеко. Получается что-то вроде как на этой картинке.

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

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


Сейчас внутренняя структура уже может повторить алгоритм реализованный в предыдущей версии, остается переделать обвязку "морды" программы для соответствия внутреннему миру.

Так же я решил избавить пользователя от выбора формата пикселей (теперь по умолчанию используется YUV420P, но внутренности все еще позволяют его изменять) и добавить новые опции - выбор пресета кодирования H264 (влияет на соотношение скорость/размер/качество) и выбор режима постоянного битрейта или постоянного качества (те кто занимался перекодированием видео или стримом игр уже знакомы с этими настройками)

Ах да, еще один пункт добавился. Реализованный ранее алгоритм позволяет запихнуть в квадрат 8х8 лишь несколько (Density) бит информации и только один раз. Но я тут пыхнул правильной травы переосмыслил прочитанные ранее алгоритмы используемые для несколько иной задачи и сделал заготовку для использования дискретного косинусного преобразования (DCT), и тут получается что в квадрате 8х8 появляется сразу несколько ячеек (Cell Count) куда можно вставить наши биты (Density). При числе ячеек = 1 будет использоваться предыдущий алгоритм, если > 1 то алгоритм c DCT

Следующая картинка визуализирует влияние чисел дискретного косинусного преобразования на получаемую картинку, каждый квадратик соответствует отдельному числу в матрице 8х8:

Правда, на практике испытания я провести еще не успел и данный алгоритм еще только предстоит приспособить к текущей структуре программы и понять можно ли его вообще использовать в реальных условиях.

Собственно, после проверки работоспособности данного алгоритма и я собираюсь выпустить следующую версию программы.


А теперь вопросы к вам, дорогие читатели:


Добавить сжатие? А надо ли? Думаю, пользователь и сам может заранее сжать файл если хочет. Ну, так то можно опционально (по выбору пользователя) делать поблочное сжатие входного файла каким-нибудь ZIP.


Как вы думаете как будет лучше сделать визуализацию оценки возможной ошибки для показа пользователю? В последней версии пользователю выводилась только максимальная из всех найденных оценок ошибки в виде дробного числа от 0 (лучше некуда) до 1 (скорее всего есть ошибки).

Поясню - на стадии вытаскивания информации из кадров есть возможность примерно посчитать  отличие получаемого числа от идеала. Получаемая оценка - что-то вроде отношения сигнал-шум которое строится без использования проверки на наличие ошибок.

Например, можно сделать шкалу распределения шума в файле, но нужны ли такие сложности...


Восстановление ошибок - да, я помню, в комментариях к прошлому посту мне советовали его реализовать, в планах добавить (опциональный) код Рима-Соломона или что-то другое. Займусь этим после реализации алгоритма с DCT.


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


Что-то еще визуализировать? Как это должно выглядеть?

Добавить еще что-то полезное или интересное в алгоритм?

0
Автор поста оценил этот комментарий

а что произойдёт если качество видео понизится? изменится цветопередача?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Если речь идет о том что случится с исходным файлом, то:

при уменьшении качества видео до определенного предела исходный файл раскодируется без ошибок

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

ну и далее количество таких ошибок будет расти.


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

0
Автор поста оценил этот комментарий

По мобильному, это так, на будущее, сейчас нужна стабильная версия, что бы потихоньку набрать аудиторию. Я бы даже сразу сделал 2 ветки legacy и experemental. В первой только функционал с поддержкой всех протоколов предыдущих версий, а во второй уже разворачиваться на всякие фишки и старые протоколы можно задвинуть.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Мне, как любителю, наверное будет трудно две разные ветки тянуть.

Ну там готовые для запуска архивы старых версии еще можно не удалять, если кому будет нужна поддержка старых версий. Или кинуть на Archive.org.


Ладн, пока сяду DCT добавлять, весь вечер разбирался с ошибками нового ядра после привязки к морде.

0
Автор поста оценил этот комментарий
Про совмещение я тоже думал, тут встает вопрос как сделать обнаружение нужных областей. Вручную можно но не так интересно. Пока из идей у меня только статистический поиск насыщенных на изменения участков.

Сделать разделитель\маркер который можно явно определить, например полоска закрашенная в шахматном порядке, или красно-черная полоса в несколько пикселей.


Снизить нагрузку па процессор смартфона можно если не декодировать на лету, а производить преподготовку потока для расшифровки, а по завершению уже декодировать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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


Тогда получается так: сначала просто записываем видео, потом не спеша его раскодирываем.

Честно говоря, под мобилки у меня опыта нет, только один раз какую-то фигню через Unity сделал чтобы проверить что юнити умеет в андройд, не более.

показать ответы
0
Автор поста оценил этот комментарий
Звук добавляет лишнюю сущность, да и в видео можно одни и те же данные впихнуть и в 2 минуты и в 10 секунд (при изменения разрешения), при этом размер файла мало изменится, а вот со звуком такое не пройдет. Да и состыковывай потом два потока данных.

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

Ну а сами алгоритмы восстановления и так рассчитаны на то что будут проявляться ошибки.

Впрочем, если в звуке данные получится упаковывать плотнее чем в видео (эксперименты показывают увеличение размера около 10 раз до появляется первых ошибок для текущего алгоритма), то можно будет использовать звук просто для передачи данных, иначе - не использовать звук вообще.

0
Автор поста оценил этот комментарий

Можно альтернативно использовать аудио канал для дополнительной коррекции ошибок в блоке.

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

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

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

А так же, можно было бы выложить исходники на гитхаб, если автор этого хочет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

P.S. Вообще-то при текущем кодировании при плотности (Density) равной 1 обеспечивается укладка 1.5 бит на 8х8 пикселей экранного изображения.

0
Автор поста оценил этот комментарий

Можно альтернативно использовать аудио канал для дополнительной коррекции ошибок в блоке.

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

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

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

А так же, можно было бы выложить исходники на гитхаб, если автор этого хочет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Звук добавляет лишнюю сущность, да и в видео можно одни и те же данные впихнуть и в 2 минуты и в 10 секунд (при изменения разрешения), при этом размер файла мало изменится, а вот со звуком такое не пройдет. Да и состыковывай потом два потока данных.


Про совмещение я тоже думал, тут встает вопрос как сделать обнаружение нужных областей. Вручную можно но не так интересно. Пока из идей у меня только статистический поиск насыщенных на изменения участков.


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

К примеру, я тут посчитал "попугаев", и получается что для поддержания скорости передачи/принятия данных в 1 Кбит/сек потребуется порядка 160MHz чистой процессорной мощности, куда еще не входят затраты на захват изображения и приведение его к удобоваримому для программы виду.

Если точнее, то процессор i5 4x4GHz при полной загрузке обеспечивает порядка 100Кбит/сек

Теоретически скорость можно поднять за счет плотности, но с учетом дополнительных искажений при захвате изображения сомневаюсь что даже множитель х2 тут будет нормально работать).


В том посте есть ссылки на битбакет (выбран из-за ограничения гитхаба на размер архива релиза, который у меня не такой уж маленький из-за ffmpeg).

В данный момент делаю периодические бекапы своего кривого кода на гитхабе, будет релиз - обновлю битбакет

показать ответы