Конвертим видео с mencoder

Порой хочется посмотреть фильм в пути или просто в дали от компьютера/телевизора, но таскать с собой портативный медиа плеер или любое другое устройство, способное хранить и воспроизводить видео в исходном качестве, не хочется или нет возможности.

Вот тут-то и приходит на выручку вещь, которую с собой таскают все и везде — мобильный телефон. На него можно сбросить пару фильмов и просмотреть их в любое удобное время. Но есть проблема: мобильный телефон не способен воспроизводить видео в исходном качестве и оно занимает очень много места на маленькой флешке. Решение проблемы очевидно: нужно сконвертить видео в удобочитаемый формат для телефона, заодно и размер файла уменьшится. :-)

Ниже приведен скрипт для автоматической конвертации видео в контейнер .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
Запись опубликована в рубрике Linux с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *