Мой восьмилетний квест по оцифровке 45 видеокассет. Часть 1 +21


AliExpress RU&CIS

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



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

Часть 2



Вот как сейчас выглядит отснятый материал:




Все семейные видео оцифрованы и доступны для просмотра с приватного медиасервера

Получилось 513 отдельных видеоклипа. У каждого название, описание, дата записи, теги для всех участников с указанием возраста на момент записи. Всё лежит на приватном медиасервере, доступ к которому есть только у членов семьи, а хостинг стоит меньше 1 доллара в месяц.

Эта статья рассказывает обо всём, что я сделал, почему для этого понадобилось восемь лет — и как добиться аналогичного результата гораздо проще и быстрее.

Первая наивная попытка


Примерно в 2010 году моя мама купила какой-то конвертер VHS в DVD и прогнала через него все наши домашние видео.


Оригинальные DVD, которые записала мама (не знаю, что случилось с пропавшими буквами)

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

В 2012 году сестра подарила мне эти DVD-диски. Я скопировал видеофайлы и выложил всё в облачное хранилище. Проблема решена!


DVD-рипы семейных видео в хранилище Google Cloud

Через несколько недель я спросил, смотрел ли кто эти записи. Оказалось, что никто не смотрел. Даже я не смотрел. В эпоху YouTube глупо скачивать трёхчасовые файлы неизвестного содержания в поисках интересных кадров.

Только моя мама обрадовалась: «Отлично, — сказала она, — теперь можно, наконец, выбросить все эти кассеты?»

Ой-ёй. Это страшный вопрос. А если мы пропустили какие-то записи? Что, если кассеты можно оцифровать с более высоким качеством? Что, если на этикетках важная информация?

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

Я даже не подозревал, во что ввязываюсь.

Звучит не так уж и сложно


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

Вот как выглядит процесс оцифровки от начала до конца:



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



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

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

Шаг 1. Захват видео


Ладно, вернёмся в 2012 год. Маме очень хотелось выбросить кассеты, которые она хранила двадцать лет, поэтому при первой встрече она сразу вручила мне огромную картонную коробку. Так начался мой квест по оцифровке.

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

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

Спойлер: это оказалось действительно трудно.

Первая попытка захвата видео


У отца всё ещё хранился старый семейный видеомагнитофон, поэтому я попросил к следующему семейному ужину откопать его из подвала. Я купил дешёвый адаптер RCA-USB на Amazon и приступил к делу.


Устройство захвата видео TOTMC, первое из множества устройств A/V, которые я купил во время многолетнего квеста

Для обработки видео с устройства захвата USB я использовал программу VirtualDub, версия 2012 года немного устарела, но не критично.


Кадры в программе VirtualDub, как я в возрасте четырёх лет читаю книгу своему отцу

Напасть с искажением звука


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

Через десять минут он снова рассинхронизировался. Разве я мало сдвинул его в первый раз?

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


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

Представляете, как трудно отличить звук на 10 миллисекунд раньше или на 10 миллисекунд позже? Это действительно трудно! Судить сами.

На этом видео я играю со своим бедным, терпеливым котёнком, которого звали Black Magic. Звук немного не синхронизирован. Определите, он опережает картинку или идёт с опозданием?


Пример видеоклипа с рассинхроном звука и картинки

В этом месте Black Magic прыгает, фрагмент с замедлением в пять раз:


Рассинхрон звука и картинки, замедление в пять раз

Ответ: звук идёт с опозданием в несколько миллисекунд.

Может, потратить лишнюю сотню долларов вместо сотен часов личного времени?


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


Моя вторая попытка приобрести устройство для видеозахвата

Даже с новым устройством рассинхрон никуда не исчез.

Видеомагнитофон с приставкой «супер»


Может, проблема в видеомагнитофоне. На форумах по оцифровке говорили, что рассинхрона не будет на видеомагнитофоне с «корректором времени» (time-based corrector, TBC), эта функция есть на всех видеомагнитофонах Super VHS (S-VHS).

Ну конечно! Зачем я возился с дурацким обычным видеомагнитофоном, когда есть супер-VCR, который решает проблему?

Никто уже не производит видеомагнитофоны S-VHS, но они по-прежнему доступны на eBay. За 179 долларов я купил модель JVC SR-V10U, которая вроде хорошо подходит для оцифровки VHS:


Винтажный видеомагнитофон JVC SR-V10U, который я купил на eBay за 179 долларов

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

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

Утомительный поиск, устранение неисправностей и многолетняя борьба


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

Вот мне попался случайный пост на форуме от 2008 года, где говорится об установке какого-то странного китайского драйвера без подписи… Это ужасная идея, но я в отчаянии. Впрочем, он не помог.

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

Я неизменно сдавался, всё отключал и прятал оборудование в шкаф ещё на несколько месяцев.

Сдаёмся и отдаём кассеты профессионалам


