--- frames.pl 2007/07/19 20:17:06 2 +++ frames.pl 2007/10/01 20:48:54 35 @@ -8,11 +8,22 @@ use GD; use File::Path; +use Getopt::Long; my $tmp = '/tmp/frames'; my $out = '/tmp/frames.avi'; -my $jpeg_q = 10; +my $jpeg_q = 100; +my $repeat = 1; +my $vary_jpeg_q = 0; +$repeat = 16; +my $audio = '-i adpcm.wav -acodec adpcm_ms -ar 22050'; + +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 ); @@ -33,29 +44,52 @@ } 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( $jpeg_q ) || 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 ); + + if ( $vary_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 -vcodec mjpeg $audio -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";