Audible Audio: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 10: Line 10:
==== Parsing metadata ====
==== Parsing metadata ====


This following Ruby code works for parsing the metadata on the only sample available. This table starts at 0xbd.
This following Ruby code works for parsing the metadata on the only sample available. This table starts at 0xb8.


   video = File.new(ARGV[0])
   video = File.new(ARGV[0])
   video.read(189) # skip header
 
   (1..19).each { |x|
   video.read(184) # skip header
   sizes = video.read(4).unpack('N')
  puts "Number of entires: #{sizes[0].to_i}"
  video.read(1) # skip
 
  (1..sizes[0].to_i).each { |x|
     sizes = video.read(8).unpack('NN')
     sizes = video.read(8).unpack('NN')
     key = video.read(sizes[0].to_i)
     key = video.read(sizes[0].to_i)

Revision as of 16:37, 19 August 2009

Proprietary container format from audible.com. There is no published specification. It may contain one of five different encodings which are numbered 1 thru 5. 1-3 are rumored to be ACELP.net at varying bitrates. #4 is MP3. #5 is some unknown Sony format.

Parsing metadata

This following Ruby code works for parsing the metadata on the only sample available. This table starts at 0xb8.

 video = File.new(ARGV[0])
 video.read(184) # skip header
 sizes = video.read(4).unpack('N')
 puts "Number of entires: #{sizes[0].to_i}"
 video.read(1) # skip
 (1..sizes[0].to_i).each { |x|
   sizes = video.read(8).unpack('NN')
   key = video.read(sizes[0].to_i)
   value = video.read(sizes[0].to_i+1)
   puts "#{x} key(#{sizes[0].to_i})=#{key} value(#{sizes[0].to_i)=#{value}"
 }

Sample output (stripped):

 13 key(5)=codec value(7)=acelp85
 16 key(10)=HeaderSeed value(10)=1158166611
 18 key(9)=HeaderKey value(43)=3759801365 1641076194 2988088058 4282540117
 19 key(15)=EncryptedBlocks value(5)=39333

Probably a seek table starts at 0x5f8:

 type(32) [1 - meta?, 2 - audio packets, 3 - meta?, 4 - meta?]
 offset(32) [must be relative, as the first entry in the list is always 0]