Запись видео в Unreal Speccy emulator (psb)
-------------------------------------

Запись видео реализована с помощью утилиты ffmpeg. Таким образом, всё, что
умеет ffmpeg - все доступно для использования с Unreal Speccy.


Содержание:

* Основные возможности
* Основы работы с ffmpeg
* Настройка эмулятора
* Параметры для записи: набор png/bmp
* Параметры для записи: h264/mp3
* Параметры для записи: DVD
* Онлайн-трансляция видео в интернет
* Наложение звука микрофона
* Где скачать ffmpeg?
* Полезные ссылки по ffmpeg


Основные возможности
--------------------

* Запись видео в файл. Поддерживаются различные кодеки (xvid/h264/mpeg2/bmp/png/
  wav/mp3/... - все они встроены в ffmpeg, дополнительно устанавливать не
  нужно), контейнеры (avi/flv/mpg/mkv);
* Применение различных фильтров перед сжатием (например, это позволяет на ходу
  записывать видео в формате, пригодном для использования при записи DVD -
  25 fps interlaced);
* Осуществление онлайн вещания в интернете (с возможностью наложения звука
  микрофона поверх звука эмулятора);
* Автоматическая поддержка многоядерных процессоров для кодирования видео.


Основы работы с ffmpeg
----------------------

Изначально ffmpeg предназначен для конвертации/сжатия видео. Работа с ffmpeg
ведется из командной строки. При этом, задаются источники и приемники данных,
а так же опции, определяющие форматы данных/характеристики сжатия. Пример:

ffmpeg -i input.avi output.flv

В этом случае видео из input.avi переконвертируется в output.flv (тип контейнера
определяется автоматически по расширениям файлов, но не всегда, иногда нужно его
указывать явно, например: -f flv).

В общем виде параметры командной строки имеют такой формат:

ffmpeg [input1 options] -i input1 [input2 options] -i input2 ... [output1 options] output1 [output2 options] output2 ...

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

Описание всех опций ffmpeg можно найти в архиве с программой или на официальном
сайте (ссылка внизу).


Настройка эмулятора
-------------------

Для работы функции сохранения видео, в ini-файле эмулятора необходимо настроить
следующие параметры:

ffmpeg.exec         путь и имя утилиты ffmpeg, например, ffmpeg.exe или
                    C:\ffmpeg\ffmpeg.exe, до 256 байт;
ffmpeg.newconsole   1 - открывать для ffmpeg новую консоль;
                    0 - использовать консоль эмулятора для вывода ffmpeg
                    (полезно для отладки параметров);
ffmpeg.parm         параметры выходного файла, до 1024 байт;
ffmpeg.vout         имя выходного файла (можно использовать символ "#" для
                    подстановки порядкового номера видео, например, video#.avi),
                    до 512 байт.

Для записи видео Unreal Speccy запускает ffmpeg в следующем формате:

"%exec%" -i %pipename% %parm% -y %vout%

%exec%      - параметр ffmpeg.exec из ini-файла;
%pipename%  - имя канала (pipe), через который передается несжатое видео -
              недоступно для изменения;
%parm%      - параметр ffmpeg.parm из ini-файла;
%vout%      - параметр ffmpeg.vout из ini-файла.

Запись видео начинается при первом нажатии CTRL+F8 (если это не изменено в
ini-файле) и останавливается при втором. На слабых компьютерах (даже 2х-ядерных)
возможно торможение эмулятора при записи - это нормально, на качество видео это
не влияет.


Параметры для записи: набор png/bmp
-----------------------------------

Для записи картинок достаточно указать расширение .png/.bmp у выходного файла.

ffmpeg.parm=-r 25
ffmpeg.vout=video#_%06d.png

Здесь "-r 25" задает частоту кадров выходного видео - 25 к/сек, т.е., если
эмулятор будет давать 50 к/сек, то каждый второй кадр будет отброшен. Если не
задавать никаких параметров, будет сохраняться 50 к/сек.

"video#_%06d.png" развернется в "video0_000000.png", "video0_000001.png",
"video0_000002.png" и т.д. для первого видео, "video1_000000.png",
"video1_000001.png", "video1_000002.png" и т.д. для второго видео.


Параметры для записи: h264/mp3
------------------------------

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

Для сжатия звука в mp3 используется кодек libmp3lame.

Вот основные параметры (для использования в ffmpeg.parm):

-c:a copy               копирование аудио потока без изменения формата
                        (в нашем случае - без сжатия, wav)

-c:a libmp3lame         сжатие звука в mp3
  -b:a 320k             с битрейтом 320

-af volume=3.0          увеличение громкости звука в 3 раза (полезно,
                        т.к. в эмуляторе звук тихий)

-c:v copy               копирование видео потока без изменения формата
                        (в нашем случае - без сжатия, rgb24)

-c:v libx264            сжатие видео в h264,
  -pix_fmt yuvj420p     формат пикселей; без этой опции не работает :)
  -preset:v veryfast    тип сжатия (влияет на скорость и степень сжатия)
  -profile:v baseline   тип профиля (см. описание h264)
  -crf 10               качество сжатия 0-51 (0 - без потерь, 51 - худшее)

