#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;

my ($input, $copy, $vbitrate, $abitrate, $width, $height, $stereo, $print);
my ($title, $timestamp, $cmdline);

Getopt::Long::Configure('bundling');
GetOptions('i|input=s' => \$input
          ,'c|copy' => \$copy
          ,'v|vbitrate=i' => \$vbitrate
          ,'a|abitrate=i' => \$abitrate
          ,'w|width=i' => \$width
          ,'h|height=i' => \$height
          ,'s|stereo' => \$stereo
          ,'p|print' => \$print);

if (!defined $input)
{
    $0 =~ s#.*/##;
    print <<EOD
FLV video converter script
Usage: $0 -i <inputfile> -c | -v <vbitrate> -a <abitrate> -f -s -p

Arguments:
   -i     Input video file
   -c     Copy bitrate and screen aspect ratio
   -v     Bitrate of video in kbps (default=192, overrides -c)
   -a     Bitrate of audio in kbps (default=64, overrides -c)
   -w     Width of video (default=480, overrides -c)
   -h     Height of video (default=360, overrides -c)
   -s     Indicate if audio should be in stereo (default=disabled, overrides -c)
   -p     Indicate if commands should be printed (default=disabled)

You can also use these longer command line parameters:
  --input, --copy, --vbitrate, --abitrate, --width, --height, --stereo, --print
EOD
;
    exit;
}

if ($copy)
{
    my $info = `avconv -i "$input" 2>&1`;
    $abitrate = $1 if !defined $abitrate && $info =~ m#Stream.*?Audio.*?(\d+) kb/s#i;
    $vbitrate = $1 - $abitrate if !defined $vbitrate && $info =~ m#Duration.*?bitrate: (\d+) kb/s#i;
    $vbitrate /= 1.5 if $info !~ m#Stream.*?Video.*?h264#i; # h264 does a good job, bitrate can be lower
    $width    = $1 if !defined $width && $info =~ m#Stream.*?Video.*?\b(\d+)x\d+#i;
    $height   = $1 if !defined $height && $info =~ m#Stream.*?Video.*?\b\d+x(\d+)#i;
    $stereo   = 1 if !defined $stereo && $info =~ m#Stream.*?Audio.*?stereo#i;
}

$vbitrate   = 384 if !defined $vbitrate;
$abitrate   =  96 if !defined $abitrate;
$width      = 480 if !defined $width;
$height     = 360 if !defined $height;
$stereo     =   2 if !defined $stereo;
$stereo     =   3 - $stereo;

$print      =   0 if !defined $print;

($title = $input) =~ s#^(.*/)?(.*?)\.\w{3,5}$#$2#; # comment
my ($sec,$min,$hour, $day,$month,$year) = localtime(time);
$month++; $year += 1900;
$timestamp = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $month, $day, $hour, $min, $sec);

# Build avconv command line
$width = 268;
$height = 148;
$cmdline  = "nice -n 19 avconv -threads 2 -i \"$input\" -strict experimental -metadata creation_time=\"$timestamp\" ";
$cmdline .= "-vcodec libx264 -s ${width}x${height} ";
$cmdline .= "-g 50 -keyint_min 25 -coder 1 -subq 5 -sc_threshold 40 ";
$cmdline .= "-b ${vbitrate}k ";
$cmdline .= "-acodec aac -ac $stereo ";
$cmdline .= "-ab ${abitrate}k ";
$cmdline .= "-qcomp 1 -partitions +parti4x4+partp8x8+partb8x8 -i_qfactor 0.71 -crf 30 -y -f mp4 ";
$cmdline .= "\"$title.flv\"";

if ($print)
{ print $cmdline, "\n"; }
else
{ system($cmdline); }
