Авторизация

Вы можете войти через одну из учетных записей:

ИЛИ



Напомнить пароль
Регистрация

How-toСкрипт для конвертирования видео-файлов в mp4

В связи с покупкой нового телефона (Samsung S5230) — возникла потребность конвертировать видео в mp4.

Из найденных решений ничего толком не понравилось. Поэтому решил изобрести еще один велосипед.
Ну а так как я начал немного интересовать Perl-ом — то решил на нем и сваять, т.с. попрактиковаться.
Для работы скрипта нужны ffmpeg и mplayer (а точнее скрипт идущий с ним — midentify).
Проверял на файлах avi и mkv.

Используется элементарно

./tomp4 filename


#!/usr/bin/perl


if ( @ARGV == 0 ) {
        warn "ERROR!!! Can't find arguments\n" ;
        warn "Please use $0 \"\/file path\"\n\n" ;
        exit 1 ;
}


$if_filepath = "@ARGV" ;
$of_dir = "$ENV{HOME}" ;
$midentify = "/usr/bin/midentify" ;
$ffmpeg = "/usr/bin/ffmpeg" ;


&prog_file_atr_check ($midentify) ;
&prog_file_atr_check ($ffmpeg) ;
&if_filepath_atr_check ($if_filepath) ;
&of_dir_atr_check ($of_dir) ;


## OUTPUT
$of_extension = "mp4" ;

$ov_vcodec = "mpeg4" ;
$ov_vbitrate = "600k" ;
$ov_fps = "24" ;
$ov_wsize = "400" ;
$ov_hsize = "240" ;
#$ov_aspect = "16:9" ;

$oa_acodec = "libfaac" ;
$oa_abitrate = "128k" ;
$oa_frequency = "44100" ;
$oa_channels = "2" ;


## INPUT
($if_filename = $if_filepath) =~ s#(?:.*/)(.*\.)(.*)#$1$of_extension# ;
$i_aspect = `$midentify "$if_filepath" | grep ID_VIDEO_ASPECT | cut -d"=" -f2` ;


sub if_filepath_atr_check {
        die "ERROR!!! \"$_[0]\" - File not found\n\n" unless ( -e $_[0] ) ;
        die "ERROR!!! \"$_[0]\" - It does not file\n\n" unless ( -f _ ) ;
        die "ERROR!!! \"$_[0]\" - Can't read a file\n\n" unless ( -r _ ) ;
        print "GOOD!!! \"$_[0]\" - File ready\n\n" ;
}


sub of_dir_atr_check {
        die "ERROR!!! \"$_[0]\" - File not found\n\n" unless ( -e $_[0] ) ;
        die "ERROR!!! \"$_[0]\" - It does not directory\n\n" unless ( -d _ ) ;
        die "ERROR!!! \"$_[0]\" - Directory is not writable\n\n" unless ( -w _ ) ;
        print "GOOD!!! \"$_[0]\" - Directory ready\n\n" ;
}


sub prog_file_atr_check {
        die "ERROR!!! \"$_[0]\" - File not found\n\n" unless ( -e $_[0] ) ;
        die "ERROR!!! \"$_[0]\" - It does not file\n\n" unless ( -f _ ) ;
        die "ERROR!!! \"$_[0]\" - Impossible to run a program\n\n" unless ( -x _ ) ;
        print "GOOD!!! \"$_[0]\" - It is installed\n\n" ;
}


## Если входящее число не четное - то уменьшаем его до четного
sub odd_2_even {
        unless ( $_[0] =~ m/(^\d+$)/ ) {
                warn "ERROR!!! $_[0] - this is not the number\n\n" ;
                return ;
        }
        if ( $_[0] % 2 > 0 ) {
                return $_[0] - 1 ;
        }
        else {
                return $_[0] ;
        }
}


## Если во входящем файле не прописано соотношение строн - то вычисляем его сами
if ( $i_aspect <= 0 ) {
        die "ERROR!!! Can't get \"ID_VIDEO_WIDTH\"\n\n" unless $i_wsize = `$midentify "$if_filepath" | grep ID_VIDEO_WIDTH | cut -d"=" -f2` ;
        die "ERROR!!! Can't get \"ID_VIDEO_HEIGHT\"\n\n" unless $i_hsize = `$midentify "$if_filepath" | grep ID_VIDEO_HEIGHT | cut -d"=" -f2` ;
        die "ERROR!!! \$i_wsize\n\n" unless ( $i_wsize = &odd_2_even ($i_wsize) ) ;
        die "ERROR!!! \$i_hsize\n\n" unless ( $i_hsize = &odd_2_even ($i_hsize) ) ;
        $i_aspect = sprintf "%1.2f", $i_wsize /$i_hsize  ;
}


die "ERROR!!! \$ov_wsize\n\n" unless ( $ov_wsize = &odd_2_even ($ov_wsize) ) ;
die "ERROR!!! \$ov_hsize\n\n" unless ( $ov_hsize = &odd_2_even ($ov_hsize) ) ;


## Подгоняем разрешение конечного файла
while ($resizing ne "ok") {
        my $oh = sprintf "%1.0f", $ov_wsize / $i_aspect ;

        if ( $oh > $ov_hsize ) {
                $ov_wsize -= 2 ;
                next ;
        }

        die "ERROR!!! \$oh\n\n" unless ( $ov_hsize = &odd_2_even ($oh) ) ;

        print "Resolution of the output file - " . "$ov_wsize" . "x" . "$ov_hsize" . "\n\n" ;

        $resizing = "ok" ;
}


print "Output file - \"$of_dir/$if_filename\"\n\n" ;
print "Press ENTER to CONTINUE\n" ;
getc(STDIN) ;


## Конвертируем
unless ( `$ffmpeg -i "$if_filepath" -vcodec "$ov_vcodec" -b "$ov_vbitrate" -r "$ov_fps" -s "$ov_wsize"x"$ov_hsize" -aspect "$i_aspect" -acodec "$oa_acodec" -ab "$oa_abitrate" -ar "$oa_frequency" -ac "$oa_channels" "$of_dir/$if_filename"` ) {
        print "GOOD!!! Конвертирование выполнено успешно\n\n" ;
}
else {
        print "ERROR!!! Ошибка при конвертировании\n\n" ;
}


print "Press ENTER to EXIT\n\n" ;
getc(STDIN) ;


exit 0 ;


Объективная критика приветствуется

Скачать
тут или тут
  • 0
  • Diesel
  • 07 ноября 2010, 19:31
  • add twitter 

Комментарии (1) Вконтакте (0) facebook (0)

Комментарии (1)

rss свернуть / развернуть
Интересно, сейчас проверим проверим.
свернуть ветку

Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.