Впихивает любые данные в видео (или творчество программиста)

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

Художники создают картинки, музыканты - музыку, но и программистам не чужд зуд творчества.

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


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

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

Поэтому я решил сделать сам.

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

Основная идея - нужно информацию из файла преобразовать в цветные точки на кадрах видео. Исходные файл скармливается некоторому "черному ящику", который выдает серию картинок, картинки с помощью видео-конвертера склеиваются в видео файл MP4 без звука, этот файл можно залить на Youtube, скачать, провести через озвученную цепочку действий в обратном направлении и получить файл идентичный исходному.

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост
Существует не так уж мало способов хранить произвольную информацию в картинках и видео, но поскольку я хотел сделать не "на отлично", а "ну хоть бы вообще работало и желательно уже вчера", то выбрал наиболее простой в реализации - некоторый кусочек данных превращается в квадрат заполненный одним определенным цветом. Из-за особенностей сжатия видео наиболее оптимально подходит квадрат размером 8х8 пикселей.
Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

Множество таких квадратов и составляет кадры видео. В "цветном" режиме цветные квадраты соответственно являются суммой квадратов разных цветов с разной яркостью

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

Как результат, кадр видео выглядит примерно так

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

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

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

А вот и видео, и я вас уже предупредил.

В данном видео сохранена следующая картинка

Впихивает любые данные в видео (или творчество программиста) Программирование, Csharp, Хобби, Файл, YouTube, Кодирование, Я сделяль, Гифка, Видео, Длиннопост

На предмет потыкать - качать здесь.

https://bitbucket.org/Filarius/videofy/downloads/Videofy%200...

Ужаснуться рукожопности автора читая исходники и для параноиков - идти сюда https://bitbucket.org/Filarius/videofy/src


Работает на OS Windows с установленным .Net Framework 4.6

Написано в качестве самообучения C# в VS 2015.

Задействовано:

- FFmpeg (кадры <---> видео)

- OpenCV (оптимизация некоторых действий)

- Livestreamer (скачивание видео с Youtube, другие сервисы поддерживаемые Livestreamer'ом не тестировались)


Плюсы:

- можно "сконвертировать" любой файл в видео и обратно (только для видео созданных данной программой)

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

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


Минусы:

- ОЧЕНЬ долго обрабатывает даже небольшие файлы (заметно уже на файлах больше 1 Мбайта)

- размер видео больше исходного файла в 3-8 раз (зависит от настроек)

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

- сомнительная полезность (да кому вообще это нужно?)


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

P.S.S. Я рассматривал и более сложные методы "конвертации" данных в видео, но с появлением работающего прототипа я исчерпал свой творческий зуд, да и "кому вообще это нужно?".

5
Автор поста оценил этот комментарий
Можно общий вопрос-зачем это все?
раскрыть ветку (1)
20
Автор поста оценил этот комментарий

Пост - поделиться своим творчеством, пусть и таким странным.

Программа - как часть творчества.

Тут - наверное, получить еще несколько доказательств (в виде минусов) что такая фигня действительно никому не нужна ¯\_(ツ)_/¯

показать ответы
3
Автор поста оценил этот комментарий

гуглу придется научится распознавать такую порнуху. а для этого им понадобится купить декодер автора поста. профит ))

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

Декодер-то фришный.

Но данной программе можно скармливать запаренные архивы или шифрованные криптоконтейнеры, да и скремблер данных тоже можно в программу добавить :)

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

После многочисленных отзывов мы добавили в робота контроль тональности, он все еще орет, но уже ваши любимые мелодии

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

Видео это набор картинок. А с выкладыванием и у тебя ничего не получилось, потому что видео все равно пережимают.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Как раз у меня все получилось, видео в посте удачно декодируется, хоть оно и было перекодировано Ютубом. Данное видео хранит 1 бит на квадрат в одной цветовой компоненте (а цветовых компонент в видео аж 3), и согласно тестам видео с кодированием на 2 бита тоже удачно восстанавливаются после Ютуба. Вот с 3-мя битами уже идут ошибки.
показать ответы
1
Автор поста оценил этот комментарий
Есть же готовые конверторы текста в картинку, зачем велосипед?
раскрыть ветку (1)
8
Автор поста оценил этот комментарий

А конвертер в видео?

А чтобы еще и выложить в Ютуб/ВК и данные не покоцались?

Да еще и уложить данные поплотнее и использовать цвет? (QR-коды, например, дублирует данные несколько раз, а здесь нет дублирования, по крайней мере в том же смысле).

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

И что я этим докажу? Что при помощи костыля, сделанным группой человек, можно сделать тоже, что и костылем, написанным одним человеком? Я врт например до сих пор жду объяснение, кому эта техника вообще пригодится. Школьникам на ютубе порнуху прятать?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Основная разница между Format Factory и данной техникой в том, что первое занимается конвертацией звука в звук и видео в видео и все это рассчитано для непосредственного потребления человеком,а вторая - для хранения чего угодно внутри видео, не предназначено для просмотра человеком, и предусматривает что это "что угодно" может быть извлечено из видео без изменений.


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

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

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

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

Верь в свою исключительность, я же не запрещаю.

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

Ох, это непросто будет... Но залить на ютуб такое видео идея интересная... Хмм, кто-то уже такое сделал?)

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

Ну...

Конечно, это потребует некоторых знаний и опыта, но уже есть много проектов которые используют тот же VLC, изменяя его под себя. Тот же AceStream который "торрент-тв".

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

Или еще из вариантов можно оформить в виде DirectShow фильтра, так в "Smooth Video Project" например реализован показ видео у которого увеличивается FPS

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

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

