- PVSM.RU - https://www.pvsm.ru -
неограниченного размера? Звучит как нечто фантастическое и невозможное по законам природы. Примерно как вечный двигатель. Но что, если такое возможно? (не вечный двигатель, конечно, а неограниченный
Если подумать, ведь бесплатное хранилище неограниченного размера предоставляют десятки интернет-сервисов, от соцсетей до фотохостингов. Например, ограничение YouTube на размер одного видеоролика — 12 часов или 256 ГБ [2], но на количество видеороликов ограничений нет.
Теоретически нескольких видеороликов по 256 ГБ достаточно, чтобы спрятать в них зашифрованную копию своего SSD.
Единственное препятствие — они проверяют форматы файлов при загрузке, чтобы избежать злоупотребления сервисом. То есть чисто теоретически достаточно обойти эту проверку — и проблема решена. Но как её обойти?
Сразу приходит в голову вариант изменить расширение файла. Но сегодня такой вариант не проходит практически ни на одном
Но что, если использовать методы стеганографии — и внедрять полезную нагрузку непосредственно в нативный медиафайл? И действительно, есть готовые инструменты для решения этой задачи. Вот некоторые из них.
Ещё раз подчеркнём — статья носит исключительно образовательный и чисто теоретический характер, материалы описанные в статье не являются руководством к действию и не нарушают законодательство.
YouTubeDrive [3] — это пакет для Mathematica, который перекодирует любые файлы в пиксели RGB. То есть любой поток данных просто транскодируется в видеопоток — а потом обратно. Программа написана пять лет назад чисто для проверки концепции, что такое возможно (PoC).
Промежуточный видеоформат создаётся с единственной целью — для видеохостинга.
То есть схема такая:
АРХИВ ФАЙЛОВ → ВИДЕО → YOUTUBE → и обратно АРХИВ ФАЙЛОВ
YouTubeDrive написан на Wolfram Language (язык Mathematica). Он кодирует/декодирует произвольные данные, а видео автоматически загружаются и выгружаются с YouTube.
Поскольку YouTube не накладывает никаких ограничений на общее количество видео, которые могут загружать пользователи, это обеспечивает фактически неограниченный
Вот код пакета [4]. Разумеется, для его работы должна быть установлена сама программа Mathematica [5].
YouTubeDrive использует стандартные утилиты FFmpeg [6], youtube-upload [7] и youtube-dl [8]. Эти программы необходимо загрузить и установить отдельно, а перед первым использованием в пакете YouTubeDrive.wl (строчки 75–77) нужно указать места их установки:
FFmpegExecutablePath = "FFMPEG_PATH_HERE";
YouTubeUploadExecutablePath = "YOUTUBE-UPLOAD_PATH_HERE";
YouTubeDLExecutablePath = "YOUTUBE-DL_PATH_HERE";
Например, таким образом:
75 | FFmpegExecutablePath = "C:\ffmpeg.exe";
76 | YouTubeUploadExecutablePath = Sequence["python",
77 | "C:\Users\j0ker\AppData\Local\Programs\" <>
78 | "Python\Python35\Scripts\youtube-upload.py"];
79 | YouTubeDLExecutablePath = "C:\youtube-dl.exe";
После установки этих программ и изменения конфигурационных файлов можно открыть сам пакет YouTubeDrive.wl в программе Mathematica (через File ⇨ Install... ⇨ Package ⇨ From File ⇨ YouTubeDrive.wl).

Перед использованием с помощью youtube-upload загружаем тестовое видео в свой аккаунт, логинимся в YouTube — и получаем токен OAuth. Этот токен аутентификации понадобится для загрузки видеороликов через YouTubeDrive.
Алгоритм работы YouTubeDrive довольно понятен. В пакете две основные функции:
YouTubeUpload[bytearr] кодирует массив данных bytearr как простое видео RGB, загружает на YouTube и возвращает ID видео.
По умолчанию кодируется 64×36 пикселя RGB, которые масштабируются в 2304 квадратика 20×20 пикселей кадра 1280×720. Значения RGB только 0 или 255, то есть получается три бита на квадратик. Значения RGB записываются в файлы .PNG, которые с помощью кодека FFmpeg склеиваются в валидный видеоролик MP4, способный пережить дальнейшее транскодирование на сервере YouTube.
Monitor[Do[Image`ImportExportDump`ImageWritePNG[
"frame_" <> IntegerString[i, 10, numDigits] <> ".png", frame[i]],
{i, numFrames}], ProgressIndicator[i, {1, numFrames}]];
If[numLeftoverBytes > 0, Image`ImportExportDump`ImageWritePNG[
"frame_" <> IntegerString[numFrames + 1, 10, numDigits] <> ".png",
finalFrame]];
Run[FFmpegExecutablePath,
"-i", "frame_%0" <> ToString[numDigits] <> "d.png",
"-c:v", "libx264", "-preset", "ultrafast",
"-vf", "scale=1280:720", "-sws_flags", "neighbor", "data.mp4"];
procInfo = RunProcess[{YouTubeUploadExecutablePath,
"--title="DATA-" <> ToUpperCase@CreateUUID[] <> """,
"data.mp4"}];
В реальности транскодер YouTube может случайно поменять местами значения отдельных пикселей 0 и 255, поэтому большие квадраты 20×20 выполняют роль механизма коррекции ошибок.
YouTubeRetrieve возвращает видеоролик YouTube с указанным идентификатором ID videoid, декодирует его и возвращает полученные данные в видео объекта ByteArray:
RunProcess[{FFmpegExecutablePath,
"-i", FileNameJoin[{tempDir, videoFile}], "frame_%d.png"}];
numFrames = Max[FromDigits /@ StringTake[FileNames["frame_*.png"], {7, -5}]];
rdata = Monitor[Join @@ Table[ByteArray[FromDigits[#, 2] & /@
Partition[Join @@ classify /@ Join @@ ImagePartition[
First@Image`ImportExportDump`ImageReadPNG[
"frame_" <> ToString[i] <> ".png"], 20], 8]],
{i, numFrames - 1}], ProgressIndicator[i, {1, numFrames - 1}]];
lastParts = Join @@ ImagePartition[First@Image`ImportExportDump`ImageReadPNG[
"frame_" <> ToString[numFrames] <> ".png"], 20];
numPaddedBits = LengthWhile[
Reverse[Join @@ classifyLast /@ lastParts], EqualTo[1 / 2]];
rdata = Join[rdata, ByteArray[FromDigits[#, 2] & /@ Partition[
Drop[Join @@ classify /@ lastParts, -numPaddedBits], 8]]];
Вот и всё.
Примечание. На самом сервере YouTube обработка маленького видеоролика размером около 10 МБ занимает примерно 5–10 минут. Таким образом, сразу после завершения YouTubeUpload[bytearr] файл ещё недоступен для скачивания, нужно немного подождать. Только потом можно запускать вызов YouTubeRetrieve.
Насколько мы поняли, для примера автор программы взял из функции Бесселя простенький ByteArray и запустил YouTubeUpload из нашего пакета. В программе Mathematica это делается примерно так:

Результат кодирования массива данных объёмом чуть больше 18 КБ в видеоформат выглядит следующим образом [9]:
Если интересно, можно скачать видеоролик и посмотреть на него, можно даже расшифровать вручную. Вместо youtube-dl для скачивания видео с YouTube сейчас обычно используют более продвинутый форк yt-dlp [10].
Список доступных форматов:
yt-dlp --list-formats "https://www.youtube.com/watch?v=Fmm1AeYmbNU"
[youtube] Fmm1AeYmbNU: Downloading webpage
[youtube] Fmm1AeYmbNU: Downloading android player API JSON
[info] Available formats for Fmm1AeYmbNU:
ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb0 mhtml 48x27 │ mhtml │ images storyboard
139 m4a audio only │ 6.84KiB 54k https │ audio only mp4a.40.5 54k 22050Hz low, m4a_dash
249 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz low, webm_dash
250 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz low, webm_dash
140 m4a audio only │ 15.43KiB 136k https │ audio only mp4a.40.2 136k 44100Hz medium, m4a_dash
251 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz medium, webm_dash
17 3gp 176x144 6 │ 26.54KiB 222k https │ mp4v.20.3 222k mp4a.40.2 0k 22050Hz 144p
394 mp4 256x144 25 │ 25.28KiB 235k https │ av01.0.00M.08 235k video only 144p, mp4_dash
160 mp4 256x144 25 │ 82.20KiB 765k https │ avc1.4d400c 765k video only 144p, mp4_dash
278 webm 256x144 25 │ 72.33KiB 673k https │ vp9 673k video only 144p, webm_dash
395 mp4 426x240 25 │ 66.86KiB 622k https │ av01.0.00M.08 622k video only 240p, mp4_dash
133 mp4 426x240 25 │ 254.76KiB 2371k https │ avc1.4d4015 2371k video only 240p, mp4_dash
242 webm 426x240 25 │ 163.19KiB 1519k https │ vp9 1519k video only 240p, webm_dash
396 mp4 640x360 25 │ 89.98KiB 837k https │ av01.0.01M.08 837k video only 360p, mp4_dash
134 mp4 640x360 25 │ 363.73KiB 3386k https │ avc1.4d401e 3386k video only 360p, mp4_dash
18 mp4 640x360 25 │ ~440.62KiB 3524k https │ avc1.42001E 3524k mp4a.40.2 0k 44100Hz 360p
243 webm 640x360 25 │ 238.27KiB 2218k https │ vp9 2218k video only 360p, webm_dash
397 mp4 854x480 25 │ 116.18KiB 1081k https │ av01.0.04M.08 1081k video only 480p, mp4_dash
135 mp4 854x480 25 │ 469.24KiB 4368k https │ avc1.4d401e 4368k video only 480p, mp4_dash
244 webm 854x480 25 │ 298.72KiB 2780k https │ vp9 2780k video only 480p, webm_dash
398 mp4 1280x720 25 │ 150.16KiB 1397k https │ av01.0.05M.08 1397k video only 720p, mp4_dash
136 mp4 1280x720 25 │ 512.91KiB 4774k https │ avc1.64001f 4774k video only 720p, mp4_dash
22 mp4 1280x720 25 │ ~614.20KiB 4913k https │ avc1.64001F 4913k mp4a.40.2 0k 44100Hz 720p
247 webm 1280x720 25 │ 380.61KiB 3543k https │ vp9 3543k video only 720p, webm_dash
Скачиваем формат 22:
yt-dlp --format 22 "https://www.youtube.com/watch?v=Fmm1AeYmbNU"
[youtube] Fmm1AeYmbNU: Downloading webpage
[youtube] Fmm1AeYmbNU: Downloading android player API JSON
[info] Fmm1AeYmbNU: Downloading 1 format(s): 22
[download] Destination: DATA-34DFE96A-BFE6-4405-A9E3-CFB9959CD3CA [Fmm1AeYmbNU].mp4
[download] 100% of 527.20KiB in 00:00
На этом файле в Mathematica можно запустить функцию YouTubeRetrieve из пакета YouTubeDrive, которая выполнит обратное преобразование.
Конечно, такая схема кодирования не очень эффективна — примерно 1 минута видео на 1 МБ информации. Этот параметр можно легко увеличить на порядок (до 10 МБ на минуту видео), если вместо квадратов 20×20 внедрить какой-нибудь нормальный алгоритм коррекции ошибок [11].
YouTubeDrive — чисто экспериментальная программа. Автор подчёркивает, что ни в коем случае не поддерживает её использование в промышленных масштабах. Как мы уже сказали, программа написана пять лет назад чисто для доказательства концепции.
Идея хранилища файлов на YouTube выглядит весьма привлекательно. Два года назад появилась программка fvid [12], которая кодирует файлы без необходимости устанавливать Mathematica. Из зависимостей ей нужен только FFmpeg и libmagic.
Она работает проще. Кодирование произвольного файла в видеоформат:
fvid -i [input file] -e
fvid -i [input file] --framerate 1 -e
fvid -i [input file] --password "xyz" -e
Декодирование:
fvid -i [input video] -d
В продолжение этой темы недавно вышла утилита YouBit [13]. Так сказать, последнее достижение прогресса в данной области.
По сравнению с предшественниками — YouBit значительно усовершенствован. Можно сказать, что это новый уровень по качеству кодирования.
Во-первых, здесь автор отказался от использования цветовой субдискретизации [14], а всю информации кодирует только в канале яркости. В результате получаются чёрно-белые видеоролики, но зато кодирование и декодирование становятся заметно проще — и выполняются быстрее.
В канале яркости пиксели принимают значение от 0 до 255. Соответственно, если мы кодируем в пикселе один бит (параметр bpp: 1, то все значения от 128 до 255 воспринимаются как единица, а меньшие значения — как 0. Для примера, если кодировать в одном пикселе два бита (00, 01, 10 или 11), то весь диапазон яркости разбивается на четыре области (0–63, 64–127, 128–191, 192–255) и так далее. Чем больше бит на пиксель, тем меньше размер файла и выше вероятность некорректной расшифровки конкретного бита после транскодирования видео на серверах YouTube.
Во-вторых, автор придумал оригинальный способ оптимизации видеороликов конкретно под специфический энкодер YouTube, чтобы повысить надёжность их последующего декодирования. Правда, теперь для успешного декодирования файлов уже необходимо их сначала залить на YouTube, а потом скачать результат.
В-третьих, YouBit работает с видео любого разрешения. Оптимально 1920×1080.
Наконец (в-четвёртых), автор реализовал функцию «нулевых фреймов» — вставки чёрных кадров между кадрами с полезной нагрузкой, что позволяет снизить битрейт примерно на 40% (и размер файла) при кодировании видео на сервере YouTube.
Использование:
python -m youbit upload C:/myfile.txt chrome
Аргумент chrome указывает, из какого браузера YouBit должен извлечь куки для аутентификации на YouTube (соответственно, этот браузер должен авторизоваться на studio.youtube.com/ [15], открыть сессию и получить куку).
Затем загрузка происходит непосредственно с помощью headless-браузера Selenium [16] в фоновом режиме. Очень грамотный подход.
Скачивание и обратное декодирование видео:
python -m youbit download https://youtu.be/dQw4w9WgXcQ
Декодирование локального видео, скачанного с YouTube:
python -m youbit decode C:/myvideo.mp4
Все операции можно выполнять через Python API.
Пример видео [17]:
Как мы уже говорили, ограничения YouTube на размер видеоролика — 12 часов или 256 ГБ. Если аккаунт не верифицирован, ограничение 15 минут.
Настройка YouBit по умолчанию на размер одного файла — 9 ГБ, но её можно скорректировать при желании.
Неограниченные хранилища файлов предоставляют и другие сервисы, например:
Для работы с этими «нетрадиционными хостингами» можно написать свой клиент/файл-менеджер — небольшую программку для закачки файлов через YouBit, чтобы не запускать её вручную.
В идеале хотелось бы добавить туда следующие функции:
Но это в идеале. В минимальном варианте хватит и простого скрипта, который в пакетном режиме просто кодирует через YouBit пару сотен файлов в формат MP4 — и заливает видеофайл на несколько видеохостингов.
Что касается хранения файлов на YouTube (и в других сервисах крупных корпораций) — суть сводится к тому, чтобы использовать инфраструктуру не совсем так, как это предполагается, но при этом совершенно легально. Повторюсь, если пользователь маскирует свои личные файлы под видеоролики и заливает их на публичный
— 15% на все тарифы VDS [18] (кроме тарифа Прогрев) — HABRFIRSTVDS.
Автор:
FirstJohn
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/youtube-2/377125
Ссылки в тексте:
[1] Хостинг: https://www.reg.ru/?rlink=reflink-717
[2] 12 часов или 256 ГБ: https://support.google.com/youtube/answer/71673?hl=EN
[3] YouTubeDrive: https://github.com/dzhang314/YouTubeDrive
[4] код пакета: https://github.com/dzhang314/YouTubeDrive/blob/master/YouTubeDrive.wl
[5] Mathematica: https://www.wolfram.com/mathematica/
[6] FFmpeg: https://ffmpeg.org/
[7] youtube-upload: https://github.com/tokland/youtube-upload
[8] youtube-dl: https://rg3.github.io/youtube-dl/
[9] выглядит следующим образом: https://www.youtube.com/watch?v=Fmm1AeYmbNU
[10] yt-dlp: https://github.com/yt-dlp/yt-dlp
[11] алгоритм коррекции ошибок: https://habr.com/ru/company/first/blog/673582/#:~:text=%D0%98%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%B8%D1%82%D1%84%D0%BB%D0%B8%D0%BF%D0%BE%D0%B2
[12] fvid: https://github.com/AlfredoSequeida/fvid
[13] YouBit: https://github.com/MeViMo/youbit
[14] цветовой субдискретизации: https://en.wikipedia.org/wiki/Chroma_subsampling
[15] studio.youtube.com/: https://studio.youtube.com/
[16] Selenium: https://www.selenium.dev/
[17] Пример видео: https://www.youtube.com/watch?v=dnhlx48t-h4
[18] 15% на все тарифы VDS: https://firstvds.ru/?utm_source=habr&utm_medium=article&utm_campaign=product&utm_content=vds15exeptprogrev
[19] Источник: https://habr.com/ru/post/676282/?utm_source=habrahabr&utm_medium=rss&utm_campaign=676282
Нажмите здесь для печати.