-ss 00:00:00.500        пропустить первые 500 мс видео (не записывать кадры
                        с надписью "start saving video")

-an                     исключить аудио

-vn                     исключить видео

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

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

ffmpeg.parm=-c:a copy -af volume=3.0  -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -crf 0 -ss 00:00:00.500
ffmpeg.vout=video#.avi

Или сжатый звук и более сжатое видео:

ffmpeg.parm=-c:a libmp3lame -b:a 320k -af volume=3.0  -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 10 -ss 00:00:00.500
ffmpeg.vout=video#.avi

Для записи видео в h264 настоятельно рекомендуется ставить режим отображения
double size (2x) в эмуляторе (иначе будут потери в цвете).

При записи видео с частотой 25 кадров/сек (например, YouTube принудительно
пережимает в такую частоту), каждый второй кадр будет выпадать. Для эффектов
типа gigascreen это критично. Для исправления ситуации при записи таких видео
настоятельно рекомендуется в настройках эмулятора включать режим Noflic
(вкладка Video). Да и даже на видео в 50 кадров/сек Noflic выглядит убедительнее
на gigascreen-эффектах.


Параметры для записи: DVD
-------------------------

Видео для PAL-DVD должно содержать 25 кадров/сек, каждый кадр должен состоять из
полей (полукадров). Задача - упаковывать пару соседних экранов эмулятора в один
interlaced-кадр. Для этого в ffmpeg есть фильтр tinterlace. Также в ffmpeg есть
опция -target pal-dvd, которая сразу устанавливает необходимые кодеки, размер
картинки (720x576 пикселей) для формата DVD.

Для соблюдения оригинальных пропорций рекомендуется делать обрезание/дополнение
исходного кадра до разрешения 720x576. Это делается фильтрами crop/pad
соответственно.

Вот пример опций для записи DVD (исходная картинка в эмуляторе должна быть
больше 720x576 пикселей - double size (2x) + full border, иначе будет ошибка):

ffmpeg.parm=-af volume=3.000000 -bf 2 -vf "crop=720:576,tinterlace=mode=interlacex2" -aspect 4:3 -target pal-dvd -r 25 -b:v 2800k -ss 00:00:00.500
ffmpeg.vout=video#.mpg

Еще пример (исходная картинка меньше 720x576 пикселей - дополняется до этого
разрешения черной рамкой):

ffmpeg.parm=-af volume=3.000000 -bf 2 -vf "pad=720:576:(ow-iw)/2:(oh-ih)/2,tinterlace=mode=interlacex2" -aspect 4:3 -target pal-dvd -r 25 -b:v 2800k -ss 00:00:00.500
ffmpeg.vout=video#.mpg

