public AudioInfo ReadAudioInfo(Stream stream) { try { var mp4 = new Mp4Model(stream); mp4.DescendToAtom("moov", "trak", "mdia", "minf", "stbl", "stts"); var stts = new SttsAtom(mp4.ReadAtom(mp4.CurrentAtom)); var sampleCount = stts.PacketCount * stts.PacketSize; mp4.DescendToAtom("moov", "trak", "mdia", "minf", "stbl", "stsd", "mp4a", "esds"); var esds = new EsdsAtom(mp4.ReadAtom(mp4.CurrentAtom)); if (esds.IsAac) { mp4.Reset(); return(AudioInfo.CreateForLossy("AAC", esds.Channels, (int)esds.SampleRate, sampleCount, CalculateBitRate(mp4.GetChildAtomInfo().Single(atom => atom.FourCc.Equals("mdat", StringComparison.Ordinal)).Size, sampleCount, esds.SampleRate))); } // Apple Lossless files have their own atom for storing audio info if (!mp4.DescendToAtom("moov", "trak", "mdia", "minf", "stbl", "stsd", "alac")) { throw new AudioUnsupportedException("Only AAC and ALAC MP4 streams are supported."); } var alac = new AlacAtom(mp4.ReadAtom(mp4.CurrentAtom)); return(AudioInfo.CreateForLossless( "ALAC", alac.Channels, alac.BitsPerSample, (int)alac.SampleRate, sampleCount)); } catch (EndOfStreamException e) { throw new AudioInvalidException(e.Message); } }
public AudioMetadata ReadMetadata(Stream stream) { var mp4 = new Mp4Model(stream); if (mp4.DescendToAtom("moov", "udta", "meta", "ilst")) { return(new IlstAtomToMetadataAdapter(mp4, mp4.GetChildAtomInfo())); } throw new AudioUnsupportedException("No ilst atom found."); }