Петр Семилетов

Запись видео из эмулятора Спектрума Fuse


Один из лучших эмуляторов Спектрума, Fuse умеет записывать видео в своем формате, FMF - и умеет его же воспроизводить. В отличие от проигрывателей видео.

Для записи такого видео надо воспользоваться пунктом меню File - Movie - Record, а для остановки записи File - Movie - Stop. Там же, в File - Movie, есть функции приостановки и продолжения записи (Pause, Continue).

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

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

Для перевода в формат "обычного" видео надо скачать и установить набор утилит fuse-utils. Для компиляции и установки нужно то же, что для Fuse - libspectrum и сопутствующие библиотеки.

Среди утилит есть fmfconv, она-то и способна переводить видео из формата FMF в AVI, а также вытаскивать звук в WAV-файл.

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


fmfconv параметры входнойфайл.fmf выходнойфайл.avi


Если выходной файл существует, по умолчанию он не перезаписывается. Для перезаписи используем параметр -y либо --overwrite.

Ключиком srate можно задать частоту оцифровки звука, например:


fmfconv --srate 48000 filein.fmf fileout.avi


Для вывода только звука, причем в WAV:


fmfconv --sound-only --wav filein.fmf fileout.wav


Но самое необходимое это конечно же получение обычного AVI-файла. В простейшем случае мы указываем параметр --avi:


fmfconv --avi filein.fmf fileout.avi


Видео при этом сохраняется как MJPEG последовательность (так раньше снимали видео цифровые фотоаппараты), а звук без сжатия в S16_LE PCM (16 бит, Little Endian). Ключ --avi по большому счету сопоставим с --avi-mjpeg, разве что в случае обработки не файла, но потока будет сохраняться несжатое видео вместо MJPEG.

Итоговое видео воспроизводится в популярных проигрывателях вроде VLC или Mplayer, однако я столкнулся с невозможностью его монтажа в Kdenlive. Kdenlive загружает такое видео в проект, однако не распознает частоту кадров.

Последнюю можно в fmfconv переопределить при помощи параметра --frate либо -f, например -f 29.97. Однако Kdenlive это не помогает. Видео помещается на дорожку, однако не рендерится правильно. Получается некий серый фон и более ничего. А при монтаже воспроизводится правильно!

Выход из положения - вывод в несжатый AVI-файл параметром --avi-uncompr:


fmfconv --avi-uncompr filein.fmf fileout.avi


При этом получается один, а чаще несколько (fmfconv нарезает видео по 4 гигабайта) файлов несжатого видео с кадрами в формате BGR24 DIB. Такое видео тоже понятно проигрывателям, и - что главное - монтажной программе Kdenlive. Качество картинки даже на глаз лучше, чем MJPEG, где весьма ощутимы артефакты сжатия. Единственный минус это огромные размеры файлов.

Есть еще полезный параметр --out-cut, он записывает в выходной файл только указанный временной диапазон, например:


fmfconv --avi-uncompr --out-cut 1:11-2:22 filein.fmf fileout.avi


Существует также возможно вывода несжатого видео, без звука, в формат yuv4mpeg2. За сие отвечает параметр --yuv. Пример:


fmfconv --yuv filein.fmf fileout.y4m


Название yuv4mpeg2 вводит в заблуждение, что это MPEG2, на деле это сокращение от YUV for MPEG2. Видео в таких файлах сохранено в цветовом пространстве YCbCr и по определению содержит несжатые кадры, однако y4m-файлы получаются файлы в разы меньше, чем созданные при помощи --avi-uncompr. Почему так, я не вникал.

yuv4mpeg2 видео импортируется в Kdenlive (напомню, что за ввод-вывод в нем отвечает FFMPEG), однако вычисляется какая-то невиданная длительность фильма. Чтобы использовать "yuv4mpeg2" видео от Fuse в Kdenlive, надо конвертировать их в какой-нибудь другой формат, например в MPEG-4:


mencoder filein.y4m -o fileout.avi -ovc lavc -oac lavc


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

Итого - либо пользуемся здоровенными несжатыми авишками, но сразу со звуком, либо выводим видео в yuv4mpeg2, звук в WAV, конвертируем видео в какой-нибудь другой формат (конечно же качество видео пострадает, если формат с потерями), и помещаем в Kdenlive.

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