Как наложить субтитры на видео

ОС: Opensuse 11.2
Софт: mplayer, mencoder (freeware)

Mplayer сам по себе достаточно умный, чтобы добавлять субтитры из внешнего файла к готовому видео. К примеру, есть у меня файл Madagascar – Escape 2 Africa.avi, и к нему идет текстовый файл с субтитрами – Madagascar – Escape 2 Africa.srt с расписанием, на какой секунде какой текст показывать. При запуске mplayer автоматом цепляет файл с субтитрами и все прекрасно работает.

Но сложности начинаются, если файл с субтитрами переименовать – тогда они не будут видны. Чтобы избежать таких неприятностей, всегда можно перекодировать фильм с добавлением субтитров с помощью mencoder:

mencoder -oac copy -ovc lavc -lavcopts keyint=25:vcodec=mpeg4:vbitrate=679:vpass=1 -sub “Madagascar – Escape 2 Africa.srt” -o “Madagascar – Escape 2 Africa.with.subtitles.avi” “Madagascar – Escape 2 Africa.avi”

Кстати, mencoder еще и умеет вырезать кусочки видео из общего фильма. Чтобы вырезать 74 секунды видео с 1000-й секунды воспроизведения, надо просто указать эти параметры:

mencoder -oac copy -ovc lavc -lavcopts keyint=25:vcodec=mpeg4:vbitrate=679:vpass=1 -ss 970 -endpos 74 -sub “Madagascar – Escape 2 Africa.srt” -o “Madagascar – Escape 2 Africa.en.with.subtitles.avi” “Madagascar – Escape 2 Africa.avi”

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

Похожие посты:
Как пережать 3gp в avi, Как скачать видео с сайта, Как сделать видеоклип из фотографий

Update: Youtube заблокировал показ этого ролика. Интересное кино….

Как сделать видеоклип из фотографий

Дано: несколько фоток и подходящая музыка.
Требуется: сделать из них простенький клип.
Софт: mencoder (freeware)

Чтобы нормально все выглядело, нам надо знать продолжительность музыкального трека в секундах и количество фотографий. В моем случае трек был на 132 секунды, и у меня было 14 фоток. Получается, чтобы равномерно их показать, смена кадров должна происходить один раз в 9,43 секунды (132 / 14). Соответственно, FPS (Frames Per Second) для ролика составит (14 / 132) = 0,106

Ну и получить клип можно одной командой:

mencoder mf://*.jpg -mf fps=0.106 -ovc lavc -lavcopts vcodec=mpeg4 -audiofile theme.mp3 -oac mp3lame -lameopts abr:br=160 -srate 44100 -ofps 25 -o output.avi

Мне, как и любому программисту, лениво руками считать количество файлов и продолжительность музыкального трека. Поэтому я cваял простенький скрипт на Perl, который и делает за меня эту грязную работу:

#!/usr/bin/perl -w
use MP3::Info;
my $mask = "*.jpg";
my @pics = glob($mask);
my @sounds = glob("*.mp3");
my $a = get_mp3info($sounds[0]);
my $seconds = $a->{'SECS'};
my $pics_number = $#pics + 1;
my $FPS = $pics_number / $seconds;
my $cmd = "mencoder mf://".$mask." -mf fps=".$FPS." -ovc lavc -lavcopts vcodec=mpeg4 -audiofile ".$sounds[0]." -oac mp3lame -lameopts abr:br=160 -srate 44100 -ofps 25 -o output.avi";
my $res = system($cmd);

И вот что у меня получилось:

Копирайты: фотки мои, музыка The Dead Rocks, One Million Dollar Theme.

Еще по теме: Как пережать 3gp в avi, Как скачать видео с сайта, Мои путешествия – избранное

Настройка Триколор Интернет в OpenSuSe 11.2

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

Используемое оборудование: DVB Карта Prof Revolution 7301 S2 и ADSL модем D-Link 500T в режиме роутера. Операционная система OpenSuSe 11.2.

1: Регистрация оборудования в личном кабинете. Вносим MAC-адрес DVB-карты, получаем IP адрес, логин и пароль.

Каждую цифру полученного IP адреса переводим в шестнадцатеричный вид, и получаем новый MAC-адрес устройства вида МАС 00:02:XX:XX:XX:XX (подробности здесь). Он будет нужен для создания VPN соединения.

2. Создаем VPN соединение любым способом. Кто-то делает через Yast (настройка DSL), кто-то делает через kvpnc; я же сделал через pptp-command, создал новый CHAP secret, создал новый pptp-туннель и не трогал маршрутизацию. Добился того, чтобы при запуске pptp-command start создавалось соединение (через устройство ppp0), и убивалось по команде pptp-command stop.