При использовании этих параметров кодирования, в эмуляторе необходимо поставить
режим отображения double size (2x) для корректной работы фильтра interlacex2.

Опция -b:v 2800k задает битрейт видео (подбирается на глаз).


Онлайн-трансляция видео в интернет
----------------------------------

Есть несколько публичных серверов, позволяющих организовывать онлайн трансляции
в интернет, например: justin.tv, twitch.tv, own3d.tv. Эти сервера могут
принимать видео поток по протоколу rtmp и показывать его через веб-сайт.
Кроме того, все переданное видео записывается на канале и его можно посмотреть
позже.

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

После того, как настройки готовы, запускаем эмулятор, запускаем запись видео -
трансляция началась. Зрители могут видеть экран эмулятора на вашей страничке.

Пример для justin.tv (идентификатор подставить свой):

ffmpeg.parm=-af volume=3.000000 -r 10 -ss 00:00:00.500 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_74829844_mfrdpoeg034tn03gn03ring3f0rngc

Пример для own3d.tv (идентификатор подставить свой):

ffmpeg.parm=-af volume=3.000000 -r 25 -ss 00:00:00.500 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 10 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.eu.own3d.tv/live/b8493921_949585_kjhb5632l3l1

Пример для twitch.tv (идентификатор подставить свой):

ffmpeg.parm=-af volume=3.000000 -r 30 -ss 00:00:00.500 -c:v libx264 -pix_fmt yuvj420p -preset:v veryfast -profile:v baseline -crf 35 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_sub_5b8ed4fae83fe83e920227337beab7e73b7a3ba3


Наложение звука микрофона (может работать некорректно)
------------------------------------------------------

ffmpeg умеет захватывать звук со звуковой карты и картинку с экрана/камер.
Для вывода всех имеющихся в системе устройств необходимо выполнить команду:

ffmpeg -list_devices true -f dshow -i dummy

Команда выведет примерно следующее:

ffmpeg version N-48785-g2ea3f37 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jan 12 2013 20:40:36 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-
  avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --
  enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
  -libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-
  amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-
  libschroedinger --enable-libspeex --enable-libtheora --enable-libtwolame --
  enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx 
  --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib --enable-
  filter=frei0r
  libavutil      52. 14.100 / 52. 14.100
  libavcodec     54. 86.100 / 54. 86.100
  libavformat    54. 59.107 / 54. 59.107
  libavdevice    54.  3.102 / 54.  3.102
  libavfilter     3. 32.100 /  3. 32.100
  libswscale      2.  1.103 /  2.  1.103
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[dshow @ 02444020] DirectShow video devices
[dshow @ 02444020] Could not enumerate video devices.
[dshow @ 02444020] DirectShow audio devices
[dshow @ 02444020]  "Realtek AC97 Audio"
dummy: Immediate exit requested

Здесь мы видим, что доступно звуковое устройство "Realtek AC97 Audio". Для 
микширования звука микрофона и звука из эмулятора, нужно добавить источник звука

    -f dshow -i audio="Realtek AC97 Audio"

и использовать опцию 

    -filter_complex amix=inputs=2:duration=shortest

для микширования двух звуковых потоков в один (в микшере записи Windows должен
быть выбран микрофон).

ffmpeg.parm=-f dshow -i audio="Realtek AC97 Audio" -r 10 -ss 00:00:00.500 -f flv -tune zerolatency
ffmpeg.vout=rtmp://live.justin.tv/app/live_74829844_mfrdpoeg034tn03gn03ring3f0rngc



Где скачать ffmpeg?
-------------------

* Официальный сайт: http://ffmpeg.org/
* Сборка под windows: http://ffmpeg.zeranoe.com/builds/


Полезные ссылки по ffmpeg
-------------------------

* http://ffmpeg.org/documentation.html - документация
* http://ffmpeg.org/trac/ffmpeg/wiki - куча примеров использования,
  руководства по сжатиям, трансляции и т.п.