Наступил 2018 год. Я перетаскал видеокассеты и тонны оборудования по четырём разных квартирам и собирался переехать из Нью-Йорка в Массачусетс. Я не мог найти силы снова их везти, потому что уже понял, что самостоятельно никогда не закончу этот проект.

Я спросил семью, можно ли отдать кассеты в фирму по оцифровке. К счастью, никто не возражал — всем хотелось снова увидеть записи.

Я: Но это значит, что какая-то компания получит доступ ко всем нашим домашним видео. Тебя это устраивает?
Сестра: Да мне по барабану. Тебя одного это беспокоит. Погоди, так ты с самого начала мог просто заплатить кому-то?
Я: Э-э-э...

Оцифровка всех 45-ти кассет стоит $750. Кажется дорого, но к тому моменту я бы заплатил сколько угодно, лишь бы больше не разбираться с этим оборудованием.

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

Вот видео со сравнением профессиональной оцифровки и моих доморощенных попыток:


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

Шаг 2. Редактирование


В домашних съёмках около 90% материала скучны, 8% интересны, а 2% потрясающие. После оцифровки у вас ещё много работы.

Редактирование в Adobe Premiere


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

Для редактирования я использовал Adobe Premiere Elements, которая стоит меньше $100 за пожизненную лицензию. Его важнейшая фича — масштабируемая временная шкала. Она позволяет быстро найти границы сцены, а затем увеличить масштаб, чтобы найти точный видеокадр, где начинается или заканчивается клип.


Важнейшая временная шкала с масштабированием в Adobe Premiere Elements

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

  1. Открыть сырой файл, который содержит 30-120 минут видео.
  2. Отметить границы отдельного клипа.
  3. Экспортировать клип.
  4. Подождать 2-15 минут, пока завершится экспорт.
  5. Повторять шаги 2-4, пока не закончится лента.

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

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

Автоматизация редактирования


После кучи времени, потраченного на ручную работу, я подумал, можно ли здесь как-то применить ИИ. Кажется, определение границ клипов — подходящая задача для машинного обучения. Я знал, что точность будет не идеальной, но пусть он выполнит хотя бы 80% работы, а я исправлю последние 20%.

Я экспериментировал с инструментом под названием pyscenedetect, который анализирует видеофайлы и выдаёт временные метки, где происходят изменения сцены:

 $ docker run     --volume "/videos:/opt"     handflucht/pyscenedetect     --input /opt/test.mp4     --output /opt     detect-content --threshold 80     list-scenes
[PySceneDetect] Output directory set:
  /opt
[PySceneDetect] Loaded 1 video, framerate: 29.97 FPS, resolution: 720 x 480
[PySceneDetect] Downscale factor set to 3, effective resolution: 240 x 160
[PySceneDetect] Scene list CSV file name format:
  $VIDEO_NAME-Scenes.csv
[PySceneDetect] Detecting scenes...
[PySceneDetect] Processed 55135 frames in 117.6 seconds (average 468.96 FPS).
[PySceneDetect] Detected 33 scenes, average shot length 55.7 seconds.
[PySceneDetect] Writing scene list to CSV file:
  /opt/test-Scenes.csv
[PySceneDetect] Scene List:
-----------------------------------------------------------------------
 | Scene # | Start Frame |  Start Time  |  End Frame  |   End Time   |
-----------------------------------------------------------------------
 |      1  |           0 | 00:00:00.000 |        1011 | 00:00:33.734 |
 |      2  |        1011 | 00:00:33.734 |        1292 | 00:00:43.110 |
 |      3  |        1292 | 00:00:43.110 |        1878 | 00:01:02.663 |
 |      4  |        1878 | 00:01:02.663 |        2027 | 00:01:07.634 |
 ...

Инструмент действительно показал точность около 80%, но проверка его работы заняла больше времени, чем он сэкономил. Тем не менее, pyscenedetect сделал одно из самых важных открытий для всего проекта: определение границ сцены и экспорт клипов — это отдельные задачи.

Я вспомнил, что я программист


До этого момента я считал «редактированием» всё, что делал в Adobe Premiere. Вырезание клипов из необработанных кадров казалось неразрывно связанным с поиском границ клипа, потому что именно так Premiere представлял эту задачу. Когда pyscenedetect распечатал таблицу метаданных, это заставило меня понять, что я могу отделить поиск сцен от экспорта видео. Это был прорыв.

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

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


Гигантская электронная таблица с метаданными о моих домашних видео

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


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

Успех автоматизированного решения


Имея электронные таблицы, я написал скрипт, который нарезал сырое видео на клипы на основе данных в CSV.

Вот запись как это выглядит в действии:



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

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

Часть 2


Оцифровка и редактирование видеоматериалов — только половина дела. Нам ещё нужно найти удобный вариант публикации в интернете, чтобы все родственники смотрели семейное видео в удобном формате со стримингом как на YouTube.

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

Продолжение,

Часть 2