3. Настраиваем прием данных со спутника, используя IP сервера 81.177.31.194, и логин с паролем из личного кабинета. Создаем файл /etc/tricolor.conf с одной единственной строчкой:

Trikolor:11766:h:0:27500:1000:1000:0

В /etc/resolv.conf указываем любые публичные DNS-сервера:

nameserver 8.8.4.4 
nameserver 4.2.2.2
nameserver 8.8.8.8

Выкладываю свой скрипт, который у меня лежит в /etc/init.d/tricolor.sh :

#!/bin/bash                                                                  

PATH=/usr/sbin:/usr/bin:/sbin:/bin
NAME=`basename $0`

# https://cabinet.stv.su/index.php?m=info
IP="192.168.100.1" #Сюда прописываем ваш IP-адрес, (адрес левый, роли не играет)
MAC="00:02:XX:XX:XX:XX" #сюда пишем MAC-адрес сконвертированный из IP адреса данного триколором
PID="0x3e8" #здесь должен быть ваш PID (можно и в dec) 0x3e8h=1000d

# https://cabinet.stv.su/index.php?m=conf

CHANNELS_CONF="/etc/tricolor.conf"

# http://forum.stv.su/viewtopic.php?t=1173
case "$1" in
start)
echo "starting $NAME..."
#Теперь отключим rp_filter, фильтрующий пакеты которые не могут уйти через тот же интерфейс что и пришли
/sbin/sysctl -w net.ipv4.conf.all.rp_filter="0"
/sbin/sysctl -w net.ipv4.conf.default.rp_filter="0"
#сие так замудренно всвязи с проблемамаи на ядре 2.6.24 и выше
/usr/sbin/pptp-command start
dvbnet -p $PID
szap -l 10750 -c $CHANNELS_CONF -n 1 > /dev/null &
ifconfig dvb0_0 hw ether $MAC
ifconfig dvb0_0 $IP
route add -net 0.0.0.0 dev ppp0
;;
stop)
/usr/sbin/pptp-command stop
echo "stoping $NAME..."
ifconfig dvb0_0 down
dvbnet -d 0
killall szap #ну раз замудрили при старте, мудрим и при остановке - иначе никак =(
/etc/init.d/network restart
;;
restart)
$0 stop
$0 start
;;
*)
echo "usage: $NAME start|stop|restart"
exit 3
;;
esac

exit 0

Для карт S2 есть принципиальный момент, MAC адрес должен назначаться до назначения IP, иначе скрипт будет ругаться на невозможность назначить айпишник устройству. Последняя строчка в секции start заворачивает весь исходящий трафик на VPN.

Далее от рута даем команду /etc/init.d/tricolor.sh start и все заработало.

Как видно из скрипта, при поднятии VPN запросы на сервера DNS и будут отправляться через ADSL-модем (через устройство ppp0), весь входящий трафик пойдет через спутниковую DVB карту. Проверить это можно, если запустить ifconfig:

# ifconfig
dvb0_0 Link encap:Ethernet HWaddr 00:02:XX:XX:XX:XX
inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING NOARP MULTICAST MTU:4096 Metric:1
RX packets:455 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:168998 (165.0 Kb) TX bytes:0 (0.0 b)
Base address:0x3e8

eth1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:106749 errors:0 dropped:0 overruns:0 frame:0
TX packets:127707 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40869070 (38.9 Mb) TX bytes:25464396 (24.2 Mb)
Interrupt:19 Base address:0x8000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:50 errors:0 dropped:0 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3340 (3.2 Kb) TX bytes:3340 (3.2 Kb)

ppp0 Link encap:Point-to-Point Protocol
inet addr: XX.XX.XX.XX P-t-P:10.1.1.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:996 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:485 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:80 (80.0 b) TX bytes:58760 (57.3 Kb)

Таблица маршрутизации у меня выглядит так:

# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
81.177.31.194 192.168.1.1 255.255.255.255 UGH 0 0 0 eth1
10.1.1.1 * 255.255.255.255 UH 0 0 0 ppp0
192.168.100.0 * 255.255.255.0 U 0 0 0 dvb0_0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
link-local * 255.255.0.0 U 0 0 0 eth1
loopback * 255.0.0.0 U 0 0 0 lo
default * 0.0.0.0 U 0 0 0 ppp0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth1

Все замечательно работает. Правда, скорость скачивания через tricolor internet раз в 10 меньше скорости скачивания через ADSL модем, но зато у меня появился дополнительный айпишник из триколоровской сети.

Интересный баг mysql

Официальный логотип Mysql

По долгу службы пришлось мне отправиться в длительную поездку. Компьютер с собой не возьмешь, и поэтому приспичило меня залить дамп базы Mysql на ноутбук с OpenSuSe 11.0. Dump отказался заливаться, ругнулся вот так:

