Пишем видео с эмулятора. Как?

Записать видео — не проблема.

Проблема — это сделать хорошо и правильно годно.

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

Для чего нужна запись видео?

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

Как сделать видео для себя / для друзей / для YouTube / для всех?

Итак, что нам понадобится: эмулятор Unreal, FFmpeg, VirtualDUB.

Что такое эмулятор знают все, FFmpeg — это кроссплатформенная open-source библиотека для обработки видео- и аудиофайлов. VirtualDub — свободная утилита для захвата, монтажа и редактирования видеопотока для платформы Windows c поддержкой пакетной обработки и различных фильтров.

Будем пользоваться эмулятором Unreal с блек джеком и танцовщицами.

Ветка эмулятора на DLcorp
Ветка эмулятора на TSlabs с поддержкой ts-conf
Забираем FFmpeg
Забираем VirtualDub

Что теперь?

Теперь всё просто! Закидываем либу FFmpeg в директорию с эмулятором, запускаем Unreal, ctrl+F8 — горячая клавиша записи. После нажатия начинается запись видео в соответствии с настройками в unreal.ini

Повторным нажатием Ctrl+F8 останавливаем запись. Всё! Наше видео находится там, где мы сказали ему быть в настройках unreal.ini

Теперь резонный вопрос: "А зачем тогда VirtualDub? И что там с YouTube?".

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

Что нам необходимо?

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

Скажу немного о моих настройках. Я использую Unreal с поддержкой ts-conf, там выставляю двойной размер TS full 360x288 на выходе получаю 720x540px.

Unreal

В unreal.ini использую вот эти настройки для FFmpeg:

;# wav, x264:lossless, fast
ffmpeg.parm=-c:a copy -c:v libx264 -pix_fmt yuvj420p -preset:v ultrafast -qp 0 -ss 00:00:00.500
ffmpeg.vout=video#.avi


А сейчас немного пошаманим в VirtualDub.

В Меню Video->Filters нажимаем кнопочку "Add..." (добавить фильтр), находим там нужный нам resize, жмём "Ok".

VirtualDub resize filter

Теперь непосредственно в фильтре выставляем необходимый нам размер.

VirtualDub resize config

Нам нужно попасть (и желательно ровно) в размер HD video — 1080 пикселов по вертикали. Вспомнив, что на выходе эмулятор нам выплюнул видео с размером кадра 720x540 пикселов, нетрудно подсчитать, что нам нужно всего лишь увеличить каждый пиксел в два раза без сглаживания. Ставим 200% увеличения относительно исходного, Filter mode обязательно ставим Nearest neighbor. Обрезку кадра не делаем.

Стоит еще упомянуть, что с переходом YouTube на HTML5 и полным отказом от Flash проигрывателя видео мы получили долгожданную фичу! Теперь мы можем на YouTube загружать и смотреть видео с фреймрейтом 50 и 60 кадров в секунду. Так что fps нашего видео мы не меняем и обрабатываем все кадры.

VirtualDub

Осталось еще немного! Терпение, скоро мы сделаем приличное видео.

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

Ах да! Вот еще момент. Unreal на выходе выдувает видео с не очень громким аудио и это мы тоже полечим прямо в VirtulDub. В меню Audio->Volume добавляем усиления. У меня стоит +10dB (если честно я еще даже не смотрел уровень после усиления, стыдно мне, но и лениво =) Однажды подобрал на слух, покатило, сохранил настройки и забыл.

Настройки кодека видео Video->Compression:

VirtualDub video codec

Я использую кодек Xvid MPEG-4 с параметрами по умолчанию Xvid HD 1080 и обратите внимание, тип квантизации выставлен MPEG! H263 даёт мыльную картинку, а нам важно получить пикселы с чёткими краями.

Аудио кодек выбираете на вкус. YouTube рекомендует AC-3 ACM, но без особых проблем можно ставить и MP3. Экспериментируйте и выбирайте лучшее для себя.
Собствено, вот и все хитрости, осталось сохранить наш новый файл: File->Save as AVI… и наслаждаться нашим видео на большом мониторе или огромном телевизоре или в YouTube.

А как быть, спросите вы, если какая-то программа не поддерживает выплёвывание видео из себя? Что делать? А вот тут делайте уже как хотите =) Есть множество программ, которые позволяют захватывать экран или часть экрана монитора. Здесь самое главное — выбрать то, что позволит писать с наименьшим выпадыванием кадров и с наибольшим fps. Я рекомендую Action! от Mirillis. Она платная, но цена вполне подъемная, всего 30$. Она позволяет писать видео с высоким фреймрейтом и довольно шустрая, с богатыми настройками.

Именно так я записывал дему Trigona Kalanda by kabardcomp, прямо с окна эмулятора ЮТ-88 в программе Action!..

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

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

Если еще остались вопросы или я что-то упустил (совершенно неумышленно, естественно), с радостью отвечу в комментариях.

upd 01-02-2015:


nyuk и psb развили мысль до годного результата буквально в одно касание клавиатуры.

