2014-03-19

Как склеить видео разных форматов, разного разрешения, аспекта, с разными прочими характеристиками

Работая с записями игровых стримов, столкнулся с необходимостью склеивать небольшие их кусочки в одно видео. Обычно с этим не возникает проблем, но в некоторых случаях приходится иметь дело с кусками, которые были записаны в разном разрешении, или разной частотой кадров, не говоря о разных кодеках. Обрабатывать видео в avidemux, в котором я это обычно делал, конечно было можно, но хотелось максимально автоматического решения. Оказалось что собрать такое самому не очень сложно, более того решение основано на совершенно бесплатных и мультиплатформенных утилитах: avconv (форк ffmpeg) и MP4Box.

Как же склеить разное видео? Алгоритм обработки следующий: привести исходные видеофрагменты к общему формату и характеристикам, затем собрать воедино. В качестве формата видеопотока был выбран H264, для аудио - mp3. Стоит учесть, что для успешного склеивания фрагментов, требуется не только общий формат, но и характеристики, такие как частота кадров или частота аудиопотока. Также надо иметь в виду, что в процессе видео подвергаются перекодированию, что не может не сказаться на качестве. Впрочем, для того видео, с которым нужно работать мне, это не критично, и вообще avconv весьма хорошо справляется с кодированием.

Итак, как же это юзать. Предположим мы имеем 2 видео: S1.flv и S2.flv. Переконвертим их командой:

avconv -i S1.flv -map 0 -vf "scale=iw*sar*min(1280/(iw*sar)\,720/ih):ih*min(1280/(iw*sar)\,720/ih),pad=1280:720:(ow-iw)/2:(oh-ih)/2" -c:a libmp3lame -ar 48000 -c:v libx264 -r 30 -bf 2 -g 30 -profile:v high -preset veryfast -level 42 O1.mp4

avconv -i S2.flv -map 0 -vf "scale=iw*sar*min(1280/(iw*sar)\,720/ih):ih*min(1280/(iw*sar)\,720/ih),pad=1280:720:(ow-iw)/2:(oh-ih)/2" -c:a libmp3lame -ar 48000 -c:v libx264 -r 30 -bf 2 -g 30 -profile:v high -preset veryfast -level 42 O2.mp4


Выглядит устрашающе, но на выходе мы получим 2 ролика с одинаковыми характеристиками и, даже, растянутых (или ужатых) до одинакового разрешения - 1280x720 - с добавленными черными полосами там, где это нужно. Последнее нужно для склеивания видео в один ролик, поэтому с черными полосами так или иначе придется смириться, а за процесс "скейлинга" отвечает замечательный параметр -vfзначение для которого вывел некто Kevin Locke, оно является практически ключевым местом всех преобразований и я очень рад что кто-то проделал эту работу за меня =). Параметры, с которыми можно попробовать поиграться:

-ar 48000 - частота аудиопотока
-r 30 - частота кадров видео
-g30 - частота ключевых кадров
-preset veryfast - скорость кодирования, для улучшения качества можно выбрать veryslow или один из прочих пресетов H264.

После конвертации мы получим два файла: O1.mp4 и O2.mp4, контейнер выбран не случайно и заточен под утилиту MP4Box. Синтаксис объединения таков:

MP4Box -add O1.mp4  -cat O2.mp4 out.mp4

Стоит отметить, что параметр -add указывается для первого файла, для всех последующих справедлив параметр -cat.
На выходе получаем out.mp4, содержащий в себе все видеофрагменты в порядке их указания.

Разумеется данное решение не совсем автоматично без скрипта, а так как хотелось еще и платформонезависимого решения, то пришлось навая скрипт на питоне. Да, питон не входит в дитрибутив винды, но и avconv с MP4Box (входит в пакет GPAC) поставить придется (http://win32.libav.org/win64/ и http://gpac.wp.mines-telecom.fr/downloads/) зато после этого выходит действительно "однокнопочное" решение - стоит в консоли зайти в директорию с набором flv-файлов (формат можно указать в начале скрипта) и выполнить:
python путь_к_скрипту
дальше можно откинуться на спинку кресла =)

Ссылка на актуальную версию скрипта: http://pastebin.com/hCfFSF5a

Ссылка на архив со всем необходимым: https://drive.google.com/file/d/0B3kqpI0yeB0iVG1hRmpBdEN5emM/edit?usp=sharing

Видео про то как все это поставить:



Upd: сделал бинарник, все-в-одном-экзешнике: avmerge_x64.7z , avmerge_x86.7z

2014-03-08

Домашний VoIP как замена сотовой и стационарной связи

Кросспост из http://blog.qiwichupa.net/2014/03/blog-post.html

"У меня зазвонил телефон.
- Кто говорит?
- Слон.
- Откуда?
- От верблюда."

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

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

