Audible Audio: Difference between revisions
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 | 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( | |||
(1.. | 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
- Company: Audible.com
- Samples: http://samples.mplayerhq.hu/audible/
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]