/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.media.mp4.atom.stsd; import java.nio.ByteBuffer; import com.ttProject.util.BufferUtil; import com.ttProject.media.mp4.IAtomAnalyzer; import com.ttProject.media.mp4.atom.stsd.data.Esds; import com.ttProject.nio.channels.IReadChannel; @SuppressWarnings("unused") public abstract class AudioRecord extends Record { private byte[] unknown1 = new byte[6]; private short dataReferenceIndex; private int unknown2; private int unknown3; private short channelCount; private short sampleSize; private short unknown4; private short unknown5; private int sampleRate; private Esds esds; public Esds getEsds() { return esds; } public AudioRecord(String name, int position, int size) { super(name, position, size); } @Override public void analyze(IReadChannel ch, IAtomAnalyzer analyzer) throws Exception { ByteBuffer buffer = BufferUtil.safeRead(ch, 28); buffer.get(unknown1); dataReferenceIndex = buffer.getShort(); unknown2 = buffer.getInt(); // ここのデータhi wordがinnerVersion lo wordがrevisionLevelという情報もあり。 // innerVersionが0でない場合は、sampleRate以降にも情報が16バイトある可能性あり。(未確認) unknown3 = buffer.getInt(); channelCount = buffer.getShort(); sampleSize = buffer.getShort(); unknown4 = buffer.getShort(); unknown5 = buffer.getShort(); sampleRate = buffer.getInt(); // 以下サブタグ(size:4 tag:4 body:x) // esdsの中身を解析するとaacのmediaSequenceHeaderが見えてくる。 // この部分の読み込みは別プログラムにした方がいいと思う。 while(ch.position() < (getSize() + getPosition())) { int position = ch.position(); buffer = BufferUtil.safeRead(ch, 8); byte[] name = new byte[4]; int size = buffer.getInt(); buffer.get(name); String tag = (new String(name)).toLowerCase(); if("esds".equals(tag)) { //esdsのタグ esds = new Esds(position, size); esds.analyze(ch); } // tagがesdsなら読み込んでおきたいところ。 ch.position(position + size); } } public int getChannelCount() { return channelCount; } public int getSampleRate() { return (sampleRate >> 16 & 0xFFFF); } }