--- frames.pl 2007/07/19 17:09:18 1 +++ frames.pl 2007/07/21 15:02:51 18 @@ -8,10 +8,19 @@ use GD; use File::Path; +use Getopt::Long; my $tmp = '/tmp/frames'; my $out = '/tmp/frames.avi'; +my $jpeg_q = 100; +my $repeat = 1; +GetOptions( + "jpeg-q=i" => \$jpeg_q, + "repeat=i" => \$repeat, +); + +rmtree $tmp if -e $tmp; mkpath $tmp || die "can't create $tmp: $!"; my $im = new GD::Image( 160, 120 ); @@ -32,29 +41,49 @@ } my @cols = ( + 'fff', '000', 'f00', + '000', '0f0', + '000', '00f', + '000', 'ff0', + '000', '0ff', + '000', 'fff', ); my $frame = 1; +sub save_jpeg { + my ( $path, $q ) = @_; + open(my $fh, '>', $path ) || die "can't open $path: $!"; + print $fh $im->jpeg( $q ) || die "can't save picture $path: $!"; + close($fh) || die "can't close picture $path: $!"; +} + foreach my $c ( @cols ) { - foreach ( 1 .. 16 ) { + foreach ( 1 .. $repeat ) { $im->fill(50,50, col($c) ); - warn "frame $frame\n"; - my $path = sprintf('%s/%03d.jpg', $tmp, $frame++); - open(my $fh, '>', $path) || die "can't open $path: $!"; - print $fh $im->jpeg(100) || die "can't save picture $path: $!"; - close($fh) || die "can't close picture $path: $!"; + my $path = sprintf('%s/%03d.jpg', $tmp, $frame); + save_jpeg( $path, $jpeg_q ); + + foreach my $q ( 1 .. 100 ) { + my $path = sprintf('%s/%03d-q%03d.jpg', $tmp, $frame, $q ); + save_jpeg( $path, $q ); + } + warn "frame $frame $jpeg_q% ", -s $path, " bytes\n"; + $frame++; } } -system("ffmpeg -i $tmp/%03d.jpg -r 16 -vcodec copy -y $out") == 0 or - die "encoding failed: $?"; +my $cmd = "ffmpeg -i $tmp/%03d.jpg -r 16 -y $out"; +warn "## $cmd\n"; +system($cmd) == 0 or die "encoding failed: $?"; + +#rmdir $tmp || die "can't remove $tmp: $!"; -rmdir $tmp || die "can't remove $tmp: $!"; +warn "created $out ", -s $out, " bytes\n";