[paranoia] splitting sound files?

Brad Harvell brad at whatzit.org
Wed Feb 14 17:16:43 PST 2001



i haven't heard of a program that actually does such a thing, but it is
possible. one would copy out the last 'slice' in the file, then truncate()
the original file, continue until managable size.

not that i suggest you use it if you care about your file, which in
this case you do, but here is a quick script that is sposed to be
able to do this.. and yes, it's poorly written. if i knew someone who
wrote a decent one, i'd sure say so :/

i did test this on a 700k file,splitting into 64k chunks, and
it did work... reassembly matched the original.. so, as long as you
have chunksize free, it'll work...

'./slice.pl termcap 64' creates the following files:
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0000
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0001
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0002
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0003
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0004
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0005
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0006
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0007
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0008
-rw-rw-r--    1 root     root        65536 Feb 14 18:14 termcap.0009
-rw-rw-r--    1 root     root        45485 Feb 14 18:14 termcap.0010

another possible issue, seek/truncate probly won't work if you file is
over 2gigs long..

#!/usr/bin/perl

if ($#ARGV < 1) {
        print "usage: $0 <filename> <chunksize(KB)>\n";
}
($infile, $chunksize) = @ARGV;
$chunksize *= 1024;
open(F, $infile) or die "can't open $infile: $!";
@st = stat(F);
$size = $st[7];
$chunks = $size / $chunksize;
printf "%s is %d bytes, %f chunks\n", $infile, $size, $chunks;
print "press enter to continue, control-c to exit\n";
$junk = <STDIN>;

$seek = 0;
$chunknum = 0;
while ($seek < $size) {
        push(@chunks, $seek);
        printf "%s.%04d will be from %d to %d\n", $infile, $chunknum, $seek,
                $seek + $chunksize;
        $seek += $chunksize;
        $chunknum++;
}
print "press enter to continue, control-c to exit\n";
$junk = <STDIN>;

$chunknum--;
while ($chunknum > -1) {
        $outfile = sprintf("%s.%04d", $infile, $chunknum);
        $pos = $chunks[$chunknum];
        printf "writing to %s from %s\n", $outfile, $pos;
        seek(F, $pos, 0) or die "Can't seek: $!";
        open(OUT, ">$outfile") or die "can't write $outfile: $!";
        while (read(F,$buf,1024) > 0) {
                print OUT $buf or die "can't write to $outfile: $!";
        }
        close OUT;
        truncate($infile, $pos) or die "Can't truncate $infile: $0";
        $chunknum--;
}
close F;

On Wed, Feb 14, 2001 at 05:02:13PM -0600, Christopher Jones wrote:
> Ok. This is good. I didn't even know about the head command, though I knew
> about the others. But I am a bit unsure about this... the point is to cut, not
> copy parts of the file. Looking at the commands quoted here, I see that dd
> copies, not cuts, big.wav. 
> 
> The point is, given -very- limited hd space, not to effectively double the file
> by duplicating the whole thing in bits. So when I make part0.wav, big.wav
> should get smaller. 
> 
> I haven't looked into xwave, but in my searching around I found what sounds like
> the command-line equivalent, called soundgrab. But again, this copies a part of
> the file-- doesn't cut it.   
> 
> On Wed, 14 Feb 2001, you wrote:
> > On 2001-02-14 08:29 -0500, Dale E Martin wrote:
> > 
> > > If you prefer something with a GUI, and the capability to listen to what
> > > you're splitting, I've used "xwave" with mixed results in the past.  I used
> > > it once to take a tape I had sampled and split it back into individual
> > > songs.  With such a large .wav file, it crashed on me a couple of times,
> > > and refused to start correctly a couple of times, but eventually I got it
> > > to work.
> > 
> > Yes. Xwave segfaults if you try to cut a block that contains the
> > last sample.
> > 
> > -- 
> > André Majorel <amajorel at teaser.fr>
> > http://www.teaser.fr/~amajorel/
> > 
> > --- >8 ----
> > List archives:  http://www.xiph.org/archives/
> > Paranoia homepage: http://www.xiph.org/paranoia/
> > To unsubscribe from this list, send a message to 'paranoia-request at xiph.org'
> > containing only the word 'unsubscribe' in the body.  No subject is needed.
> > Unsubscribe messages sent to the list will be ignored/filtered.
> 
> --- >8 ----
> List archives:  http://www.xiph.org/archives/
> Paranoia homepage: http://www.xiph.org/paranoia/
> To unsubscribe from this list, send a message to 'paranoia-request at xiph.org'
> containing only the word 'unsubscribe' in the body.  No subject is needed.
> Unsubscribe messages sent to the list will be ignored/filtered.

--- >8 ----
List archives:  http://www.xiph.org/archives/
Paranoia homepage: http://www.xiph.org/paranoia/
To unsubscribe from this list, send a message to 'paranoia-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.



More information about the Paranoia mailing list