Впрочем, не мобильной связью единой... Уже давно, и, по мере развития интернет-сетей, все сильнее и сильнее набирает обороты VoIP-связь - связь через интернет. Всем известный Skype предоставляет совершенно бесплатно не только голосовую, но и видеосвязь, чего не может предложить ни один из сотовых операторов. Более того, МГТС некоторое время назад начала также переходить на VoIP, заменяя ту самую стационарную телефонию, а вернее сам принцип работы линии - старая аналоговая "лапша" будет заменена интернет-каналом, к которому будут подключаться да хоть старые телефоны, которые у многих еще сохранились. Плюсы такого решения очевидны: интернет сейчас есть у каждого, а у кого нет - тех МГТС подключит и помимо телефонии, возможно, получит и интернет-клиента себе в копилку. Да и клиентам неплохо - с их точки зрения ничего не поменяется, разве что в квартире появится дополнительная коробочка, которая сделает возможным подключение обычного аналогового телефона к Интернету. Минус всей схемы, пожалуй, один - старая аналоговая телефония не зависит ни от работоспособности интернет-сети, ни от подачи электричества конечному пользователю. Выключили в доме свет - старая телефония осталась работать, а вот оборудование VoIP потухнет. Насколько это критично - каждый решает для себя.

Я решил, что для меня это не критично. А еще я решил, что мне не так удобно платить и за поддержание аналоговой, пока еще, линии МГТС, и сотовому оператору. Я подумал, что было бы здорово сменить их обоих на что-то одно, с понятными и некусачими тарифами, возможностью недорого позвонить по межгороду, с возможностью иметь московский номер для входящих звонков, а если бы такая связь была еще и мобильной - ну, было бы совсем супер. Решение у меня было, в общем-то, под рукой - я уже давно являлся абонентом VoIP-провайдера http://zadarma.com, который базово предоставляет свой внутренний номер с бесплатными звонками внутри сети и определенной тарифной сеткой для звонков наружу. Теперь же мне захотелось купить у них прямой московский номер, чтобы звонить могли и мне, а заодно пустить в ход доставшийся мне волею случая стационарный телефонный аппарат. Мобильная связь? Да, конечно, у меня есть планшетофон на андроиде, а у "задарма" есть свой клиент под эту платформу. Вопрос интернета решается интернет-симкой от мегафона.

Воу-воу-воу, скажете вы мне: какой смысл заморачиваться с VoIP, если все равно нужна симка? Ну, ответ на этот вопрос довольно сложен. На данный момент могу сказать только что, во-первых, симка нужна только там где нет вайфая, поэтому для кого-то она может оказаться и не такой необходимой, во-вторых, это хороший способ отвязаться от конкретного мобильного оператора - от него нужен только интернет и сменить его можно всегда и без проблем, в-третьих, мой переход на VoIP пока в стадии тестирования и оценки удобства и финансовой оправданности, поэтому даже для себя я пока окончательно не оценил все выгоды данного мероприятия =)

Ну так вот, теперь поподробнее о том как все это выглядит. Имея аккаунт "задарма" (и да, это не какая-то реклама, просто несколько лет назад я на них наткнулся, ну и больше альтернатив особо и не искал) я могу совершать звонки хоть с их сайта, не имея никакого клиента вообще. На свой планшетофон я установил их клиента, который, впрочем, может быть заменен любым другим, который поддерживает протокол SIP - он используется в подавляющем большинстве VoIP-решений. Самым непростым, затратным и бесполезным оказалась установка стационарного телефона =) Скажу прямо - было просто интересно, поэтому за пару деревянных тысяч я приобрел "коробочку" от Linksys, которая позволяет подключить себя к домашней сети с доступом в Интернет, а к себе - любой обыкновенный телефон, который умеет тоновый набор (увы, дисковый телефон не годится =(( ).



Как можно видеть - "попа" коробочки имеет 4 разъема. Два из них - те что побольше - служат для подключения самой коробочки к домашней сети и подключения, например, компьютера к коробочке. То есть, если на вашем домашнем роутере забиты все разъемы, то данный VoIP-адаптер можно смело воткнуть последовательно между компьютером и роутером. Разъемы же поменьше служат для подключения двух телефонов. К слову, каждый разъем настраивается отдельно и телефоны, в конечном счете, могут работать да хоть с разными VoIP-провайдерами.

Сама же коробочка довольно мала, с нижней стороны имеет "ушки" для крепления к стене, у меня же - просто является подставкой для телефона.



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

Повторюсь, на данный момент я лично не до конца и не полностью оценил всю выгоду перехода от МГТС и сотовой связи к VoIP-телефонии, к тому же сам я звоню довольно редко и мой опыт для многих не будет показательным, но все же я решил им поделиться  и показать, что, в принципе, переход на VoIP не так страшен. К тому же, в связи с переходом МГТС на тот же самый VoIP, становится резонным вопрос - а не имеет ли смысла отказаться от их услуг и купить номер у другого провайдера? Лично я убедился в одном: лично для меня такой смысл вполне есть.