2010-06-28

Видео для android

Устройства на базе Google Android воспроизводят видео определенного формата (mp4). Чтобы сжать кино для просмотра можно использовать ffmpeg, собранный с кодеком x264.

К примеру, такой скрипт в арсенале андроидовода может прижиться. Назовем его android.sh, сделаем исполняемым и положим в какую-нибудь папку, проходящую по данным PATH.



Теперь сжатие файла выполняется командой:
android.sh FileName
или, если нужно выбрать звуковую дорожку
android.sh FileName 1

Пока что мне не попадалось видео, которые бы конвертировались криво. Ура ffmpeg-у.

А как быть с субтитрами?

Единственный плейер, который умеет играть видео с субтитрами (из тех, что мне известны) - mVideoPlayer (даже умеет их сдвигать на указанное кол-во миллисекунд в обе стороны). Единственный тип субтитров, которые он кушает - SRT. Соответственно, в кодировке UTF-8.
Значит, нужно конвертировать субтитры из других форматов. Специальные программы есть в репозитариях, но уже на третьем файле линуксоид подумает: а нельзя ли как-то это автоматизировать? Я искал что-нибудь консольное, и не нашел.
Пришлось, как всегда, брать python в руки. Пока что соорудил конвертировщик ASS в SRT, понадобится другой формат переводить - думаю, и с ним проблем не будет. На выходе отдает файл в исходной кодировке. Вот что получилось на скорую руку (создайте файл подобный предыдущему, например subconv.py)



Теперь файл конвертирую так:
subconv.py -f FileSub.ass
и создается FileSub.srt в той-же папке.
Для конвертирования пачки использую цикл:
for i in *.ass; do subconv.py -f "$i"; done

P.S. Буквально вчера было обновление mVideoPlayer, в котором добавилась поддержка субтитров SSA и ASS. Теперь стало еще легче.

Сборка свежего ffmpeg

Заметка на память. Сборка свежего ffmpeg с кодеком x264. Взято здесь.

sudo apt-get install subversion
mkdir ~/src
cd ~/src
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
sudo apt-get install checkinstall
sudo apt-get install libfaac-dev libfaad-dev libmp3lame-dev \
libtheora-dev libxvidcore-dev libvorbis-dev libogg-dev libdirac-dev \
libopenjpeg-dev libschroedinger-dev libspeex-dev libgsm1-dev yasm \
libopencore-amrnb-dev libopencore-amrwb-dev libdc1394-22-dev
sudo apt-get install git-core
git clone git://git.videolan.org/x264.git
cd x264
./configure
make
sudo checkinstall --fstrans=no --install=yes --pkgname=x264 \
--pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default
sudo ./configure --enable-gpl --enable-nonfree --enable-pthreads \
--enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora \
--enable-libx264 --enable-libxvid --enable-x11grab --enable-libdirac \
--enable-libopenjpeg --enable-libschroedinger --enable-libspeex \
--enable-libgsm --enable-libvorbis --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-libdc1394 --enable-version3
sudo make
sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg \
--pkgversion "3:0.svn`date +%Y%m%d` -12ubuntu3" --default
P.S. Если процессе сборки ffmpeg пишет так

