воскресенье, 25 июля 2010 г.

Конвертация видео для Nokia S60v5 в Linux (Nokia 5530, 5800, 5230, X6)

После покупки Nokia 5530 я решил попробовать смотреть на нем фильмы. Оказалось, что телефон требует специфического формата видео и встала задача найти подходящий конвертер. Пара минут, проведенная в гугле, дала мне несколько скриптов, позволяющих конвертировать видео из командной строки. Все они использовали Mencoder и ни один не смог справится со всеми тестовыми видео.

У одних были проблемы с видео формата 3:4, другие по неизвестной причине валились на этапе кодирования аудиодорожки, третьи неправильно рассчитывали итоговый масштаб и телефон при попытке воспроизведения показывал только сообщение "Недействительный клип. Операция отменена".

Промучившись с существующими конвертерами я решил на их основе собрать свой, лишенный всех их недостатков. В результате получился такой код:
#!/bin/bash
INPUT="$1"
OUTPUT="$INPUT.nokia.mp4"

# Битрейт видео
VBITRATE=800
# Битрейт аудио
ABITRATE=128
# Разрешение экрана телеофна
SCALE="640:360"


MENCODER="$(which mencoder 2>/dev/null)"
MPLAYER="$(which mplayer 2>/dev/null)"

# Определяем соотношение сторон исходного видео
INWIDTH=$($MPLAYER "$INPUT" -identify -nosound -vo null -nocache -frames 1 | grep '^ID_VIDEO_WIDTH' | tail -n 1 | awk -F= '{print $2}')
INHEIGHT=$($MPLAYER "$INPUT" -identify -nosound -vo null -nocache -frames 1 | grep '^ID_VIDEO_HEIGHT' | tail -n 1 | awk -F= '{print $2}')

ASPECT=`echo "scale=4; $INWIDTH/$INHEIGHT" | bc`
let "OUTWIDTH=((360*$INWIDTH/$INHEIGHT))"
let "OUTHEIGHT=((640*$INHEIGHT/$INWIDTH))"

# Рассчитываем соотношение сторон, в которое будем конвертировать
if [[ $INWIDTH < 640 && $INHEIGHT < 360 ]]
then
    SCALE="$INWIDTH:$INHEIGHT"
else
    if [[ $ASPECT != 1.7777 ]]
    then
        if [[ $ASPECT > 1.7777 ]]
        then
            SCALE="640:$OUTHEIGHT"
        else
            SCALE="$OUTWIDTH:360"
        fi
    fi
fi

# Параметры кодирования видео одинаковы для обоих проходов
MENC_PARAMS="-of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -ofps 25 -af lavcresample=44100 -vf scale=$SCALE,harddup -lavcopts aglobal=1:vglobal=1:acodec=libfaac:vcodec=mpeg4:abitrate=$ABITRATE:vbitrate=$VBITRATE:keyint=50:mbd=1:vqmax=10:lmax=10"

# Кодируем видео
$MENCODER "$INPUT" -o /dev/null $MENC_PARAMS:vpass=1
$MENCODER "$INPUT" -o "$OUTPUT" $MENC_PARAMS:vpass=2

# Удаляем лог кодирования
rm divx2pass.log
Этот скрипт использует двухпроходное кодирование, что дает лучшее качество, автоматически масштабирует размер изображения и удаляет за собой ненужный мусор.

Для использования скрипта создайте файл /usr/local/bin/v4nokia и сохраните в него код, приведенный выше. После этого зайдите в каталог с исходным видео и выполните команду:
v4nokia myvideo.avi
Где myvideo.avi — имя вашего видеофайла. Через некоторое время в том же каталоге появится файл myvideo.avi.nokia.mp4, который можно будет воспроизвести на телефоне. Этот конвертер подходит для Nokia 5530, 5800, 5230, X6, и любого другого телефона, построенного на платформе S60v5.

5 комментариев:

Анонимный комментирует...

ниче не понятно. какой файл создавать в usr и как создавать там все неактивно

Анонимный комментирует...

непонятно что в этом скрипте надо копировать а что просто комментарии

Анонимный комментирует...

перепробовал с десяток gui конверторов в каждом из которых написано "вы с легкостью конвертнете avi в mp4" но в итоге нигде в mp4 не конвертнулось.и вот вроде норм скрипт но непонятно как его исп. а опять экспериментировать стремно скоко времени ушло на эти супер конверторы и не один не сделал то что надо.более того в пресетах нет нормальных моделей нокиа. есть только малоизвестные n800 n770

Анонимный комментирует...

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

Анатолий комментирует...

Спасибо за скрипт, изменил и подправил некоторые параметры под убунту это acodec=libmp3lame и удалил параметр -ofps 25.