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";