в unreal.ini ставим такие настройки для ffmpeg:

;#aac:256 x264 slow
ffmpeg.parm=-c:a libvo_aacenc -b:a 256k -af volume=3.000000 -c:v libx264 -pix_fmt yuv420p -vf scale=iw*2:ih*2 -preset slow -sws_flags neighbor -ss 00:00:00.500
ffmpeg.vout=video_#.avi


Теперь можно и не пользовать VirtualDub вовсе или в нём просто резать начало и конец видео.

Релизьте демосики, пишите видосики!

41 комментарий

avatar
и благодаря непростым рецептам TDSI выглядела черти как…
avatar
Теперь есть возможность сделать это самому!
avatar
Кроме сложностей есть тулзы попроще — oCam и Spectculator например…
avatar
Море их. Еще совсем бесплатная и опенсорсная CamStudio.
avatar
Очень трудно, нереально для потока ааа…
  • AAA
  • -1
avatar
А забавно, я делаю многое не так. Мне нравиться жать h264 — там как раз есть режим сжатия без потерь, — раз утюб пережимает, хотя бы одно лишнее пережатие получается избежать.
avatar
h264 сильно тормознее жмёт у меня, чем Xvid да и размер файла конечного поменьше получается. Но настройки — это личное дело каждого, тут можно делать всё что душа пожелает =)

Я написал, что не пользую h264 по ряду причин. Для себя нашёл золотую середину между временем кодирования и качеством картинки.
avatar
Отлично! в закладки!
  • VBI
  • 0
avatar
Не плохо, но ни одного скриншота в статье про видео?
avatar
LessNick ,

— это видно?
avatar
Аааа, звиняюсь :) какие-то глюки были. Появились картиники (:
avatar
Релизьте демосики, пишите видосики!
так и хочется добавить: щлите бабосики :)
avatar
OBS, немного рытья в настройках, локальная запись. Problem solved.
avatar
мне кажется, все эти ресайзы, громкости и кодеки можно указать прямо в ini. ffmpeg сам по себе тот еще комбайн…
  • psb
  • 0
avatar
Было бы клева. Тогда VirtualDub нужен только для обрезания лишнего. Кто то парень, который добавит в ini блок #nodeus settings?
avatar
попробуйте:
ffmpeg.parm=-c:a ac3 -b:a 320k -af volume=3.000000 -vf scale=iw*2:ih*2 -sws_flags neighbor -c:v libxvid -mpeg_quant 1 -q:v 2 -ss 00:00:00.500
avatar
Я попробовал. Начал тормозить эмуль при записи видео на Core2Duo (с настройками «искаробки» не было такого). Зато видос получился большой и красивый. Подождем резюме nodeus .
avatar
ниче страшного, у меня на коре и7 тормозит:)
avatar
То есть он покадрово выводит и тут же жмёт? А так как ждёт когда жмёт — то тормозит между рендером кадров?

В смысле на качестве видео это не сказывается? (пропусков кадров нет?
avatar
не сказывается, видео получается норм. при этом, я посмотрел, проц у меня не занят даже на 50%… хз почему именно тормозит.
avatar
Да, у меня видео получается тоже норм с этими настройками, иногда даже не тормозит эмулятор, но жмёт очень плохо. Если видео залить на YouTube и у себя удалить — не проблема. Хранить как бы не очень…
avatar
ну там миллионы настроек, наверняка есть на порядок оптимальнее. я хз зачем именно xvid, но с libx264 конфигом, с добавлением лишь -vf scale=iw*2:ih*2 -sws_flags neighbor, ни запись не тормозит, и видео получается чоткое и битрейт в разы ниже.
avatar
Можно-то можно, но комп не вытащит все расчёты по кадру 50 раз в секунду для кодирования со сжатием. Там еще эмуль отжирает процессор. Собственно, VirtualDub используется именно для этого следующим этапом после захвата.

И даже следующее пережатие самим YouTube не страшно т.к. качество увеличенных пикселов останется =) YouTube пережмёт в любом случае, сервис ведь подготавливает видео разных размеров. В идеале было бы самому готовить набор из нескольких видео и заливать, но оно пользователю нужно? Где-то в требованиях сказано, что изначальный ролик должен быть годного качества, а уж youtube подготовит для всех разрешений видео сам с приемлемым качеством только по ему известным критериям качества.
avatar
Почему вы люди все усложняете? у меня F8 жмакаешь и видео со звуком пишеться. потом я его ложу.
  • AAA
  • -1
avatar
Попробуй вот с такой строчкой в unreal.ini чтобы почувствовать разницу на баааальшом телевизоре.

Я таки остановился именно на этом варианте, спасибо psb и nyuk