.../libavcodec.so: undefined reference to `x264_encoder_open_94'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Ошибка 1
возможно установлены лишние пакеты:

sudo apt-get purge x264 libx264-dev

2010-06-18

Ядро. Заметки на память.

Получить исходники ядра. Можно установить из репозитариев для текущего ядра или скачать посвежее с kernel.org. Распаковать архив
tar -xvjf *.tar.bz2
Пропатчить ядро:
Скопировать патчи в папку с исходниками ядра, после чего для файлов *.patch
patch -p1 < filename.patch
или для файлов *.bz2
bzcat patch.bz2 | patch -p1
Получить конфигурацию текущего ядра:
zcat /proc/config.gz > .config
Или скопировать подходящий generic из /boot в файл .config
Можно подправить конфигурацию
make xconfig
make-kpkg clean
Создаем пакеты для установки
sudo su
make-kpkg --initrd --revision=i386 kernel_image kernel_headers modules_image
Устанавливаем их:
dpkg -i *.deb

2010-06-17

Собрать несколько видеофайлов в один

Используя mencoder, собрать несколько AVI-файлов:
sudo apt-get install mencoder
mencoder 1.avi 2.avi 3.avi -oac copy -ovc copy -o out.avi

Если у нас несколько файлов формата MOV, переведем их сначала в AVI, например, с помощью ffmpeg:
sudo apt-get install ffmpeg
for i in *.MOV; do ffmpeg -i "$i" -vcodec mpeg4 -b 480k -r 23.976 -acodec libmp3lame -ab 96k -sameq -pass 1 ${i%MOV}avi; done


Теперь соберем все AVI в один:
sudo apt-get install transcode-utils
avimerge -o out.avi -i *.avi

2010-06-10

Firefox, Flash и звук (вернее, его отсутствие)

Все понятно, да? Видео есть, звука нет. У меня это носило периодический характер - то есть, то нет. Иногда в Chrome он есть, иногда и там пропадает. Почитав вики-страничку PulseAudio кажется понял, в чем дело.
Делаем так. Убеждаемся, что установлено все, что нужно:
sudo apt-get install flashplugin-installer flashplugin-nonfree flashplugin-nonfree-extrasound
sudo gedit /etc/firefox/firefoxrc
Вписываем туда строку
FIREFOX_DSP="padsp"
Сохраняем, закрываем, перезапускаем Firefox. Теперь звук работает!

P.S. НЕ панацея. На следующий день снова не работало.
Переустановил свежую ALSA (см.форум) - снова звучит. Интересно, надолго ли?

2010-06-08

Sony VAIO + Ubuntu. Как подружить?

Инструкция для огорченных совместной неработой ноутбука Sony VAIO и Ubuntu.
Установить и настроить Ubuntu 10.04 мне предстояло на двух ноутбуках Sony VAIO, один из них S-серии (VPCS11M9R/B), второй F-серии (VPCF11Z1R/BI).

Проблема:
Не удается установить Ubuntu, при запуске с Live-CD возникает черный экран. Наблюдается на S-серии.
Лечение:
Запускаем линукс с передачей ядру параметра nomodeset. Для этого после появления меню загрузки с диска нажать F6, и отметить галкой этот параметр. После установки нужно прописать этот параметр в меню загрузки, подредактировав меню grub:
sudo gedit /boot/grub/grub.cfg
После строки
### BEGIN /etc/grub.d/10_linux ###
видим описание пунктов загрузки. К нужному нам (обычно самому первому) после слов "quiet splash" допишем "nomodeset", так чтобы строка стала похожа на
linux /boot/vmlinuz-2.6.33.4-candela root=/dev/sda2 ro quiet splash nomodeset
Теперь с этого пункта удастся запустить Ubuntu. Правда, он какой-то убитый... Еще бы, с таким-то параметром. Может быть, многого будет не хватать, например меню или панелей, но у нас всегда есть Alt-F2, чтобы написать там 'gnome-terminal' и снова стать хозяином положения. Не огорчаемся, это еще не все, всё у нас будет нормально.

Проблема:
Не удается задействовать драйвера NVidia. Замечено и на S и на F серии, но по разному. После попытки их установить и запустить Ubuntu получаем нечто жуткое - F-серия отображает съехавшее или расплывающееся изображение, а S-серия с параметром nomodeset вообще его не грузит, а без него - ну да, черный экран.
Лечение:
Нам нужно получить бинарный EDID-файл из драйверов под Windiws (если я правильно понял) и подсунуть его в xorg.conf. Для этого берем программу "Phoenix EDID Designer" например, здесь (она работает в Win7 и бесплатна, softMCCS в семерке даже не запустилась). Запускаем ее в Windows7 (вы ведь не удалили ее, правда?), и проделываем там:
"Tools > Extract Registry EDID", "Extract EDID", "File > Export" как ".raw" файл. Теперь забираем этот файл в линукс, к примеру, на флешке. Копируем этот файл куда-нибудь, у меня получилось в '/etc/X11/edid.raw'. Немного пошаманим в файле xorg.conf, правда в Ubuntu 10.04 его уже не найти, но никто не мешает нам его создать.
sudo gedit /etc/X11/xorg.conf
И напишем там такие заклинания:
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
Option "ConnectedMonitor" "DFP-0"
Option "CustomEDID" "DFP-0:/etc/X11/edid.raw"
EndSection
Сохраняем. Теперь можно установить драйвер от NVidia. Пользователи F-серии смогут это сделать через GUI, а терминальщикам в S-серии придется как-то так:
sudo apt-get install nvidia-185*
Ну или новее, если будет к тому моменту. Осталось убрать nomodeset из меню grub (для S-серии) и перезагрузиться. Видео починили.

Проблема:
Не видит устройств WiFi. Наблюдается в S-серии.
Лечение:
Нам нужна новая прошивка для WiFi, номер 6050. Копируем файл с сайта, распаковываем, читаем readme и копируем
sudo cp iwlwifi-6050-4.ucode /lib/firmware/
Перезагрузка, система видит wlan0, ну не прекрасно ли?

Проблема:
Система не работает со звуковым устройством. Наблюдается и в F и в S сериях.
Лечение:
Установка последней версии alsa. Для этого, по рецепту с форума:
sudo apt-get install linux-headers-`uname -r` build-essential gcc gawk libgettext-ruby-util libgettext-ruby1.8 libncurses5-dev libncursesw5-dev xmlto checkinstall
wget ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.23.tar.bz2
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.23.tar.bz2
wget ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.23.tar.bz2
tar jxvf alsa-driver-1.0.23.tar.bz2
tar jxvf alsa-lib-1.0.23.tar.bz2
tar jxvf alsa-utils-1.0.23.tar.bz2
cd ./alsa-driver-1.0.23
./configure --with-cards=hda-intel
make
sudo make install
cd ../alsa-lib-1.0.23
./configure
make
sudo make install
cd ../alsa-utils-1.0.23
./configure
make
sudo make install
sudo alsaconf

Этого оказалось достаточным, чтобы все запело и за играло, переключалось на наушники и обратно.

Что еще осталось:
Не работает Bluetooth в S-серии и не могу переключиться на встроенный микрофон (S и F). Если кто решил, отпишитесь.

P.S. Установка этого ядра для версии 10.10 (2.6.36 RC3) что-то изменила: заработал микрофон! Зато отвалились 3D эффекты: драйвер Nvidia не работает. Но это внушает надежду, что к релизу 10.10 наконец все заработает как надо!