Я с помощью FF 3gp в mp3 перегонял, чтоб из видео музыкальный трек понравившийся вытащить. Как будто я просто так именно ее вспомнил. Еще была одна программулина для этих целей- Super (так и называлась).

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

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

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


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

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

показать ответы
4
Автор поста оценил этот комментарий
Из 500 кб картинки сделать 200 мб видео, а потом обратно? Изобретение Format Factory в 2017 году
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Ну, допустим, из 500 Кб картинки получется видео не 200 Мб, а примерно до 4 Мб.

И вы бы не могли продемонстрировать как с помощью Format Factory сделать то же самое, причем не только для картинки но и любого файла вообще?

показать ответы
7
Автор поста оценил этот комментарий

Осталось научиться записывать данные на VHS-кассету, а потом с умным видом носить ее вместо флэшки.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
В свое время такое уже было, называлось ArVid

http://phantom.sannata.ru/articles/arvid.shtml

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

Коррекцию можно было бы организовать через Код Рида — Соломона.

А по сжатию есть еще одна интересная идея:

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

Более внятнее и подробнее тут: https://habrahabr.ru/post/193936/

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

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

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


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

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

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

Кстати Ваш вариант тоже неплох, хоть и сыроват.

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

Были бы конкретные предложения по улучшению - можно было бы и улучшить.

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

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


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

Иллюстрация к комментарию
Иллюстрация к комментарию
показать ответы
Автор поста оценил этот комментарий

@wingblack, пример использования:


В статье написано "файл MP4". А кодек какой? AVC? было бы хорошо. mp4, как и mkv, - всего лишь контейнер для видео-аудио потоков и файлов, вы знаете.


если кодек видеострима AVC, то для скрытой (относительно) передачи можно(в текущей реализации) - демуксирвоать avc-поток, а затем ремукснуть в любой другой mkv в виде второй дорожки (или в mp4, хотя mp4 более капризен как контейнер, нежели mkv - там надо подбирать более совместимый профиль кодека). на выходе будет ролик, у которого будет вторая на первый взгляд "скрытая" дорожка для эпилептиков).

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

Используется кодек x264 (по сути тот же AVC), контейнер mp4 выбран как рекомендуемый для Youtube.

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

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

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

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

Я думал ты про улучшение моей программы - "данные внутри видео".


А для беспроводной передачи сначала нужно купить пару железок которые позволят генерировать и считывать электро-магнитные колебания. Да и данная тема уже достаточно обсосана - WiFi, BlueTooth, DVB-T/C/S, да хоть софт для радиомодема.

показать ответы
Автор поста оценил этот комментарий
3 часа = 180 минут = 10800 секунд.
600 х 10800 = 6480000 секунд = 10800 часов видео. Минимум.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Я подскажу:

размер квадрата - 8х8

квадрат в одной цветовой плоскости соответственно хранит 1, 2, или больше бит информации (видео с максимум 2 бита декодируется удачно после ютуба)

из-за особенностей хранения цвета в видео в большинстве случаев на квадрате 16х16 что выводится на экране используется 4+4+1 квадратов 8х8 из видео.


файл размера 10 Мбайт при плотности кодирования 2 бита превращается в видео 1080р 24 FPS с длинной 36 секунд, или 720р 24 FPS с длинной 81 секунда

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

>Из-за особенностей сжатия видео наиболее оптимально подходит квадрат размером 8х8 пикселей.

Читали мы видимо не глазами?

А так же:
>при значительном изменении видео файл может содержать отдельные ошибки в произвольных местах, может быть заполнен черти чем почти везде, или может вообще не извлечься.

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

Кодер видео наиболее вероятно использует блоки видео по 8х8

Исследование на "подопытных", а также чтение исходников одного из кодеров выявило что в том числе используются блоки по 8х16,16х8, 4х8, 4х4, но на практике блок 8х8 оказался наиболее оптимальным.

4х4 сильнее портятся, 16х16 приводят к сильному увеличению файла.

Автор поста оценил этот комментарий
Если брать квадраты 4*4 или даже 2*2 а лучше 1*1 и в 1080, то видео будет короче
раскрыть ветку (1)
Автор поста оценил этот комментарий
- при этом размер файла видео не особенно изменится (смысла в просмотре на данном этапе нет, файл просто скачивается), как бы это странно не было

- файл более вероятно испортится

2
Автор поста оценил этот комментарий
Я когда начинал читать пост как раз и думал, что автор будет нашпиговывать семантическое осмысленные видеоряды пикселями с инфой. Потом читаю- "проблемы кодирования", ага, все верно, значит нужно применять избыточное кодирование, шифрование с защитой от потерь. Дальше вижу- "блоки 8*8 пикселей". Думаю: отлично! Но в итоге разочаровался, ведь получился какой-то визуализатор винампа.
раскрыть ветку (1)
Автор поста оценил этот комментарий
Данная программа скорее является "Proof of Concept". Я ознакомился с некоторыми статьями по не настолько топорному хранению данных (дискретное косинусное преобразование и фракталы выглядят очень вкусно), но, повторюсь, хотелось побыстрее сделать что-то работающее.

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

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

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

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

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

В порядке ухудшения качества видео (с тем же размером картинки):

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

- отдельные байты файла декодируются неправильно, здесь и далее цифра "ошибки" обычно более 0.8-0.9 (например, может быть 2 ошибочных байта на файл в 1Мбайт)

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

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

показать ответы
4
Автор поста оценил этот комментарий

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

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

Делалось с оглядкой что полученное видео будет выложено на Youtube.

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

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