mp32dao.pl
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. #!/usr/bin/perl
  2. # mp32dao.pl version 0.2 10/03/1999
  3. use Audio::Wav;
  4. use Audio::Tools::Time;
  5. use strict;
  6. my $wav = new Audio::Wav;
  7. my ($count, $totalsamples, $divided, $rounded, $remainder);
  8. my %tracks;
  9. my @name = split(///, $0);
  10. my $name = pop(@name);
  11. print "-------- MP3-to-DAO Helper Script ---------n";
  12. print "Usage: $name [tocfile]n";
  13. my $tocfile = $ARGV[0];
  14. unless ($tocfile) {
  15.     $tocfile = "cd.toc";
  16.     print "No toc file specified, using default "cd.toc"n";
  17. }
  18. while (<*>) {
  19.     chomp;
  20.     if (/.mp3$/i) {
  21.     $count++;
  22.     $count = sprintf("%02d", $count);
  23.     $tracks{$count} = $_;
  24.     }
  25. }
  26. $count || die "No mp3 files found!n";
  27. open (TOC, ">$tocfile") || die "Couldn't open $tocfile for write!n";
  28. my @tracksort = sort {$a <=> $b} keys %tracks;
  29. my $samplestart = 0;
  30. my $totaltracks =  scalar(@tracksort);
  31. for (@tracksort) {
  32.     my $infile = quotemeta($tracks{$_});
  33.     unless(-e "$_.wav") {    system("mpg123 -w $_.wav -v $infile") }
  34.         else { print "$_.wav exists, skipping mp3 decoden" }
  35.     my $read = $wav->read( "$_.wav" );
  36.     my $audio_bytes = $read -> length();
  37.     my $time = new Audio::Tools::Time 44100, 16, 2;
  38.     my $sample = $time -> bytes_to_samples( $audio_bytes );
  39.     print TOC "// Track $_n";
  40.     print TOC "TRACK AUDIOn";
  41.     print TOC "TWO_CHANNEL_AUDIOn";
  42.     print TOC "FILE "$_.wav" ";
  43.     print TOC "$samplestartn";
  44.     $totalsamples = $sample - $samplestart;
  45.     $divided = $totalsamples / 588; 
  46.     $rounded = int($divided) * 588;
  47.     $remainder = $totalsamples - $rounded;
  48.     print "Need to pad up $remainder samplesn";
  49.     if (($remainder != 0) && ($_ != $totaltracks)) { 
  50. my $nextfile = $_ + 1;
  51. $nextfile = sprintf("%02d", $nextfile);
  52. print TOC "FILE "$nextfile.wav" ";
  53. print TOC "0 $remaindernn";
  54. $samplestart = $remainder;
  55. }
  56. }
  57. print "Finished writing TOC file. You may now burn the CD usingnntcdrdao write $tocfilenn";
  58. close (TOC);
  59. exit;
  60. sub seconds_to_cd_time {
  61.     my $seconds = shift;
  62.     my ($minutes, $frames);
  63.     my $minute_increment = int($seconds / 60);
  64.     if ($minute_increment) {
  65.         $seconds = $seconds - ($minute_increment * 60);
  66.         $minutes = $minutes + $minute_increment;
  67.         }
  68.     my $decimal = $seconds - int($seconds);
  69.     if ($decimal) {
  70.         $frames = int($decimal * 75);
  71.         }
  72.     return sprintf ("%02d:%02d:%02d", $minutes, $seconds, $frames);
  73. }
  74. __END__
  75. =head1 NAME
  76. mp32dao - prepare a set of mp3 files to be burned directly to a CD using cdrdao
  77. =head1 SYNOPSIS
  78. B<mp32dao> [ F<tocfile> ]
  79. =head1 DESCRIPTION
  80. mp32dao requires the following:
  81. =over 8
  82. =item *
  83. Perl 5
  84. =item *
  85. Audio::Wav Perl module
  86. Audio::Tools::Time Perl module
  87. =item *
  88. cdrdao
  89. =item *
  90. mpg123
  91. =back
  92. =head1 DESCRIPTION
  93. This script was written to facilitate the burning of DAO CD's
  94. from a set of mp3 files. cdrdao does a good job of burning
  95. DAO on Linux, but you need a Table of Contents (TOC) such as
  96. the type that are stored on a CD in order to make it work. 
  97. This script grabs the sample data out of the wave file headers
  98. and writes the TOC correctly to make each track a multiple of
  99. 588 samples, by "stealing" samples from the next track, thus
  100. avoiding having to pad the track with zero bytes, causing a
  101. pop between tracks.
  102. For instance, if you have stored your latest live music performance
  103. in several mp3 files for convenience, but you want the CD to be
  104. burned without the 2 second "pre-gap" between each file, you would
  105. need to use this script to generate the TOC with the precise file
  106. times to ensure continuity.
  107. =head1 USAGE
  108. Run this script in a directory containing your mp3 files. (you will
  109. need to have 650+ megabytes free to hold the wave files)
  110. It will convert all the mp3's to wave format using mpg123, then
  111. will write a TOC suitable for burning a CD with cdrdao.
  112. =head1 BUGS
  113. Make sure your mp3's are titled appropriately to be listed in numeric
  114. order, I.E.
  115. F<01_first_file.mp3>
  116. F<02_second_file.mp3>
  117. F<03_third_file.mp3>
  118. etc... 
  119. This script will write the CD in the order it finds the files in the directory
  120. list!
  121. =head1 AUTHOR
  122. Joe Stewart <mp32dao@httptech.com>
  123. =head1 LICENSE
  124. This program is released under the GNU Public License.