just found the easy way… feel free to use the scripts…

requirements: linux, perl, ffmpeg, transcode/avimerge

perl -MCPAN -e shell
install File::Basename
apt-get install ffmpeg transcode libavcodec52

demux_audio [target]
checks all avi-files in the current directory and extracts the raw audio in case mp3 or ac3. optionally you may set target e.g. .. or ../..

mux_audio inputvideo inputaudio [outputvideo]
adds audiostream to existing videofile. checks for both inputs if the duration is matching and asks to step further.
optionally define output videofile, if not set, custom directory name is taken.

demux_audio

#!/usr/bin/perl
#####################################################
## name:    	demux_audio
## desc:    	demux audio from all avi files
##          	decide on mp3 or ac3
## usage:   	copy to path (i.e. /usr/local/bin/)
##          	sudo chmod +x extract
##          	demux_audio [targetdir e.g. ..]
## req:     	ffmpeg
## version: 	0.1
## log:     	0.1 - initial setup
#####################################################
use warnings;
use strict;
use File::Basename;

sub demux {

    	my ($file, $target) = @_;
    	#read avi information
    	my $info_ = `ffmpeg -i $file 2>&1 | egrep "Duration|Audio"`;
    	my @info = split /n/, $info_;
    	my $line;
    	my $duration;
    	my $audio;
    	my @temp;

    	foreach $line (@info) {
            	if($line =~ m/Duration/i) {
                    	@temp = split / /, $line;
                    	$duration = $temp[3];
                    	$duration =~ s/,//;
            	}
            	if($line =~ m/Stream #0.1: Audio/i) {
                    	@temp = split / /, $line;
                    	$audio = $temp[7];
                    	$audio =~ s/,//;;
            	}
    	}

    	@temp = split /./, $file; # take the first part to identify new file.mp3/ac3
    	my $name = $temp[0];
    	#extract raw audio
    	`ffmpeg -i $file -vn -acodec copy $target/$name.$audio 2>/dev/null`;
}

#read files
my @files = <*>;
my $file;
my $ext;

my $target = $ARGV[0];
if(!$target) {
    	$target = "."; #set default
}

foreach $file (@files) {
    	(undef, undef, $ext) = fileparse($file, qr"..*");
    	#now check for *.avi
    	if($ext =~ m/avi/i) {
            	demux($file, $target);
    	}

}

mux_audio

#!/usr/bin/perl
#####################################################
## name:    	mux_audio
## desc:    	mux audio on avi
##
## usage:   	copy to path (i.e. /usr/local/bin/)
##          	sudo chmod +x extract
##          	run: mux_audio
## req:     	ffmpeg, transcode/avimerge
## version: 	0.2
## log:     	0.1 - initial setup
##          	0.2 - use ffmpeg for duration,
##          	avimerge for muxxing
#####################################################
use warnings;
use strict;
use File::Basename;

#convert duration to milliseconds to calc difference later
sub duration2ms {
    	#format is 00:00:00.00
    	my ($tmp) = @_;
    	my ($hours, $minutes, $temp1) = split /:/, $tmp;
    	my ($seconds, $ms) = split /./, $temp1;
    	$ms = int($ms) * 10; #get real milli seconds
    	$ms = $ms + int($seconds) * 1000;
    	$ms = $ms + int($minutes) * 1000 * 60;
    	$ms = $ms + int($hours) * 1000 * 3600;
    	return $ms;
}

#check duration
sub check_duration {
    	my ($file) = @_;
    	my $duration = `ffmpeg -i $file 2>&1 | grep "Duration" | cut -d " " -f 4 - | sed s/,//`;
    	$duration =~ s/n//g;
    	return $duration;
}

#ovideo is not a must, if not set we will use the foldername instead
my $ivideo = $ARGV[0];
my $iaudio = $ARGV[1];
my $ovideo = $ARGV[2];
#check all params
if(!$ivideo or !$iaudio) {
    	print "Missing parameters! Usage: mux_audio   []n";
    	exit(1);
}
if(!$ovideo) { #ok we take the directory above and modify it a bit
    	my $dir = basename(`pwd`);
    	chomp($dir); #remove trailing n
    	$dir =~ s/(XViD)/DL.XViD/i; #(...) makes sure for case insensitive compare, but replace matches
    	$ovideo = "$dir.avi";
#   	print "$ovideon";
#   	exit(1);
}

#now the duration check stuff
my $ivideo_duration = check_duration($ivideo);
my $iaudio_duration = check_duration($iaudio);

print "$ivideo duration: $ivideo_durationn";
print "$iaudio duration: $iaudio_durationn";

my $diff = duration2ms($ivideo_duration) - duration2ms($iaudio_duration);

#ask user what to do
if ($diff != 0) {
    	print "Video differs from Audio by $diff milliseconds. Continue anyway? [Y/n]n";
    	my $input = ;
    	chomp($input);
    	if(lc($input) eq "n") {
            	print "Exiting...n";
            	exit(1);
    	}
}

#do the muxxing stuff - would be that easy huh? ;)
print "Muxing...n";
`avimerge -i $ivideo -o $ovideo -p $iaudio`;
print "Done :)n";
%d bloggers like this: