Стример из MiniDV-видеокамеры

Иногда может захотеться странного. Вот вроде бы лежит себе видеокамера стандарта MiniDV и лежит. Есть не просит. А что если взять и записать на её кассеты вовсе даже не видео, а, скажем, файлы. Запись-то всё равно цифровая. Пусть объём кассеты всего лишь около 13 ГБ (под данные получилось занять около 9.5 ГБ), пусть скорость чтения 3.5 МБ в секунду, но ведь получится простой домашний стример. Так сказать, «стример для бедных». Почему бы не отправить на несколько кассет, скажем, какие-либо важные файлы. Просто так, на всякий случай. Попробуем!
На чём основана запись данных на MiniDV видеокамеру? Да просто можно вместо аудиоданных и части видеоданных подсунуть данные файлов — формат-то цифровой с отдельным сжатием каждого кадра по одинаковому алгоритму. Осталось дело за программой, которая это сможет сделать.

Поискав по интернету, как использовать бытовую видеокамеру как стример, я нашёл на форумах и в статьях десятилетней давности упоминания нескольких программ. Для Windows, например, это были DVStreamer Pro и DVStreamer Lite. За первую лет десять назад авторы просили примерно 60$. Вторая бесплатная, но с массой ограничений (256 файлов не более 8 Мб каждый или один файл не более гигабайта). Плюс многочисленные жалобы на нестабильную работу обеих версий. Скачав со странички производителя данное ПО (версии Lite там почему-то больше нет — похоже, программа теперь одна), обнаружился ещё 30-дневный срок на, так сказать, пробу. И да, эта программа так же, как и десятилетие назад, нестабильно работает и запросто вылетает от перемены погоды на Марсе. Зато она умеет непосредственно управлять камерой и автоматически выполнять перемотку к требуемому файлу.

Ну что ж, а что же у нас доступно для Linux? Оказывается, кое-что доступно, а именно dvbackup-0.0.4. Эта программа способна переданный ей поток данных упаковать в RAW DV формат и передать для записи другой программе dvcontrol, входящей в комплект. Ну и в обратном порядке, он может так же извлечь файлы из RAW DV.

К сожалению, завести dvcontrol мне не удалось — она стабильно не видела данных по ieee1394 от видеокамеры. А что если разобраться с dvbackup и самому сформировать RAW DV файл со своими собственными прибамбасами? Например, вместо статичного логотипа, показываемого видеокамерой во время воспроизведения видео от dvbackup, сделать свой логотип, добавив полоску прогресса и имя записываемого файла, а также добавить поддержку папок.
Осталось решить, чем бы такой RAW файл считать и записать на камеру. А впрочем, всё это давно умеет видеоредактор Kino. Вот его-то мы и будем использовать для работы с видеокамерой. Сказано — сделано. Разобрав dvbackup на части, и довольно быстро сформировав файл данных, я убедился, что Kino может записать этот файл на камеру (при этом ругаясь на невозможную частоту). А вот считать не может. Нет, говорит, видеопотока. Камера меж тем этот самый видеопоток на экранчике прекрасно отображает.

Вот тут-то и пришлось очень внимательно пройтись по формату DV, постепенно заменяя части из dvbackup (часто, с комментариями автора про «магические числа» и неизвестные назначения) на корректные и соответствующие описанию DV-формата. Ряд данных пришлось расшифровывать прямо с реального потока от видеокамеры, так как в моём описании DV-формата такие идентификаторы блоков не описаны. В результате, после очередной доработки напильником, выяснилось, что Kino полученный видеофайл вполне удовлетворяет и он способен производить и запись и чтение данного файла без проблем. Правда, судя по всему, причина изначального неприятия была в том, что я отключил аудио, когда создавал RAW DV файл первый раз. Только ли в этом было дело, я сейчас даже проверять не стал

Итак, в результате экспериментов получилась вот такая вот программа для Windows:

-2kf7u1rgmaormxriicib2tb92m.png

Она умеет собирать файлы в RAW DV видеофайл и извлекать файлы из такого видеофайла. Так же можно очистить отчёт и прервать обработку, если вы передумали. В начале видеоданных и перед каждым файлом можно задать префикс — это такой пустой блок, облегчающий позиционирование на начало файла (между файлами (локальный префикс) можно и не делать вовсе, а вот в самом начале (глобальный префикс) стоит чаще всего задать — это облегчит поиск начала блока файлов). Всё это настраивается в диалогах программы. Так же есть режим проверки данных в DV-видеофайле. В этом режиме файлы извлекаются, но не сохраняются.

Полученный видеофайл вы можете записать на ленту любым редактором, который позволяет записывать файлы RAW DV. В одном из вариантов программы я сделал сборку RAW DV внутрь AVI файла, но оказалось, что использованные мной видеоредакторы при экспорте теряют данные, помещённые в DV-формат. Поэтому от этого варианта пришлось отказаться.

Запись данных на видеокамеру в Kino выглядит вот так:

bf_hkpg8wijgdyb75qexc-lgvbm.png

А так выглядит процесс записи на видеокамере:

ay6d7f_le1i8h4hsvz9jsxki6js.jpeg

Насколько надёжен такой стример? Я записал на кассету часть фотоальбома 9.5 ГБ как набор файлов фотографий в формате jpg примерно по 1–3 МБ. При считывании сбой был зафиксирован у трёх файлов.

Конечно, хотелось бы управлять камерой напрямую, но я пока ещё не нашёл внятного описания работы с камерой по ieee1394. Единственная книжка, где хоть что-то было написано — это «Программирование аппаратных средств Windows», но указанный там пример, во-первых, содержит ошибки, а во-вторых, просто отыскал мне устройство платы ieee1394, установленную в компьютере, а вовсе не видеокамеру. Попытка отправить и принять данные с платы не увенчалась успехом. Поэтому, если кто-нибудь может рассказать о работе с камерой по ieee1394 с использованием WinAPI и на Си/Си++, то буду очень ему благодарен.

Найденное мной описание формата DV.

Репозиторий программы на GitHub

Исходник и исполняемый файл программы

© Habrahabr.ru