Порой хочется посмотреть фильм в пути или просто в дали от компьютера/телевизора, но таскать с собой портативный медиа плеер или любое другое устройство, способное хранить и воспроизводить видео в исходном качестве, не хочется или нет возможности.
Вот тут-то и приходит на выручку вещь, которую с собой таскают все и везде — мобильный телефон. На него можно сбросить пару фильмов и просмотреть их в любое удобное время. Но есть проблема: мобильный телефон не способен воспроизводить видео в исходном качестве и оно занимает очень много места на маленькой флешке. Решение проблемы очевидно: нужно сконвертить видео в удобочитаемый формат для телефона, заодно и размер файла уменьшится. 🙂
Ниже приведен скрипт для автоматической конвертации видео в контейнер .avi с видео mpeg4 и аудио AC3, которые воспроизводятся на многих cмартфонах «хардварно».
Собственно скрипт:
#!/bin/bash ABR=128 #Битрейт звука VBR=700 #Битрейт видео WIDTH=480 #Ширина видео FPS=24 #FPS OPT=2 #Режим работы #0 - конвертировать 1 файл без субтитров #1 - коныертировать 1 файл с субтитрами #2 - конвертировать папку с видео без субтитров #3 - конвертировать папку с видео с субтитрами (только MKV) #4 - рекурсивный обход папок и конвертирование EXT=mkv #расширение файлов для 1 и 3 SUB=".srt" #путь к субтитрам для режима 1 SID=0 #id субтитров в файле .mkv AID=1 #id аудиодорожки FILENAME="" #имя входного файла для 0 и 1 THREADNUM=2 #количество ядер процеесора в обрабтке INDIR="" #папка с исходным видео ODIR="" #папка с результирующим видео COMMAND="mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:acodec=libfaac:abitrate=$ABR:vcodec=mpeg4:threads=$THREADNUM:keyint=25:vbitrate=$VBR -ofps $FPS -af lavcresample=44100 -vf harddup,scale=$WIDTH:-11 -aid $AID" SUBS="-subpos 95 -subfont-text-scale 4 -subfont-blur 2 -subfont-outline 2 -unicode" PROGRESSLOG="" #путь к файлу лога #----------FUNCTIONS----------------- scan() { local x; for e in "$1"/*; do filename="${e##*\/}"; if [ -d "$e" -a ! -L "$e" ] then local folder="${e##*\/}" path="$path/$folder" echo "Now converting $folder" [ -d "$ODIR$path" ] || mkdir "$ODIR$path" chmod 777 "$ODIR$path" scan "$e"; path="${path%/$folder}" else FILE="${e##*\/}" echo "-----------------------------" echo "file $FILE" echo "-----------------------------" length=${#FILE} NEWFILENAME=${FILE:0:length-4} `$COMMAND -nosub -o "$ODIR$path/$NEWFILENAME.avi" "$e" > $PROGRESSLOG 2>&1` chmod 777 "$ODIR$path/$NEWFILENAME.avi" fi done } #----------SCRIPT----------------- [ -d "$ODIR" ] || mkdir "$ODIR" chmod 777 "$ODIR" case "$OPT" in "0" ) echo "Конвертирование 1 файла без субтитров" echo "-----------------------------" echo "$FILENAME" echo "-----------------------------" length=${#FILENAME} NEWFILENAME=${FILENAME:0:length-4} `$COMMAND -nosub -o "$ODIR/$NEWFILENAME.avi" "$INDIR/$FILENAME" > $PROGRESSLOG 2>&1` ;; "1" ) echo "Конвертирование 1 файла с субтитрами" echo "-----------------------------" echo "$FILENAME" echo "-----------------------------" length=${#FILENAME} NEWFILENAME=${FILENAME:0:length-4} case "$EXT" in "mkv" | "MKV" ) `$COMMAND $SUBS -sid $SID -o "$ODIR/$NEWFILENAME.avi" "$INDIR/$FILENAME" > $PROGRESSLOG 2>&1` ;; * ) `$COMMAND $SUBS -sub "$SUB" -o "$ODIR/$NEWFILENAME.avi" "$INDIR/$FILENAME" > $PROGRESSLOG 2>&1` ;; esac chmod 777 "$ODIR/$NEWFILENAME.avi" ;; "2" ) echo "Конвертирование папки без субтитров" cd "$INDIR" for FILE in * do echo "-----------------------------" echo "$FILE" echo "-----------------------------" length=${#FILE} NEWFILENAME=${FILE:0:length-4} `$COMMAND -nosub -o "$ODIR/$NEWFILENAME.avi" "$INDIR/$FILE" > $PROGRESSLOG 2>&1` chmod 777 "$ODIR/$NEWFILENAME.avi" done ;; "3" ) echo "Конвертирование папки с субтитрами" cd "$INDIR" case "$EXT" in "mkv" | "MKV" ) for FILE in *.$EXT do echo "-----------------------------" echo "$FILE" echo "-----------------------------" length=${#FILE} NEWFILENAME=${FILE:0:length-4} `$COMMAND $SUBS -sid $SID -o "$ODIR/$NEWFILENAME.avi" "$INDIR/$FILE" > $PROGRESSLOG 2>&1` done ;; * ) echo "not MKV" ;; esac ;; "4" ) echo "Рекурсивный обход папок и конвертирование без субтитров" path="" scan "$INDIR" ;; esac echo exit |
Скрипт оптимизирован для Xperia mini pro и имеет 5 режимов работы, функционирование которых понятно из комментариев в скрипте.
Настройка скрипта
Основная настройка сводится к присвоению переменным OPT, EXT, FILENAME, INDIR, ODIR, SID или SUB, AID необходимых значений, т.е простейшая настройка включает в себя:
- Выбор режима работы скрипта
- Указание расширения файла
- Указание имени файла
- Указание входной папки
- Указание выходной папки
- Указание id субтитров или пути к файлу с субтитрами
- Указание id аудиодорожки
Для более тонкой настроки можно поменять стандартные настройки в переменных: ABR, VBR, WIDTH, FPS, THREADNUM, COMMAND, SUBS, PROGRESSLOG.
Соответственно:
- Указать другой битрейт аудио
- Указать другой битрейт видео
- Указать дугую ширину кадра видео
- Указать другую частоту кадров
- Указать другое количество задействованных для конвертации ядер процессора
- Изменить командную строку (кодек, фильтры)
- Изменить параметры наложения субтитров
- Указать другой файл лога
Запуск конвертации
После завершения настройки можно просто запустить скрипт:
bash convert_video.sh |
Если конвертирование происходит удаленно (на другой машине), то при потере соединения процесс прервется, поэтому задачу лучше запускать в скринах командой:
screen -d -m -S videocon bash convert_video.sh |
А посмотреть выполнение можно будет посмотреть командой:
screen -r videocon |