Комментарии (74):

  1. advan20092
    /#22217224

    Звучит как-то сложно. Есть ощущение что автор просто не разобрался с премьером или выбрал неправильные инструменты для решения задачи. Лично я сейчас для любительского монтажа использую GoPro Quick. Это позволяет сократить время работы над типичным материалом с дней до десятков минут. Один фиг, никто никогда не будет смотреть часы домашнего видео. Короткие ролики на 2-3 минуты еще есть шансы что кто-то глянет.

    • schetilin
      /#22217950

      Ну вот запись свадьбы бить на ролики как то не комфильно :) А то будут вместо жениха и невесты смотреть на ужимки пьяных гостей (ну ведь прикольней же)
      p.s. Цифровал на чем было — TV-тюнер «Manli Home TV» (подключение тюльпанами) + Fly2000TV + комп из разряда celeron 1.3 с диском 40Гб. Вот это было приключение :)

    • chelovek-jpeg
      /#22219522

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

      • Gengenid
        /#22219562 / +1

        Зачем там мощный комп? Двадцать лет назад спокойно граббили на компы того времени.
        Проблема с рассинхроном звука была общеизвестна и достаточно легко обходилась.

        • PereslavlFoto
          /#22219582

          Как её обходить?

          • videoNik
            /#22219764

            Оцифровывать аппаратным устройством (обычно это dv видеокамера со сквозным каналом)

            • vicsoftware
              /#22223828

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

          • Gengenid
            /#22219848

            Я даже не помню, в чем там конкретно было дело, почему начиналась рассинхронизация.
            Последний раз я оцифровывал видео в 2002 году. Это был твтюнер eline, процессор atlon xp и жесткий диск на 30 ГБ. Но в те благословеннве времена простые люди не знали слова копирайтер и в диалапном интернете это находилось за полчаса.

          • Javian
            /#22221096

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

  2. sintech
    /#22217248

    Интересно, сколько просмотров от родственников наберут эти видео? ;)

    • YouHim
      /#22217712 / +2

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

      • Thoth777
        /#22218688 / +1

        Если фоточки доживут до следующего поколения, то наверняка к ним будет интерес — посмотреть на деда/бабушку/прадеда/прабабушку и других родственников.

      • kellas
        /#22218760 / +1

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

        пример до/после
        image

        • PereslavlFoto
          /#22219114

          Скажите пожалуйста, с каким размером изображения работает эта программа? 20 мегапикселей обработает ли?

        • chelovek-jpeg
          /#22219538

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

        • YouHim
          /#22219690

          Спасибо. Поиграюсь. Я раньше пытался ретушировать фото вручную, в Фотошопе. Потом плюнул, потому что времени уходило уйма, а через 5 лет результат уже не удовлетворяет. А с развитием технологий то что я раньше делал за день сегодня делается за 5 секунд нажатием одной кнопки. Решил просто сохранить оригиналы сканов. Может лет через 50 мои потомки по этим фоткам "оживят" людей в какой-то матрице.

  3. kilya123
    /#22217352

    У меня нет кассет, но редактирование видео хотя бы из путешествий, несомнено огромная проблема. Отсняты сотни гигабай и обработать все это очень трудно. Или почти не возможно.
    Главное правило, которое я для себя сделал это ролик должен быть не более 8 минут. Иначе никто смотреть не будет. Да и сам не будешь смотреть. Вот до 8 минут еще можно.
    Пожтому привозя видео из путешествий я делаю один ролик — один день.
    Куда их потом девать тот еще вопрос… Диски ломаются, облако дорого…

    • vladkorotnev
      /#22217454

      Куда их потом девать тот еще вопрос…

      Думается, винчестер на "холодном хранении" из современных технологий самое надёжное. (Стример — ещё дороже, флешки/ссд — на зарядку каждые два месяца, оптика сд/двд — помирает потихой и новая делается одноразовой, оптика бд — ещё не показала себя на масштабе десятилетий).


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

      • cepera_ang
        /#22218608

        оптика бд — ещё не показала себя на масштабе десятилетий

        M-Disk в помощь.

        • vinny496
          /#22220120

          Обычные-то BD фиг купишь, не то что м-диск (в оффлайне конечно, на eBay любой каприз за бешеные деньги)… Да и приводы распространены гораздо меньше, чем dvd — через какое-то время можно остаться с горой дисков, которые не в чем играть.

          • vladkorotnev
            /#22224884

            Честно говоря, у меня БДшники купленные на начале эпохи уже почти все перемёрли, что в комп, что отдельные. СД/ДВДшная техника пока живёт и новодел и старая, так что ей как-то доверия больше. Всё же плотности меньше, допуски ширше, главное не покупать совсем уж мусорные болванки.

    • advan20092
      /#22219422

      Еще раз упомяну GoPro Quick. Я просто закидываю видео с гоупрохи на планшет и собираю ролик буквально на коленке, где угодно. Скажем, получается что-то подобное в почти автоматическом режиме:
      www.youtube.com/watch?v=77R8Dfu0FmA

      У друзей были круглые глаза, когда я собрал ролик с поездки, пока ждали заказ в кафе.

      Оригиналы хранить даже смысла не вижу. Ну или по крайней мере удалять спустя полгода — год

      • ToSHiC
        /#22220830

        Сильную долю в аудио-треке оно само распознаёт как-то? Или надо как-то дорожку разметить, и оно потом будет помогать склейки расставлять по этой разметке?

        • advan20092
          /#22232100

          Да, распознает. По крайней мере там где-то полсотни трэков уже идут с приложением, их можно использовать при монтаже. Мне пока этого хватает) Разметить тоже можно — «подсветить» интересные места

    • Kvakosavrus
      /#22220220

      У меня для вас плохие новости — и до 8 минут никто смотреть не будет.


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

  4. Gengenid
    /#22217424 / +1

    Если автор не победил сам даже проблему рассинхронизации звука и видео и вообще, надеялся решить ее заменой видеомагнитофона (аналогового!), он же вообще в этом ничего не понимает! Зачем это читать?

    • victoriously
      /#22219772

      Так же как и автор не являюсь понимающим в теме, но интересно: а в чем у автора была проблема и как её решают?

      • Gengenid
        /#22219882

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

        • begin_end
          /#22220704

          Насколько я помню, была галочка наподобие «выставлять дробную частоту кадров для синхронизации с аудио». По умолчанию частота кадров в формирующемся видео задавалась равной 30Гц. А надо было незначительно меньше, причем каждый раз по-разному незначительно (зависело от длины видео). У меня это помогало.

    • Kvakosavrus
      /#22220228 / +3

      Меня особенно удивило, что вместо поиска причины проблемы (сходить поспрошать на реддите хотя бы) автор маниакально пытался экспериментировать вслепую. "Чего там думать, прыгать надо".

  5. vladkorotnev
    /#22217428

    Ох уж эти китайские видеозахватки в USB — прям как конфеты у Форрест Гампа, никогда не догадаешься, что внутри, даже если бренд японский. Настолько рандомные штуки, что поиск по ютубу "Как решить проблему с драйверами на Easycap 007" выдаёт видос, как кто-то заливает его бензином и поджигает.


    Совет начинающим оцифровщикам — берите Canopus или на крайняк Datavideo, в пределах СНГ ещё применим очень бюджетный вариант с очень хорошим качеством — Behold TV и их тюнеры на любой вкус и размер. С учётом, что в регионах России почти любая "оцифровочная контора" вам вернёт видео разрешения 240х240 и жёваную плёнку со словами «Ну а что вы хотели, это же с кассеты!», сделать всё дома будет проще, дешевле и надёжнее.

    • Gengenid
      /#22218814 / +1

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

  6. andreymal
    /#22217462

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


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


    Если не проводить деинтерлейсинг (благо H.264 поддерживает чересстрочность), то возникает другая прооблема. Исходный видеопоток, отдаваемый видеозахваткой, закодирован в YUV 4:2:2, который аппаратно поддерживается примерно никем, а если его перекодировать YUV 4:2:0, то из-за смешивания цветоразностных компонентов соседних полей цвета убиваются в хлам:


    Демонстрация проблемы

    • slavius
      /#22217628

      Все правильно — захват в 60 fps.
      Используя EasyCap и OBS (там есть настройка устранения чересстрочности, я ставил Смешивание или Смешивание 2х) можно получить вполне терпимый результат. Но нужно понимать — в VHS используется полукадровая запись — пишутся по очереди четные и нечетные строки каждого кадра, поэтому при резких движениях будет гребенка или размытие.
      Ну а потом в VSDC FreeVideoEditor пожно подрезать и сжать в H264.

      • vinny496
        /#22220132

        У меня вот на EasyCap (одной из кучи их нонейм версий) было качество лучше, чем на USB тюнере от Avermedia, дававшем чересстрочную ёлочку по-моему даже на статичной картинке, когда подавал сигнал dvd-плеера с заставкой.

    • Javian
      /#22218462

      Захват идет в 25/30 кадров/с (50 и 60 полуполей). Есть вариант превращения в 50/60 Гц, но способ требует дополнительных действий. Любой деинтерлейс — это потеря потеря оригинального изображения. Я предпочитал сохранять в формат, в котором интерлейс сохраняется в оригинале. Деинтерлейсом занимается плеер или устройство так как считает это правильным. Единственный нюанс — правильно выставить первое поле при кодировании.

      • ToSHiC
        /#22220806

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

        • Javian
          /#22221104

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

          • ToSHiC
            /#22227316

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

  7. zagayevskiy
    /#22217614

    Да мне по барабану. Тебя одного это беспокоит.

    Кажется, это было даже не про то, что кто-то увидит эти видосы, а про то, что это вообще делается:) Десятки часов, как мой брат грызет клавиатуру или играется с котом?.. На свалку.

    • slavius
      /#22217636

      А видео детского садика сына?;)

      • zagayevskiy
        /#22217680

        Туда же. Никто это смотреть всё равно не будет.

        • Alexufo
          /#22217980 / +2

          через 100 лет будут.

          • polearnik
            /#22218214

            Нет. посмотрите фотографии дедушек с бабушками. непонятные лица в непонятных местах. Для них эти фотографии еще имеют ценность. Для вас это просто рандомные давно мертвые люди.

            • Alexufo
              /#22218414 / +1

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

            • Javian
              /#22218476

              На самом деле это не ваша история, а всеобщая. Многие старинные фото — это чьи то семейные и любительские. Окно в прошлое и материал для историков.

            • PereslavlFoto
              /#22219074 / +2

              Эти фотографии бесполезны и безынтересны, когда вырваны из контекста.

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

              • LeToan
                /#22221164

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

                • Exchan-ge
                  /#22221496

                  то уже через 100 лет она будет ценным свидетельством материальной культуры: что носят, как носят, какие прически


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

                  Если же она осталась битами в облаке, то конечно, будет бесполезна и безынтересна


                  Только из опасения, что это фейк.

  8. daggert
    /#22217786

    Решил проблему оцифровки на работе покупкой Matrox RT.X2, аудиокартой ESI Juli@ и магнитофоном S-VHS с авито за 5000р. Максимум который можно выжать — выжал. Рассинхрона звука нет, видеопоток в максимальном качестве. Сжатием занимается Квадра М4000. Вот со сжатием больше всего проблем выдалось — любое сжатие на интерлейсном видео выдает так себе результат — либо слишком большой файл, либо шакалы.

  9. Alexufo
    /#22217974 / +1

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

  10. Buggy777
    /#22218138

    А кто во что кодирует видео с miniDV кассет? А то «как есть» хранить накладно.

    • Javian
      /#22218488

      MPEG2 наиболее близок к нему. Главная особенность DV — все кадры ключевые.

  11. da-nie
    /#22219032 / +2

    А я взял любимую видеокамеру MiniDV Canon с захватом с композита и весь VHS с видика прекрасно перевёл в DV-формат. Оцифровывает весьма качественно.

    • saboteur_kiev
      /#22220836

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

    • Javian
      /#22221120

      Проблема в том, что в Европу такие камеры почти не ввозились из-за дополнительного налога на «пишущие устройства» — т.е. аналога налога на болванки Михалкова. А через Европу много камер ввозилось в СНГ и поэтому камер со сквозным каналом на рынке было мало.

      • Exchan-ge
        /#22221514

        А через Европу много камер ввозилось в СНГ


        Первую камеру я купил в 1997, вторую — в 2007.
        Несмотря на десятилетнюю разницу — обе камеры попали к нам с Ближнего Востока (ОАЭ).

        • Javian
          /#22222980

          У меня обе камеры были без In — одна куплена в ЕС, вторая у местного поставщика, у которого вариантов с In в прайсе не было.

  12. vilgood
    /#22219302

    В начале тысячелетия использовали для захвата с VHS карту Pinnacle, рассинхрона не было. Сама карта еще поддерживала аппаратные эффекты. Они вроде живы до сих пор.
    Еще лет 10 назад решили так же записать эксклюзивное видео с детства, обычный USB Capture 007 (вроде), sony vegas, и тоже не было проблем, кроме нарезки — снимали тогда все, у кого есть камера, и все подряд, а хотелось сделать что-то без 4 минут съемки потолка.

    А кто то в курсе, какой хард/софт у коммерческих предложений?

    • videoNik
      /#22219816

      Сейчас по-моему все это ушло в историю Попросили тут отцифровать кассетку, пол дня матерился с актуальным Адобом, потом плюнул, достал старый ноутбук ( Пентиум 3, XP) и все замечательно перегнал. И с оптическим распознаванием смены сцен кстати.

  13. quwy
    /#22219760

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

  14. abbey
    /#22219920

    К меня такая же проблема — ящик VHS кассет, которые нужно оцифровать. Спасибо автору, что поднял эту тему.

  15. Exchan-ge
    /#22219922 / +1

    В 2008 году без каких либо проблем оцифровал все видео с обычных кассет через AverTV Hybrid MCE 316 Plus, и MiniDV с родной для них камеры HDR-HC7E.

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

    В 2020 году пришла мысль — вот на… зачем я выбросил все кассеты?
    «Маргадон, один пистолет надо было зарядить!» (с)

    (Часть кассет надо было оставить — так как сам процесс съемки и просмотра начал вызывать ностальгию :)

  16. vinny496
    /#22220142

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

  17. kvk-2019
    /#22220530

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

    Скрипт прилагается
    #! python3.5
    
    import bisect
    import os
    import re
    import subprocess
    import sys
    import threading
    import tkinter
    from tkinter import ttk
    import win32api
    import win32com.client
    import win32con
    import win32console
    import win32gui
    
    import mylib
    
    
    class Application(ttk.Frame):
        def __init__(self, master=None):
            global padx, pady
            super().__init__(master)
            master.title(os.path.split(sys.argv[0])[1])
            master.resizable(False, False)
            
            # Определим размер шрифта для расчета горизонтальных и вертикальных отступов
            ttk.Style().configure("TLabel", font=font)
            self.label = ttk.Label(self, text="0" * 2)
            self.label.pack()
            padx = self.label.winfo_reqwidth()
            pady = self.label.winfo_reqheight()
            self.label["text"] = self.label["text"][0]
            padx -= self.label.winfo_reqwidth()
            self.label.destroy()
            del self.label
            
            self.correction_value = tkinter.IntVar()
            self.correction_value.set(1100)
            self.correction_focused = None
            self.sign_factor = -1
            self.correction0_value = tkinter.IntVar()
            self.correction0_value.set(0)
            self.sign0_factor = -1
            self.correction0_focused = None
            self.saved_value = None
            self.grid()
            self.createWidgets()
        
        def update_application_window(self):
            if root.wm_state() == "withdrawn":
                x = (root.winfo_screenwidth() - root.winfo_reqwidth()) // 2
                y = (root.winfo_screenheight() - root.winfo_reqheight()) // 2
                root.wm_geometry("+{0:d}+{1:d}".format(x, y))
                root.deiconify()  # Делаем видимым основное окно
            
            for suffix in ("", "0"):
                correction = getattr(self, "correction{0}".format(suffix))
                correction_focused = "focus" in correction.state()
                if correction_focused and not getattr(self, "correction{0}_focused".format(suffix)):
                    correction.select_range(0, "end")
                setattr(self, "correction{0}_focused".format(suffix), correction_focused)
            
            state = "disabled" if self.correction_value.get() == self.correction0_value.get() else "normal"
            self.hour["state"] = self.minute["state"] = (state, )
            
            self.update_idletasks()
            self.update()
            self.after(100, self.update_application_window)
        
        def change_sign(self, widget):
            def factor():
                return "sign{0}_factor".format("0" if correction0 else "")
            correction0 = self.nametowidget(widget) in (self.correction0, self.sign0_button)
            setattr(self, factor(), -getattr(self, factor()))
            button = getattr(self, "sign{0}_button".format("0" if correction0 else ""))
            button["text"] = "-" if getattr(self, factor()) < 0 else "+"
        
        def key_return(self, event):
            if event.widget == self.run_button:
                self.run()
            else:
                event.widget.tk_focusNext().focus()
                next_widget = root.focus_get()
                if next_widget == self.sign0_button:
                    next_widget.tk_focusNext().focus()
                    next_widget = root.focus_get()
                if next_widget in (self.correction, self.correction0, self.hour, self.minute):
                    next_widget.select_range(0, "end")
        
        def validate_correction(self, widget, data, action):
            correction0 = self.nametowidget(widget) == self.correction0
            value = getattr(self, "correction{0}_value".format("0" if correction0 else ""))
            other_value = getattr(self, "correction{0}_value".format("" if correction0 else "0"))
            entry = getattr(self, "correction{0}".format("0" if correction0 else ""))
            valid = re.match(r'^\d+$', data) is not None
            if action == '0':
                self.saved_value = value.get()
            elif action == '1':
                if not valid:
                    try:
                        value.get()
                    except Exception:
                        value.set(self.saved_value)
                        entry.select_range(0, "end")
                    if data in "-+":
                        self.change_sign(widget)
                    elif data == " ":
                        other_value.set(value.get())
                        entry.select_range(0, "end")
            else:
                return False
            return valid
        
        def validate_time(self, widget, new_value, data, action):
            def process_widget(name, max_value):
                widget = getattr(self, name)
                if widget.get() == '':
                    widget.set(self.saved_value)
                    widget.select_range(0, "end")
                if data == "-":
                    widget.set(str(max(0, int(widget.get()) - 1)))
                elif data == "+":
                    widget.set(str(min(max_value, int(widget.get()) + 1)))
            
            if action == '0':
                self.saved_value = self.nametowidget(widget).get()
                return True
            elif action == '1':
                if widget == str(self.hour):
                    valid = re.match(r'^\d$', new_value) is not None
                    if not valid:
                        process_widget('hour', 9)
                elif widget == str(self.minute):
                    valid = re.match(r'^[0-5]?\d$', new_value) is not None
                    if not valid:
                        process_widget('minute', 59)
            else:
                return False
            return valid
        
        def run(self, event=None):
            config = """VirtualDub.audio.SetSource(1);
    VirtualDub.audio.SetMode(1);
    VirtualDub.audio.SetInterleave(1,500,1,0,{2});
    VirtualDub.audio.SetClipMode(1,1);
    VirtualDub.audio.SetConversion(0,0,0,0,1);
    VirtualDub.audio.SetVolume();
    VirtualDub.audio.SetCompressionWithHint(8192,48000,2,0,32000,1024,"AC3ACM");
    VirtualDub.audio.EnableFilterGraph({0});
    VirtualDub.video.SetInputFormat(0);
    VirtualDub.video.SetOutputFormat(7);
    VirtualDub.video.SetMode(0);
    VirtualDub.video.SetSmartRendering(0);
    VirtualDub.video.SetPreserveEmptyFrames(0);
    VirtualDub.video.SetFrameRate2(0,0,1);
    VirtualDub.video.SetIVTC(0, 0, 0, 0);
    VirtualDub.video.SetCompression();
    VirtualDub.video.filters.Clear();
    VirtualDub.audio.filters.Clear();
    VirtualDub.audio.filters.Add("input");
    VirtualDub.audio.filters.Add("time stretch");
    VirtualDub.audio.filters.Connect(0, 0, 1, 0);
    VirtualDub.audio.filters.instance[1].SetDouble(0, {1:.8});
    VirtualDub.audio.filters.Add("output");
    VirtualDub.audio.filters.Connect(1, 0, 2, 0);
    """
            try:
                correction = self.sign_factor * int(self.correction.get())
            except ValueError:
                threading.Thread(target=mylib.MessageBox, args=('Не задана коррекция!',
                    win32con.MB_ICONEXCLAMATION, 5)).start()
                return
            try:
                correction0 = self.sign0_factor * int(self.correction0.get())
            except ValueError:
                threading.Thread(target=mylib.MessageBox, args=('Не задана коррекция нуля!',
                    win32con.MB_ICONEXCLAMATION, 5)).start()
                return
            try:
                time_span = (int(self.hour.get()) * 60 + int(self.minute.get())) * 60
            except ValueError:
                time_span = 0
            if not time_span:
                threading.Thread(target=mylib.MessageBox, args=('Не задано время!',
                    win32con.MB_ICONEXCLAMATION, 5)).start()
                return
            if not os.path.exists(PROGRAM):
                threading.Thread(target=mylib.MessageBox, args=('Не обнаружен "{0}"!'.format(PROGRAM),
                    win32con.MB_ICONEXCLAMATION, 5)).start()
                return
            correction -= correction0
            if not correction:
                config = re.sub(r'^.*\.audio\.filters\.(?!Clear).*$', '', config, flags=re.MULTILINE).rstrip()
            factor = 1.0 + correction / 1000 / time_span
            with open(CONFIG_NAME, "w") as config_file:
                config_file.write(config.format(1 if correction else 0, factor, correction0))
            subprocess.Popen('"' + PROGRAM + '" /s "{0}"'.format(CONFIG_NAME))
            self.quit()
        
        def createWidgets(self):
            self.config(padding=(padx, int(pady/4)))
        
            style = ttk.Style()
            style.configure("TLabel", font=font)
            style.configure("TButton", font=font)
            style.configure("C.TButton", font=font, foreground="red")
            style.configure("TCombobox", font=font)
            style.configure("TRadiobutton", font=font)
            
            root.bind('<Key-Return>', self.key_return)
            root.bind('<Control-Key-Return>', self.run)
            
            row = 0
            self.header = ttk.Label(self, text="Задай коррекцию и время")
            self.header.grid(row=row, column=0, columnspan=4)
            row += 1
            self.correction_label = ttk.Label(self, text="Коррекция(ms)*:")
            self.correction_label.grid(row=row, column=0, sticky="e")
            self.clear_button = ttk.Button(self, text="C", width=1, style="C.TButton")
            self.clear_button["command"] = lambda:self.correction_value.set(0)
            self.clear_button.grid(row=row, column=1)
            self.sign_button = ttk.Button(self, text="-", width=1)
            self.sign_button["command"] = (self.register(self.change_sign), self.sign_button)
            self.sign_button.grid(row=row, column=2)
            self.correction = ttk.Entry(self, width=5, textvariable=self.correction_value, validate="key",
                validatecommand=(self.register(self.validate_correction), '%W', '%S', '%d'))
            self.correction.grid(row=row, column=3)
            self.correction.focus()
            row += 1
            self.correction0_label = ttk.Label(self, text="Коррекция нуля(ms)*:")
            self.correction0_label.grid(row=row, column=0, columnspan=2, sticky="e")
            self.sign0_button = ttk.Button(self, text="-", width=1)
            self.sign0_button["command"] = (self.register(self.change_sign), self.sign0_button)
            self.sign0_button.grid(row=row, column=2)
            self.correction0 = ttk.Entry(self, width=5, textvariable=self.correction0_value, validate="key",
                validatecommand=(self.register(self.validate_correction), '%W', '%S', '%d'))
            self.correction0.grid(row=row, column=3)
            row += 1
            self.time_label = ttk.Label(self, text="Время(h:mm):")
            self.time_label.grid(row=row, column=0, sticky="e")
            self.hour = ttk.Combobox(self, width=1, validate="key",
                validatecommand=(self.register(self.validate_time), '%W', '%P', '%S', '%d'))
            self.hour["values"] = list(map(lambda x:"{0}".format(x), range(10)))
            self.hour.current(0)
            self.hour.grid(row=row, column=1)
            self.sc1 = ttk.Label(self, text=":")
            self.sc1.grid(row=row, column=2)
            self.minute = ttk.Combobox(self, width=2, validate="key",
                validatecommand=(self.register(self.validate_time), '%W', '%P', '%S', '%d'))
            self.minute["values"] = list(map(lambda x:"{0:>02}".format(x*5), range(12)))
            self.minute.current(10)
            self.minute.grid(row=row, column=3)
            row += 1
            self.space_label = ttk.Label(self, text="*Space-копировать")
            self.space_label.grid(row=row, column=0, sticky="w")
            self.run_button = ttk.Button(self, text="Запуск", width=8, command=self.run)
            self.run_button.grid(row=row, column=1, columnspan=3, pady=int(pady/4))
            
            self.after(100, self.update_application_window)
    
    
    if __name__ == "__main__":
        FOLDER = os.path.split(sys.argv[0])[0]
        PROGRAM = os.path.join(FOLDER, "VirtualDub.exe")
        CONFIG_NAME = os.path.join(FOLDER, "config.vcf")
        MONIKER = r"winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"
        SCRIPT_TITLE = os.path.split(sys.argv[0])[1]
        keep_output = False
        COMSPEC = os.getenv("comspec")
        if COMSPEC:  # Проверим на запуск в режиме сохраниеия вывода после завершения
            parent_process_moniker = (MONIKER + ":Win32_Process.Handle=" + str(os.getppid()))
            try:
                for i in range(2):
                    parent_process = win32com.client.GetObject(parent_process_moniker)
                    keep_output += re.match('("?)' + COMSPEC.replace("\\", "\\\\").replace(".", "\\.") + '\\1\s+/[ck]\s+',
                        parent_process.CommandLine, re.IGNORECASE) is not None
                    parent_process_moniker = (MONIKER + ":Win32_Process.Handle=" + str(parent_process.ParentProcessId))
            except Exception:
                pass
            finally:
                parent_process = None
        
        main_hwnd = win32console.GetConsoleWindow()
        if main_hwnd:
            if win32api.GetConsoleTitle() != SCRIPT_TITLE:
                win32api.SetConsoleTitle(SCRIPT_TITLE)
            if not keep_output:
                win32gui.ShowWindow(main_hwnd, win32con.SW_HIDE)
        
        root = tkinter.Tk()
        root.withdraw()  # Скроем основное окно до прорисовки точно в центре экрана (делаем видимым методом update_application_window)
        
        # Важно! Шрифт моноширинный
        font_sizes = [(0, 8), (480, 10), (864, 12)]
        font = ("Lucida Console", font_sizes[bisect.bisect(font_sizes, 
            (root.winfo_screenheight(), float("inf"))) - 1][1], "normal")
        
        app = Application(master=root)
        app.mainloop()
        
        try:
            root.destroy()
        except tkinter.TclError:
            pass

  18. Daddy_Cool
    /#22220748 / +1

    Н-да… автор прогулялся по всем граблям причем как-то умудрился найти их все. И правда квест — собери все грабли и получи потрать 750 USD.
    Дважды оцифровывал видео. Один раз использовал плату Miro, второй раз — какую-то внешнюю коробочку кажется от Sony. Оба раза — никаких проблем.

  19. ToSHiC
    /#22220820

    Желающим оцифровывать я бы предложил такой пайплайн:


    1. Зарипать видео с кассеты, выход сохранить в interlaced режиме в ProRES или DNxHD, накрайняк h264 с высоким битрейтом (не меньше пары десятков мегабит в секунду), если при этом исходик не в YUV420 — то писать в YUV444. При этом следить за цветовых пространством (PAL/NTSC), и за частотой кадров (50i для PAL, 59.94i для NTSC) — всё должно быть как в исходнике. Звук — aac 256 кбит/с. Исходники не удалять, по крайней мере сразу.
    2. Намонтировать всё это в нормальные ролики, сделать деинтерлейс (в 25/29.97 кадров в секунду соответственно), цветокоррекцию, перевести в цветовое пространство BT.709. Всё сразу можно в Davinci Resolve, например.
    3. Выгнать в h264/h265 с битрейтом не менее 5/4 мбит/с, с двухпроходным кодированием. Звук aac с битрейтом не менее 196 кбит/с. Результат уже куда угодно заливать.

  20. saboteur_kiev
    /#22220840

    Я бы сделал иначе.

    Я бы СРАЗУ пошел к профессионалам и выяснил бы у них, как они проводят оцифровку.

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

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

    В общем в статье первая часть — грустная. Часть третья — скорее бесполезная. Облачный стриминг для личного видео? Расшарить видео сейчас не слишком сложно.

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

    p.s. правда я бы нарезал через csv/excel + bash+ffmpeg

  21. ger_kon
    /#22221914

    Вот как надо вгрызаться в код. Этот ребёнок — пример программистам.