Впихиваем данные в видео, еще больше и с гарантией

Впихиваем данные в видео, еще больше и с гарантией Программирование, Csharp, Видео, Программа, Кодирование, Длиннопост

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


Ссылка на предыдущий пост http://pikabu.ru/story/video_zapechennoe_s_dannyimi_vam_s_ka...


По сравнению с прошлым постом:

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

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

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

- добавлен и протестирован алгоритм коррекции ошибок (коды Рида-Соломона), в текущей реализации исправляет примерно 20% ошибок, но увеличивают объем данных в 1.5 раза

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


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

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

Здесь внутри видео сохранена следующая картинка весом чуть меньше 1 мегабайта

Впихиваем данные в видео, еще больше и с гарантией Программирование, Csharp, Видео, Программа, Кодирование, Длиннопост
Да-да, та же картинка что и в прошлый раз. Или прикажете использовать каноничную картинку "Lenna.jpg" ? :)


Между делом поразмышлял о коррекции ошибок.

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

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


На данном графике я показал соотношение следующих величин при разном объеме корректирующих кодов добавленных к полезным данным:

- плотность полезных данных, отношение исходного объема данных к объему после добавление кодов коррекции

- максимальный объем ошибок которые можно будет исправить

- отношение количества поправимых ошибок к объему кодов коррекции ("самообслуживание")

- отношение количества поправимых ошибок к объему полезных данных ("полезные" ошибки)

Впихиваем данные в видео, еще больше и с гарантией Программирование, Csharp, Видео, Программа, Кодирование, Длиннопост

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


Введение коррекции ошибок также повлияло и на скорость работы алгоритма. К тому же и второй алгоритм кодирования на основе ДКП работает медленнее чем первый, но он позволяет вставить больше данных за раз, так что общая скорость будет больше... но только пока вы не ограничены качеством видео на Youtube, тут как не вертись, прибавки к скорости относительно прошлой версии программы не получится добиться. А вот если сохранять просто в MP4 без расчета что видео будет перекодировано, то можно поставить настройки и "побыстрее".


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

Да, и это с учетом что введена коррекция ошибок.


Максимальные настройки для Youtube:

Density = 1

CellCount = 5


Поясню насчет Density и CellCount:

Впихиваем данные в видео, еще больше и с гарантией Программирование, Csharp, Видео, Программа, Кодирование, Длиннопост

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


Репозиторий https://bitbucket.org/Filarius/videofy

Последняя версия https://bitbucket.org/Filarius/videofy/downloads/Videofy%200...


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

Для сравнения, на 4-х ядерном процессоре i5 с частотой 4GНz файл в 300 Мбайт кодировался и декодировался по 2 часа.

Программе, вместе с видео-кодировщиком, требуется порядка 500MB RAM при создании видео с разрешением 720р.


Принимаются пожелания по дальнейшему улучшению.

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

Благодарю!

Интересная разработка.

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

В 90-е существовал аппаратно-программный комплекс АрВид, который умещал на 180 минутную видеокассету около 2 гигабайт. По рассказам очевидцев - такая плотность достигалась даже без использования цвета и звука. Я не специалист, но, возможно, если вы нагуглите и поковыряете ПО, сможете почерпнуть некоторые идеи.

раскрыть ветку
Автор поста оценил этот комментарий
Пиши коррекцию ошибок в аудио-поток
раскрыть ветку
Автор поста оценил этот комментарий
Вишмастера вшил надеюсь? Ну или хотя бы майнера.
раскрыть ветку
Автор поста оценил этот комментарий

Раньше на кассетах хранили данные (даже на видеокассетах), да что там говорить, на перфокартах и перфолентах - теперь данные в видео файлах! )