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

ОС: 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 заблокировал показ этого ролика. Интересное кино….

Эффект черного ящика

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

use XML::Simple;
my $xs = XML::Simple->new();
my $ref = $xs->XMLin(‘test.xml’);

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

Выяснилось, что модуль XML::Simple сам по себе не занимается разбором XML, и парсинг происходит с помощью других доступных модулей. Если в системе установлен XML::SAX, то именно он будет использоваться по умолчанию, в противном случае для разбора будет применяться XML::Parser.

С XML::SAX тоже не все просто, он для разбора использует либо XML::SAX::PurePerl (что медленно и не всегда корректно работает), либо XML::SAX::Expat или XML::SAX::ExpatXS (если они установлены).

Так вот, чтобы XML::Simple смог корректно разобрать XML файл со строками в кодировке UTF-8, надо установить XML::SAX::Expat или XML::SAX::ExpatXS. Это совершенно не очевидно, и об этом можно забыть при переносе скриптов с сервера на сервер.

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

Дано: несколько фоток и подходящая музыка.
Требуется: сделать из них простенький клип.
Софт: 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, Как скачать видео с сайта, Мои путешествия – избранное