cubiccat 07.11.2010 12:01

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

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

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

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

  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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 ;



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

Скачать
тут или тут


Тэги: ffmpeg mp4 mplayer perl
+ 11 -
Похожие Поделиться

cblp 07.11.2010 12:39 #
Где взять midentify? В Убунте такого нет.
cubiccat 07.11.2010 12:55 #
midentify идет вместе с mplayer
Во всяком случае в генту так
derfenix 07.11.2010 12:40 #
Хы, на perl'е таких конвертеров здесь ещё не было :) Плюс!
В качестве дополнения - можно было сделать опциональную возможность задавать битрейт и/или другие параметры тоже через параметры переданные скрипту.
saver 07.11.2010 12:44 #
Если нужны ключи, то можно использовать напрямую ffmpeg (подробности в man ffmpeg, я предпочитаю mencoder), автор сделал правильно, не нужно снова осложнять!
derfenix 07.11.2010 12:50 #
ну пипец как усложнит пара дополнительных параметров.. а лезть править скрипт или вообще ffpeg голый юзать только ради того, чтобы изменить битрейт - вот это действительно осложнение!
cubiccat 07.11.2010 12:54 #
Как с ключами на перле работать пока не разбирался.
Может в будущем реализую.
saver 07.11.2010 13:57 #
Вместо
-vcodec -b -r -s -aspect -acodec -ab -ar -ac
Будет:
-кодек -расширение --непонятная-фиговина --аудио-кодек
Я все правильно понял?
cubiccat 07.11.2010 14:15 #
-vcodec - видеокодек
-b - видеобитрейд
-r - число кадров в секунду
-s - ширина x высота
-aspect - соотношение сторон
-acodec - аудиокодек
-ab - аудиобитрейд
-ar - частота
-ac - число каналов (1 - моно, 2 - стерео)
saver 07.11.2010 14:18 #
Молодец, сарказм понимаешь
Budda40 07.11.2010 14:49 #
А не проще вот этот скрипт http://gnome-look.org/content/show.php/MOUvie+Converter?content=100060 ?
cubiccat 07.11.2010 15:34 #
Честно признаюсь первый раз увидел этот скрипт.
Спасибо. Надо поковырять.
Правда я изначально искал вариант только для консоли, без всяких zenity и т.п.
Чтоб и из консоли можно было пользоваться и к thunar-у прикрутить тоже.
thebeetlebum 07.11.2010 18:54 #
глупый вопрос. Я тоже собираюсь купить телефон, и тестировал кодирование видео на телефон. Далеко не все форматы можно было кодировать в несколько потоков, а меня как обладателя 64 битной машины это несколько огорчает.
Вопрос следующий, можно ли видо файл, порезать на несколько кусков, скажем 4, закодировать, и склеить?О_о
cubiccat 07.11.2010 19:34 #
Ну на счет порезать для ffmpeg можно попробовать опции -t и -ss, может еще какие-то есть.
Для склеивания один человек подсказал такое, но я не проверял
mencoder -oac copy -ovc copy pt1.avi pt2.avi -o video.avi
thebeetlebum 07.11.2010 23:35 #
Мы склеивать будет уже MP4
thebeetlebum 07.11.2010 23:35 #
*будем
derfenix 08.11.2010 00:22 #
А мплееру пофиг. хоть avi, хоть mp4... Всё что поддерживает - всё склеит.