;#aac:256 x264 slow
ffmpeg.parm=-c:a libvo_aacenc -b:a 256k -af volume=3.000000 -c:v libx264 -pix_fmt yuv420p -vf scale=iw*2:ih*2 -preset slow -sws_flags neighbor -ss 00:00:00.500
ffmpeg.vout=video_#.avi
avatar
Нашёл в статье ссылку на видео с демой на апогее (ют-88).
Сравнил вот с этим видео www.youtube.com/watch?v=NruMPejeAZI.
Вариант 1: фуллскрин, каждое видео на макс. битрейте ютуба. Пиксели видно, но границы между ними немного смазаны у обоих видео.
Вариант 2: оба видео в очке ютуба, битрейт максимальный. В видео апогея пиксели смазаны, в видео инвитро — чёткие, как будто в эмуляторе.
Браузер firefox 35.0.1 в линухе.
Видео с инвитрой записано с дефолтными настройками в унрыле 0.38.1 без обработки вообще (записал-залил).
Вопрос — в чём тогда заключается метод автора статьи, если разницы либо не видно, либо получается даже немного хуже?
  • lvd
  • 0
avatar



Давайте найдём отличия.
avatar
А сравнивать запись с окна эмулятора Апогея и из кишочков Unreal не совсем правильно правда?
avatar
Отвечаю сразу на оба комментария.
1. В статье и вправду никаких скриншотов, никаких примеров видео, кроме демы с апогея, что же тебя удивляет?
2. В предыдущем комменте 2 картинки, на одной вообще только менюшка выбора битрейта/разрешения, без самого видео. Что сравнивать — количество пунктов в меню?
3. Вот скриншот видео: i.steppic.com/8/d/2/d/8d2ddf64b92d00c4d6daf7fac273efa6/0.png
Предлагаю тебе сделать так же, ну или хотя бы выложить ссылки на свои видео, и добавить в статью, как правильно, а как неправильно. Меня вполне устраивает то, что по ссылке.
avatar
Можно сравнить видео по ссылкам на pouet для FOReVER 2015 invitation by Gemba Boys.

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

Цель топика, если кто еще не понял, дать возможность всем и каждому готовить видео для виртуальных пати, чтобы немного разгрузить оргов при подготовке.
avatar
Так вот, ты же сам говоришь, что по твоему методу видео получается лучше. Вот тут самое место и приложить скриншоты — вот мол, что будет, если просто нажать ctrl-f8 в унреале, а вот так — гораздо лучше, если ещё обработать, а вот так — если накрутить параметры ффмпега сразу в унреале.
Видео для патей (не виртуальных, дихальт, мм) для некоторых работ я делал именно таким методом — ctrl-f8, и ничего, орги плохого слова не сказали.

И да, раз всплыл вопрос сравнения видео в разных браузерах и осях, значит это тоже влияет на качество видео, в каком оно доходит с ютуба до пользователя, и тоже должно как-то отражаться. Например, вот так видео лучше делается для просмотра под виндой, а вот так — под планшет с разрешением 2560х1600, и т.д. Не делать же ВСЕГДА видео в 4к, чтобы пиксели были почётче?
avatar
Всё, что написано выше, помогает сделать видео для YouTube, чтобы смотреть его на больших экранах с хорошим качеством при 50fps.

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

Если у lvd есть потребность рассказать о том, как смотреть ролики на YouTube в Firefox под линухом при 50fps, то все бы были рады почитать об этом в новом топике на hype.
avatar
Какая версия эмулятора должна быть и какая версия ffmpeg?
ffmpeg-3.2.4-win32-static.zip + us0.38.3.rar + настройки из upd 01-02-2015: прекращена работа ffmpeg.exe (error: no connection from ffmpeg)
avatar
Тоже столкнулся перед Мультиматографом с этой проблемой. Толи кодеков нехватает, то ли что, хотя писал уже.
Сделал запись с настройками чтоб не запакованные кадры писало, а потом уже в virtualdub ресайзил и громкость повышал.
ffmpeg.parm=-c:a copy -c:v copy -r 50 -ss 00:00:00.500
ffmpeg.vout=video#.avi
avatar
Как ни странно, версия эмулятора tslabs с теми же настройками не выдает ошибки ffmpeg, видеозапись работает.
avatar
попробуйте настройку ffmpeg.newconsole=0 и покажте вывод, что появляется в консоли эмуля.
или пользуйтесь ламповым тс-эмулятором:)
avatar
;#aac:256 x264 slow
ffmpeg.parm=-c:a libvo_aacenc -b:a 256k -af volume=3.000000 -c:v libx264 -pix_fmt yuv420p -vf scale=iw*2:ih*2 -preset slow -sws_flags neighbor -ss 00:00:00.500
ffmpeg.vout=video_#.avi


С такими настройками ffmpeg выдаёт ошибку и не хочет записывать.
Пишет

error: ffmpeg aborted connetcion
  • sq
  • 0
avatar
Статья устарела примерно как яйцы мамонта, но в данном случае могу посоветовать поиграться с аудио и видео кодеками(-с:a и -с:v) c aac у меня бывали проблемы, кстати.
avatar
Сейчас есть какой-то более модный и актуальный способ? Если да, значит надо новую статью! :)
avatar
Ок. Выкину из статьи 90% и попробую сделать обновленную версию :)
avatar
Лучше новую статью сделай, а эта пусть останется для потомков!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.