Convert Video to HTML5 in Ubuntu

I wanted an easy way to convert videos to HTML5 formats (mp4/ogg/webm). With Linux, I could easily create a bash script to do all three and even create a screencap for the poster attribute.

The install process is a bit tedious and time consuming, but after it’s all installed you’re good to run the script for all your videos. The script uses ffmpeg to convert to all 3 formats, and it supports most any video format. The script also uses ffmpeg to generate a random screenshot, and even writes the HTML5 code for you.

Installation

For the most part, this portion of the tutorial was derived from the Ubuntu Forums.

  1. Uninstall Old Versions
  2. sudo apt-get remove ffmpeg x264 libx264-dev yasm
  3. Install Dependencies and Install Tools
  4. sudo apt-get update
    sudo apt-get install build-essential git-core checkinstall texi2html libfaac-dev \
        libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
        libvorbis-dev libx11-dev libxfixes-dev zlib1g-dev
  5. Install Yasm
  6. cd ~/Downloads
    wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
    tar xzvf yasm-1.2.0.tar.gz
    cd yasm-1.2.0
    ./configure
    make
    sudo checkinstall --pkgname=yasm --pkgversion="1.2.0" --backup=no --deldoc=yes --default
  7. Install x264
  8. cd ~/Downloads
    git clone git://git.videolan.org/x264
    cd x264
    ./configure --enable-static
    make
    sudo mkdir /usr/local/lib/pkgconfig
    sudo checkinstall --pkgname=x264 --default --pkgversion="3:$(./version.sh | \
        awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes
  9. Install LAME
  10. sudo apt-get remove libmp3lame-dev
    sudo apt-get install nasm
    cd ~/Downloads
    wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.tar.gz
    tar xzvf lame-3.99.tar.gz
    cd lame-3.99
    ./configure --enable-nasm --disable-shared
    make
    sudo mkdir /usr/local/share/doc
    sudo mkdir /usr/local/share/doc/lame
    sudo checkinstall --pkgname=lame-ffmpeg --pkgversion="3.99" --backup=no --default \
        --deldoc=yes
  11. Install libvpx
  12. cd ~/Downloads
    git clone http://git.chromium.org/webm/libvpx.git
    cd libvpx
    ./configure
    make
    sudo checkinstall --pkgname=libvpx --pkgversion="$(date +%Y%m%d%H%M)-git" --backup=no \
        --default --deldoc=yes
  13. Install ffmpeg
  14. cd ~/Downloads
    git clone --depth 1 git://source.ffmpeg.org/ffmpeg
    cd ffmpeg
    ./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
        --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx \
        --enable-libx264 --enable-nonfree --enable-postproc --enable-version3 --enable-x11grab
    make
    sudo checkinstall --pkgname=ffmpeg --pkgversion="$(date +%Y%m%d%H%M)-git" --backup=no \
        --deldoc=yes --default

    The part that will take the longest is the ffmpeg, so be prepared to wait.

    The Script

    Usage:

    ./convertHTML5 video-file.ext

    The script will output “video-file.ogv”, “video-file.webm”, “video-file.mp4″, and “video-file.html” while keeping the original video intact. The HTML document just has the plain <video> code with nothing else, easily copied and pasted.

    #!/bin/bash
    
    if [[ $1 ]]
    then
        filename=$(basename "$1")
        filename=${filename%.*}
        directory=$(dirname "$1")
    
        duration=$(ffmpeg -i "$1" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,)
        minutes=${duration%:*}
        hours=${minutes%:*}
        minutes=${minutes##*:}
        seconds=${duration##*:}
        seconds=${seconds%.*}
    
        hours=$((hours*3600))
        minutes=$((minutes*60))
    
        total=$(expr $hours + $minutes + $seconds)
        number=$RANDOM
        let "number %= $total"
    
        echo "Generating thumbnail"
        ffmpeg -i "$1" -deinterlace -an -ss $number -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg "$directory/$filename.jpg" 2>&1
        echo "Converting $filename to ogv"
        ffmpeg -i "$1" -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b 345k "$directory/$filename.ogv"
        echo "Finished ogv"
    
        echo "Converting $filename to webm"
        ffmpeg -i "$1" -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b 345k "$directory/$filename.webm"
        echo "Finished webm"
    
        echo "Converting $filename to h264"
        ffmpeg -i "$1" -acodec libfaac -ab 96k -vcodec libx264 -level 21 -refs 2 -b 345k -bt 345k -threads 0 "$directory/$filename.mp4"
        echo "Finished h264"
    
        echo "Writing HTML..."
    
        echo "</pre>
    <video width="320" height="240" controls="controls" poster="\&quot;$filename.jpg\&quot;" preload=""><source src="\&quot;$filename.ogv\&quot;" type="\&quot;video/ogg\&quot;" /><source src="\&quot;$filename.webm\&quot;" type="\&quot;video/webm\&quot;" /><source src="\&quot;$filename.mp4\&quot;" type="\&quot;video/mp4\&quot;" />" > "$directory/$filename.html"
     echo " " >> "$directory/$filename.html"
     echo " " >> "$directory/$filename.html"
     echo " " >> "$directory/$filename.html"
     echo " Sorry, your browser does not support HTML5 video" >> "$directory/$filename.html"
     echo "</video>
    <pre>" >> "$directory/$filename.html"
    
        echo "All Done!"
    else
        echo "Usage: [filename]"
    fi

    Credits: McSwindler

Скачивание с RuTube в Ubuntu Linux

Ubuntu Linux:

sudo apt-get install rtmpdump

Rutube отдаёт ссылки на видеоролики 4-мя способами (по состоянию на 8 ноября 2013 г.):

  1. Нешифрованное видео по протоколу RTMP. Для закачки используется rtmpdump (версия не ниже 2.4).
  2. Шифрованное видео по RTMP. Хоть и скачается rtmpdump’ом, но воспроизвести его не удастся. Решение для этого типа ссылок не найдено.
  3. Нешифрованное видео по технологии HTTP Dynamic Streaming. Для закачки используется скрипт AdobeHDS.php
  4. Нешифрованное видео методом HTTP Live Streaming. Для закачки используется VLC/ffmpeg.

Сначала нужно определить, какой тип отдачи используется для требуемого видеоролика, на момент обновления статьи чаще всего это способы 3 и 4 (как минимум, для российских пользователей).

Для этого берём любую ссылку на нужное видео с его полным или предназначенным для встраивания идентификатором, это может быть ссылка вида:

  1. http://rutube.ru/video/51c001891c1147fa53787c8496c0d8bf/
  2. http://rutube.ru/video/embed/6641938
  3. http://rutube.ru/[accounts/login/?next=/]video/private/2cc0885902cac3c8f9f88849e115db15/?p=lwTcQ6Z0PUTg3AB7lDvGqg

Для ссылки под номером 3 важно не терять параметр “p”, стоящий в конце.

Открываем файл с информацией о видео http://rutube.ru/api/play/trackinfo/<VIDEO_ID>/?format=xml[&p=blablabla]:

http://rutube.ru/video/51c001891c1147fa53787c8496c0d8bf/
=> http://rutube.ru/api/play/trackinfo/51c001891c1147fa53787c8496c0d8bf/?format=xml
http://rutube.ru/video/embed/6641938
=> http://rutube.ru/api/play/trackinfo/6641938/?format=xml
http://rutube.ru/[accounts/login/?next=/]video/private/2cc0885902cac3c8f9f88849e115db15/?p=lwTcQ6Z0PUTg3AB7lDvGqg
=> http://rutube.ru/api/play/trackinfo/2cc0885902cac3c8f9f88849e115db15/?format=xml&p=lwTcQ6Z0PUTg3AB7lDvGqg

В этом файле нужны адреса из тега <videoBalancer>:
<default>http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.f4m — внутри этого файла будут ссылки для закачки по RTMP/HDS.
<m3u8>http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.m3u8 — для HLS.

RTMP/HDS

<default>http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.f4m
Это файл-манифест. Открыв его, смотрим на теги <baseURL> и <media>. Определяем тип отдачи по их содержимому:

  • RTMP, если baseURL == rtmp://video-N-N.rutube.ru/bla-bla-bla, а атрибут url тега media содержит расширение .mp4 в тексте ссылки.
  • Шифрованное видео по RTMP, если тот же атрибут url содержит расширение .f4f. Скачанное видео не воспроизводится.
  • Нешифрованное видео по HDS, если baseURL == http://video-N-N.rutube.ru, тег(и) media указывает на манифест (ссылка с расширением .f4m) либо сразу на mp4-файл.

Определившись со способом отдачи, приступаем к закачке.

RTMP
Тег <baseURL> содержит имя хоста, порт и переменную “app”. Атрибут url тега <media> содержит путь к потоку (playpath):
rtmp://video-N-N.rutube.ru(:1935)/<app>/mp4:volNN/movies/.*
|____________host___________|__app__|_____playpath____|

где переменная app может принимать следующие значения:

  1. vod/
  2. rutube/
  3. rutube_vod_[0-9]/
  4. rutube_vod_[0-9]/_definst_/

Из параметров, предлагаемых дампером (rtmpdump –help), нам нужны следующие:

--rtmp           URL (напр. rtmp://host[:port]/)
--app            Переменная app.
--playpath       Перезаписывает playpath, указанный в --rtmp
--swfUrl         Ссылка на swf-плеер.
--flv            Название конечного FLV-файла.
--live           Для rtmp-ссылок, переменная app которых равна "vod/".

Примеры закачки ссылок:
rtmp://video-1-12.rutube.ru:1935/rutube_vod_2/_definst_/mp4:vol12/movies/b5/e0/b5e08ad46a65d700dd0da2f7b40e2fc0.mp4?e=1288635285&s=740fa844fc6687ac03681a0eb72d003e

sh/cmd:

rtmpdump --rtmp "rtmp://video-1-12.rutube.ru:1935/"
 --app "rutube_vod_2/_definst_/"
 --swfUrl "http://rutube.ru/player.swf"
 --playpath "mp4:vol12/movies/b5/e0/b5e08ad46a65d700dd0da2f7b40e2fc0.mp4?e=1288635285&s=740fa844fc6687ac03681a0eb72d003e"
 --flv "output_video.flv"

rtmp://video-102-1.rutube.ru:1935/vod/mp4:rutube/vol41/movies/a2/05/a205ff4b2073c18522253585224f7a7c.mp4?e=1287342905&s=813f44d26fe97cd7ef670cb8d44e36e2

sh/cmd:

rtmpdump --rtmp "rtmp://video-1-12.rutube.ru:1935/"
 --app "vod/"
 --swfUrl "http://rutube.ru/player.swf"
 --playpath "mp4:rutube/vol41/movies/a2/05/a205ff4b2073c18522253585224f7a7c.mp4?e=128734&s=813f44d26fe97cd7ef670cb8d4"
 --flv "output_video.flv"
 --live

Не забудьте про параметр –live, используемый при переменной app равной “vod/”. Иначе видео будет качаться в размере, в два-три раза превышающий указанный на сайте. Также –swfUrl, он должен быть равен адресу флеш-плеера: “http://rutube.ru/player.swf”.

HDS
С HDS-ссылками проще, достаточно ссылки на f4m-файл:

sh/cmd:

php.exe AdobeHDS.php --manifest "http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.f4m"
 --outfile "output_video.mp4"

HLS

<m3u8>http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.m3u8

Для закачки можно использовать ffmpeg:

sh/cmd:

ffmpeg -i "http://bl.rutube.ru/5bc45bc80ad9f9597a8e1de3e0cf69f6.m3u8" video_out.ts

 

Credits: tradiz.org

Yota Samsung SWC-U200 in Ubuntu Linux

Установка предельно проста (проводил на 11.10):

git clone https://github.com/ago/madwimax.git
cd madwimax
autoreconf --install
sudo apt-get install libusb-1.0-0-dev liblua5.1-0-dev asciidoc docbook2x
./configure
make
sudo make install

Втыкаем модем, проверяем:

sudo ifconfig
#должен появиться wimax0 или по типу того

Заходим на Yota.ru, жмём Личный кабинет, там “привязать устройство” и всё! Покупка-продажа модема весьма проста, не надо никаких симок ни кодов. Нужен просто модем. Больше ничего. Никаких договоров. Удобно. Единственное – при привязке спрашивают как зовут, где живёшь, №паспорта. В остальном хорошо! Посмотрим, что за качество связи у Yota, на что жалуются чуть более чем 100% моих друзей 🙂

Speedtest:
speedtest yota

rTorrent with ruTorrent GUI from GIT on Ubuntu Linux 12.04

Bash script:

sudo apt-get --purge remove libxmlrpc* libtorrent* rtorrent
sudo apt-get install build-essential checkinstall libcurl4-openssl-dev libncurses5-dev libncursesw5-dev libsigc++-2.0-dev libtool git autoconf automake libcppunit-dev subversion

# Check that your g++ is 4.7+ (if so, skip this block)
g++ --version
sudo add-apt-repository ppa:ubuntu-toolchain-r/test 
sudo apt-get update
sudo apt-get install gcc-4.7 g++-4.7 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

#fresh xmlrpc-c lib install
svn co https://svn.code.sf.net/p/xmlrpc-c/code/advanced xmlrpc-c
cd xmlrpc-c
./configure --prefix=/usr
make
#change version from "C" to smth else while installing the package
sudo checkinstall -D
cd ..

#libtorrent install
git clone git://github.com/rakshasa/libtorrent.git
cd libtorrent
./autogen.sh
./configure --prefix=/usr --with-posix-fallocate
make
sudo checkinstall -D
cd ..

#rtorrent install
git clone git://github.com/rakshasa/rtorrent.git
cd rtorrent
./autogen.sh
./configure --prefix=/usr --with-xmlrpc-c
make
sudo checkinstall -D

#rutorrent web-GUI
cd /var/www/
sudo svn co http://rutorrent.googlecode.com/svn/trunk/rutorrent
sudo chown -R  www-data:www-data /var/www/
sudo chmod -R  777 /var/www/rutorrent/share

#update rutorrent
cd /var/www/rutorrent
sudo svn up

#autolaunch on startup
sudo apt-get install screen
echo "screen -fa -d -m rtorrent" >> /etc/rc.local

# nginx
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx

Last revised: Nov 22, 2014 (script is originally written for Ubuntu 12.04)

Выбор самого быстрого зеркала репозиториев через консоль в Ubuntu Linux

С помощью GUI легко выбирать самый быстрый сервер репозиториев для загрузки обновлений. Но как сделать это через командную строку? Очень просто! apt поддерживает директиву mirror, с помощью которой система может выбирать наиболее лучшие зеркала в зависимости от вашего местоположения.

Всё, что нужно – это добавить следующие строки вверху файла

/etc/apt/sources.list
deb mirror://mirrors.ubuntu.com/mirrors.txt oneiric main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt oneiric-updates main restricted universe multiverse

Пользователи Lucid (10.04), Maverick (10.10), Natty (11.04) могут поменять слово oneiric в командах на имя своего дистрибутива.

Настройка трекбола Logitech TrackMan Marble Mouse в Ubuntu Linux


В статье описывается настройка трекбола Logitech TrackMan Marble с возможностью прокрутки страниц. Основной ref тут (документация сообщества Ubuntu) и тут.

Добавьте следующий код в

/usr/share/X11/xorg.conf.d/11-evdev-quirks.conf

и перезапусте X Window сервер:
(или в /etc/X11/xorg.conf.d/50-marblemouse.conf, предварительно выполнив

gsettings set org.gnome.settings-daemon.plugins.mouse active false

)

Section "InputClass"
        Identifier  "Marble Mouse"
        MatchProduct "Logitech USB Trackball"
        MatchIsPointer "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
        Option "ButtonMapping" "1 8 3 4 5 6 7 2 9"
        Option "EmulateWheel" "true"
        Option "EmulateWheelButton" "8"
        Option "ZAxisMapping" "4 5"
        Option "XAxisMapping" "6 7"
        Option "Emulate3Buttons" "true"
EndSection

Я обычно предпочитаю ставить ButtonMapping таким, как указано выше, но некоторые предпочитают вот такой:

Option "ButtonMapping" "1 2 3 4 5 6 7 8 9"

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

Обновление: работает также в Ubuntu 13.10, 14.04, Debian Squeezy.

Объединение нескольких PDF файлов в один в Ubuntu Linux

Иногда удобно бывает объединять несколько файлов PDF в один. Например, можно аккумулировать много PDF счетов, новостных файлов и др. в один сложный.

Подготовка системы:

sudo apt-get install gs pdftk

Теперь, рассмотрим пример объединения pdf файлов. К примеру, у нас есть файлы 1.pdf,2.pdf,3.pdf и мы хотим их объединить. Делается это следующим образом:

gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=combinedpdf.pdf -dBATCH 1.pdf 2.pdf 3.pdf

В команде сверху после “-sOUTPUTFILE=” укажите название файла на выходе на такое, какое посчитаете нужным. Переназовите файлы “1.pdf 2.pdf 3.pdf” на те, которые у вас имеются и которые вы хотите объединить (названия файлов отделяются с помощью пробелов).

После запуска комманды сверху будет создан новый PDF файл под названием combinedpdf.pdf и он будет содержать все файлы, которые были указаны для объединения в порядке указания.

Если вы хотите узнать о других возможностях комманды gs – проверьте его man страницу.

Приглашения, рассадочные карточки в Libreoffice

Потребовалось мне тут как-то оформить рассадочные карточки для свадьбы. Для своей свадьбы имена писались на каждую карточку вручную, для чужой свадьбы каждое имя стало писать лень и я решил это дело оптимизировать. С помощью данного способа можно также легко создать кучу персональных приглашений на мероприятие, напечатать почтовые конверты для многих адресатов и др. Задача решалась в свободном офисном приложении LibreOffice Writer (3.3.3), действия в OpenOffice аналогичные.

  1. Для начала выбрал красивый шрифт! Мне понравился Corinthia Regular TrueType Font.
    Шрифт Corinthia
    Шрифт устанавливал в Ubuntu через консоль следующей командой:

    sudo cp CORINTHI.TTF /usr/share/fonts/truetype/openoffice/
    

    Кнопку “Install Font” при кликании на шрифт сначала не разглядел, но думаю должно заработать и так.

  2. После этого создал новый документ в Writer:
    Новый документ в LibreOffice Writer
  3. Установил нужные параметры страницы – ориентацию, размер бумаги, поля
    Размеры полей
  4. Создал таблицу 3х1
    Создание таблицы
  5. После этого преобразовал список имён из такого вида:
    Иванов Иван Иванович
    Петров Пётр Петрович
    Сидоров Сидор Сидорович

    в удобный вид для дальнейшего использования макросами LibreOffice:

    "Иванов Иван Иванович", "Петров Пётр Петрович", "Сидоров Сидор Сидорович"

    Т.е. записал все имена в строчку через запятую и каждое имя в кавычках.
    Имена записывал в строчку с помощью VIM и следующих простых команд:

    :%s/^/"/g
    :%s/$/"/g
    :%s/\n/,/g
    :%s/"\ /"/g
    :%s/\ "/"/g
    :%s/"\ /"/g
    :%s/,$//g
    
  6. По умолчанию макросы отключены в LibreOffice и являются экспериментальной функцией. Включить макросы можно с помощью нажатия галочки в меню:
    “Tools | Options… | General | Enable experimental”
  7. Далее был написан следующий индусский код, который был записан в новый макрос Writer:
    sub Main
    dim document   as object
    dim dispatcher as object
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim col as integer
    dim row as integer
    dim args4(0) as new com.sun.star.beans.PropertyValue
    
    myarray=Array("Иванов Иван Иванович", "Петров Пётр Петрович", "Сидоров Сидор Сидорович")
    row=0
    Do while row<(UBound(MyArray) \ 3)+1
            col=0
            Do While col<3
                    dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())
                    col=col+1
            Loop
            args4(0).Name = "Text"
            col=0
            Do While col<3
                    args4(0).Value = myarray(row*3+col)
                    dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args4())
                    dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())
                    col=col+1
            Loop
            row=row+1
    Loop
    end sub
    
  8. Далее при установке курсора в первую ячейку таблицы и активации макроса Иванов, Петров и Сидоров автоматически помещались в таблицу.
  9. Остаётся только изменить размеры ячеек и выбрать нужный шрифт и его размер
    Размеры ячеек

Вот, что получилось в конечном итоге:
Вот, что получилось в конечном итоге

В моём случае 17 листов имён людей создались за пятнадцать-двадцать кликов мышкой!

Апплет индикатор погоды в Ubuntu 11.04 Unity


Если вы также, как и я соскучились по старому доброму индикатору погоды, установить его в новом Unity интерфейсе можно так:

sudo add-apt-repository ppa:weather-indicator-team/ppa
sudo apt-get update
sudo apt-get install indicator-weather

Мне понравился больше индикатор от weather-indicator-team, но также можно установить индикатор от Лоренцо:

sudo add-apt-repository ppa:lorenzo-carbonell/atareao
sudo apt-get update
sudo apt-get install my-weather-indicator