11 |
|
|
12 |
my $tmp = '/tmp/frames'; |
my $tmp = '/tmp/frames'; |
13 |
my $out = '/tmp/frames.avi'; |
my $out = '/tmp/frames.avi'; |
14 |
|
my $jpeg_q = 100; |
15 |
|
my $repeat = 16; |
16 |
|
$repeat = 1; # off |
17 |
|
|
18 |
|
rmtree $tmp if -e $tmp; |
19 |
mkpath $tmp || die "can't create $tmp: $!"; |
mkpath $tmp || die "can't create $tmp: $!"; |
20 |
|
|
21 |
my $im = new GD::Image( 160, 120 ); |
my $im = new GD::Image( 160, 120 ); |
48 |
my $frame = 1; |
my $frame = 1; |
49 |
|
|
50 |
foreach my $c ( @cols ) { |
foreach my $c ( @cols ) { |
51 |
foreach ( 1 .. 16 ) { |
foreach ( 1 .. $repeat ) { |
52 |
$im->fill(50,50, col($c) ); |
$im->fill(50,50, col($c) ); |
53 |
warn "frame $frame\n"; |
warn "frame $frame\n"; |
54 |
my $path = sprintf('%s/%03d.jpg', $tmp, $frame++); |
my $path = sprintf('%s/%03d.jpg', $tmp, $frame++); |
55 |
open(my $fh, '>', $path) || die "can't open $path: $!"; |
open(my $fh, '>', $path) || die "can't open $path: $!"; |
56 |
print $fh $im->jpeg(100) || die "can't save picture $path: $!"; |
print $fh $im->jpeg( $jpeg_q ) || die "can't save picture $path: $!"; |
57 |
close($fh) || die "can't close picture $path: $!"; |
close($fh) || die "can't close picture $path: $!"; |
58 |
} |
} |
59 |
} |
} |
60 |
|
|
61 |
system("ffmpeg -i $tmp/%03d.jpg -r 16 -vcodec copy -y $out") == 0 or |
my $cmd = "ffmpeg -i $tmp/%03d.jpg -r 16 -y $out"; |
62 |
die "encoding failed: $?"; |
warn "## $cmd\n"; |
63 |
|
system($cmd) == 0 or die "encoding failed: $?"; |
64 |
|
|
65 |
rmdir $tmp || die "can't remove $tmp: $!"; |
rmdir $tmp || die "can't remove $tmp: $!"; |
66 |
|
|
67 |
|
warn "created $out ", -s $out, " bytes\n"; |