ERROR 1221 (HY000) at line 3: Incorrect usage of UNION and INTO

Код хранимой функции был чистый, давным-давно вылизанный и ошибок в нем не было. Выяснилось, что на старых версиях mysql может не работать вот такая конструкция:

select 1 into @`avar` from (select 1 union select 1) `a`;

хотя сам запрос:

select 1 from (select 1 union select 1) `a`;

синтаксически правильный и имеет право на жизнь. Баг в конце концов поправили (подробности здесь), но в стандартных репозиториях OpenSuSe 11.0 (OSS, Non-OSS, Debug и Updates) версия mysql осталась старая, с багом.

Проблема лечится подключением репозитория MySQL и обновлением до последней версии сервера mysql.

Аудио и видео звонки в Jabber

Pidgin Logo

Собственно, предыстория здесь. Очень долгое время я искал джаббер-клиента под Linux, который бы позволял совершать голосовые и видеозвонки другим людям. Кроме древнего и уже почти мертвого проекта Jabbin, альтернатив не было. Потом появлялись полухакерские сборки Kopete с поддержкой jingle, которые были очень капризными. Но все это было не то.

Теперь же есть минимум 2 Open Source jabber клиента, которые могут совершать аудио и видеозвонки – это Empathy и Pidgin (начиная с версии 2.6.1)

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

Чтобы все заработало, надо установить следующие пакеты: gst-plugins-good, gst-plugins-bad, gst-ffmpeg (в OpenSuSe 11.2 они называются gstreamer-0_10-plugins-good, gstreamer-0_10-plugins-bad, gstreamer-0_10-ffmpeg). После установки перезапускаем джаббер-клиенты, вклюаем в pidgin плагин для аудио и видеозвонков и вуаля – все работает. Причем работать будет как в Empathy, так и в Pidgin

На вкус и цвет товарищей нет, но Pidgin IMHO лучше, чем Empathy – больше возможностей, плагинов и прочих фич

Как скачать видео с сайта

Есть как минимум 4 разных способа сграбить видео с дружественных сайтов. Итак:

1. Воспользоваться сторонним сервисом, вроде этого: keepvid.com.

Плюсы: удобно; дружественный сайт не увидит ваш IP адрес.

Минусы: Зависимость от стороннего сервиса; не все сайты с видео поддерживаются

2. Использовать плагин в браузере, для Firefox это могут быть Download Helper, Flash Video Resources Downloader или подобная приблуда.

Плюсы: легко настраивается; несложно скачивать

Минусы: Firefox от плагинов жрет больше памяти; работает с небольшим числом сайтов

3. Записать все, что происходит на экране, в видеофайл. Для линуксоидов это совсем не сложно, куча бесплатных програм позволяет это делать. Например, RecordMyDesktop.

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

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

И на закуску, мой любимый способ:
4. Вытащить видео из кэша браузера Работает оно примерно так. Открываем интересующее нас видео:

Ждем, когда видео полностью загрузится, и лезем в /tmp , т.к. там Firefox хранит свой кэш. Вот что я нашел у себя:

ed@notebook:/tmp> ls -l Flash*
-rw------- 1 ed users 14196852 Ноя 7 14:35 FlashZlG62O

Копируем его куда-нибудь, и переименовываем в “The Unforgiven cover with solo – Metallica.flv” . Все, ролик можно смотреть оффлайн.

