Skip to content

Instantly share code, notes, and snippets.

@araipiyo
Created May 17, 2023 18:41
Show Gist options
  • Save araipiyo/ea27aea05c39dc2cc73cb7053ff8a23a to your computer and use it in GitHub Desktop.
Save araipiyo/ea27aea05c39dc2cc73cb7053ff8a23a to your computer and use it in GitHub Desktop.
Rubyでmp4コンテナを表面的にパースするだけのコード
def atom(file, indent = 0)
return nil if file.eof?
headersize = 8
size = file.read(4).unpack('N')[0]
type = file.read(4)
if size == 1
size = file.read(8).unpack('Q>')[0]
headersize += 8
elsif size == 0
return nil
end
datasize = size - headersize
puts "#{" "*indent}#{size}:#{type}"
data = case type
when "ftyp"
file.read(datasize)
when "moov","trak","edts","minf","dinf","stbl","mvex","mdia"
multiatom(file, datasize, indent + 2)
nil
else
file.seek(datasize, :CUR)
nil
end
if data
disp = data.gsub(/[^[:graph:]]/, '.')
puts "#{" "*(indent+2)}#{disp}"
end
return [size,type,data]
end
def multiatom(file, size, indent = 0)
loop {
return if size == 0
return if file.eof?
(asize, type, data) = atom(file, indent)
return if asize == nil
size -= asize
}
end
def main
file = open(ARGV[0],"rb")
multiatom(file, file.size)
end
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment