views:

854

answers:

4

I need a script or cmd line tool get an mp3 length in milliseconds. The files are 64 kbits mono cbr encoded with lame.

(I looked for a libmad for ruby, my language of choice, but found nothing noteworthy...)

+2  A: 

http://id3lib-ruby.rubyforge.org/ ? This page has the code you need.

jacob
that is fantastic!!! Sooo COOOl!!!Thanks a lot jacob
luca
@luca: you might consider *accepting* jacob's answer if it has helped you :)
Adam Bernier
right, I'm new to stackoverflow and didn't know this accepting thing..
luca
A: 

Try exiftool:

$ sudo apt-get install libimage-exiftool-perl

$ exiftool "Stone Sour-Stone Sour-Bother.mp3"

ExifTool Version Number         : 6.93
File Name                       : Stone Sour-Stone Sour-Bother.mp3
Directory                       : .
File Size                       : 6 MB
File Modification Date/Time     : 2006:05:15 19:09:52
File Type                       : MP3
MIME Type                       : audio/mpeg
MPEG Audio Version              : 1
Audio Layer                     : 3
Audio Bitrate                   : 128000
Sample Rate                     : 44100
Channel Mode                    : Joint Stereo
MS Stereo                       : On
Intensity Stereo                : Off
Copyright Flag                  : False
Original Media                  : True
Emphasis                        : None
Album                           : Stone Sour
Artist                          : Stone Sour
Comment                         : *** / Foobar2000: MPC->MP3
Genre                           : Rock
Title                           : Bother
Track                           : 08
Recording Time                  : 2002
User Defined Text               : (sub-genre) Alt Metal
Year                            : 2002
Duration                        : 0:06:03.67 (approx)
John Feminella
does it calculate it or is it stored in the metadata?
luca
A: 

I know ffmpeg can do this easily:

ffmpeg -i file.mp3 2>&1|sed -n "s/.*Duration: \([^,]*\).*/\1/p"

Unfortunately, I don't know any Ruby library that handles this.

Matthew Flaschen
A: 
def self.get_audio_length(filepath)
  pipe = "ffmpeg -i "+ filepath.to_s+" 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"
  command = `#{pipe}`
  if command =~ /([\d][\d]):([\d][\d]):([\d][\d]).([\d]+)/
    #convert the result to only secs
    duration = ($2.to_i * 60) + $3.to_i
  end
  #return and array containing the seconds and the human readable time length, ["6453","03:54"]
  return "#{duration.to_s},#{$2}:#{$3}".split(",")
end
nukturnal