Update: В комментариях к этому сообщению я узнал о более элегантном способе получить видеофайл из кэша. После того, как видео полностью загрузилось, надо в адресную строку Firefox вбить:
about:cache
Далее смотрим дисковый кэш (Disk cache device => List Cache Entries, и ищем файл по размеру (он совпадает байт в байт с временным файлом). И за пару кликов его легко можно сохранить в любое удобное место. По трудозатратам такой способ чуть сложнее копирования временного файла, но зато он работает под Windows и позволяет сохранять файл даже в том случае, когда копирование не получается (например, если винда ругается на то, что файл открыт).

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

Минусы: Надо напрягаться, копировать и переименовывать файл. Иначе рано или поздно кэш очистится и видео придется качать заново. Но этот недостаток не такой уж и страшный.

Update 2: Если в /tmp не находятся файлы по команде

$ ls -l Flash*

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

Про eFax

Логотип eFax

Однажды мне понадобилось принять факс из далекого буржуинства. Разумеется, факса у меня дома в офисе не оказалось. Знакомых напрягать тоже не захотел, вот и воспользовался сервисом eFax. Они дают выделенный номер факса в городе по выбору (в US, UK и еще в куче стран), и на этот номер можно принять факс. Потом факс отправляется на указанный при регистрации email. И что самое интересное, у них есть free 30 days trial, типа если не нравится – откажитесь в любой момент, денег с вас не возьмем.

При регистрации они спрашивают персональные данные и номер банковской карты. Карта нужна реально существующая, поскольку они ее проверяют. У меня напрмер они заблокировали 1 рубль на карте для проверки, и только после этого разрешили воспользоваться их сервисом.

И вот свершилось, заветный факс пришел по почте. А вот чем читать его – хз, файл был с расширением .efx. Как выяснилось, читать такие факсы может только их софтина (efax messenger), которая работает только под виндой и под Mac OS. Так что пришлось скачивать этот троян эту программу, иначе факс просто не прочитать и не сконвернтнуть в TIF. Кстати, на сайте можно в настройках сразу указать, что факсы должны быть в формате TIF, тогда читать их можно будет чем угодно; но я об этом узнал уже после того, как получил файл в efx.

Но самое интересное началось, когда я решил отказаться от услуг этого сервиса. Нигде в админке такой возможности не предусмотрено, для подачи запроса на закрытие аккаунта надо связаться напрямую с саппортом. Погуглив, нашел ссылку, где можно начать процесс отказа от услуг efax. Дальше начался футбол, ибо американский саппорт якобы не смог посмотреть мой акк, он направил меня в саппорт в UK. А в UK саппорт общается только по телефону, да еще и с shared cost, где звонок значительно дороже звонка на обычный телефон. К примеру, 2.5 минуты общения с саппортом мне обошлись примерно в пол евро; это при том, что звонок в Лондон через Skype на обычный городской телефон обойдется в 2 евроцента за минуту со всеми налогами.

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

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

OpenSUSE, Skype и отправка SMS

Skype Logo

На сегодняшний день последней версией скайпа для OpenSUSE является версия 2.0.0.72. Возможность отправлять СМСки в скайпе появилась только с версии 2.5, но как оказалось, отправить SMS можно и из OpenSUSE, и из Ubuntu с использованием Skype API on Linux.

Для того, чтобы заработала отправка SMS, надо установить сам Skype, а также Python wrapper Skype4Py, и утилиту Skysentials.

После запуска видим Skysentials видим вполне интуитивно понятную тулзу для отправки SMS:

Отправка СМС из скапа под линуксом

Отправка СМС не бесплатная, но сопоставима по стоимости с отправкой с мобильника. А с учетом того, что сейчас скайп активно рассылает ваучеры на пополнение баланса, можно и попробовать.

Я испытал это чудо буржуйской техники, и выяснил две вещи.

  • Отправка СМС отлично работает под OpenSUSE, только вот Skype4Py пришлось чуть-чуть напильником доработать (в первой строчке заменить python2.5 на python2.6)
  • СМС в Черногорию отправить нельзя.
  • Балансировка нагрузки с помощью nginx

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


    upstream backend {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
    }

    server {
    listen 80;
    server_name somedomain.tld;
    location ~* \.()$ {
    root /home/username/data/www/somedomain.tld; }
    location / {
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 16 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_connect_timeout 30s;
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location ~* /.(jpg|jpeg|gif|png|css|mp3|avi|mpg|txt|js|jar|rar|zip|tar|wav|wmv)$ {
    root /home/username/data/www/somedomain.tld;}
    }

    В этом случае все запросы будут равномерно раскидываться между серверами с внутренними айпишниками 192.168.1.1- 192.168.1.3

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

    Я в восторге от Google App Engine

    Логотип Google App Engine

    Не так давно я обратился в истинную веру стал изучать Python, и как оказалось, не зря. Питон уже давно успешно используется Гуглом в качестве одного из официальных языков разработки веб-приложений, и на сегодняшний день это один из двух языков, на котором легко пишутся приложения для Google App Engine (второй язык – Java)

    Гугл предлагает хостить такие приложения совершенно бесплатно. Те, кто в этом шарит, может слепить весьма достойные приложения. Хостинг этот весьма необычный, нет привычного доступа по FTP, SSH; все делается через консоль установленного фреймворка. Статику заливать можно, использовать БД – тоже. Но это будет не привычная всем MySQL или Oracle, это какая-то своя гугловская хитрая база данных, к которой можно строить запросы с помощью GQL, в чем-то похожий на привычных нам SQL.

    Дело было вечером, и вместо скачивания фильмов из сети, исключительно интереса ради я решил написать на Python игру “Угадай число” и выложить ее на бесплатный гуглохостинг. На нем все работает также стабильно, как и дома.

    Интересно то, что к бесплатному хостингу от гугла запросто можно прикрутить свой домен и хостить свои разработки, не нагружая свой VDS. При всем уважении к хостеру, вряд ли по надежности он сравнится с бесплатным хостингом от Google.