public static async Task <ParseResult <Mp3File> > ParseMetadataAsync(IBinaryStream stream) { var streamLength = await stream.GetLengthAsync().ConfigureAwait(false); stream.Position = 0; var id3v2 = (Id3v2)null; if (await Id3v2.IsPointingToHeaderAsync(stream).ConfigureAwait(false)) { id3v2 = await Id3v2.ParseAsync(stream).ConfigureAwait(false); return(ParseResult <Mp3File> .Create(new Mp3File() { Metadata = new Mp3Metadata(id3v2) })); } else { return(ParseResult <Mp3File> .Create(new Mp3File() { Metadata = new Mp3Metadata(null) })); } }
public static async Task SkipAsync(IBinaryStream stream) { stream.Position += 3; var majorVersion = await stream.ReadByteAsync().ConfigureAwait(false); var revision = await stream.ReadByteAsync().ConfigureAwait(false); var flags = await stream.ReadByteAsync().ConfigureAwait(false); var size = Id3v2.DecodeSize(await stream.ReadUInt32Async(ByteOrder.BigEndian).ConfigureAwait(false)); var newStreamPosition = stream.Position + size; if (await stream.GetLengthAsync().ConfigureAwait(false) < newStreamPosition) { newStreamPosition = await stream.GetLengthAsync().ConfigureAwait(false); } stream.Position = newStreamPosition; }
public static async Task <ParseResult <Mpeg4File> > ParseAsync(IBinaryStream stream, ParseOptions options) { try { stream.Position = 4; if (await stream.ReadStringAsync(4) != "ftyp") { return(ParseResult <Mpeg4File> .CreateUnknownFormat()); } var file = new Mpeg4File(); stream.Position = 0; var streamLength = await stream.GetLengthAsync().ConfigureAwait(false); while (stream.Position < streamLength) { file.Boxes.Add(await Mpeg4File.ReadBoxAsync(stream, await stream.GetLengthAsync().ConfigureAwait(false))); } if (options == ParseOptions.Metadata) { var mediaData = file.Contains("mdat") ? file["mdat"] : null; var metadataItems = file.Contains("moov.udta.meta.ilst") ? await MetadataItemsBox.CreateAsync(stream, file["moov.udta.meta.ilst"]).ConfigureAwait(false) : null; var mediaHeader = file.Contains("moov.trak.mdia.mdhd") ? await MediaHeaderBox.CreateAsync(stream, file["moov.trak.mdia.mdhd"]).ConfigureAwait(false) : null; file.Metadata = new Mpeg4Metadata(metadataItems?.Cover, mediaHeader?.Duration, mediaHeader?.TimeScale, mediaData?.Length); } return(ParseResult <Mpeg4File> .Create(file)); } catch (Exception exception) { return(ParseResult <Mpeg4File> .Create(exception)); } }
public static async Task <ParseResult <Mp3File> > ParseFullMetadataAsync(IBinaryStream stream) { var streamLength = await stream.GetLengthAsync().ConfigureAwait(false); stream.Position = 0; var file = new Mp3File(); var id3v2 = await Id3v2.IsPointingToHeaderAsync(stream).ConfigureAwait(false) ? await Id3v2.ParseAsync(stream).ConfigureAwait(false) : null; var collectSamplesResult = await CollectSamplesAsync(stream, streamLength, 1).ConfigureAwait(false); if (collectSamplesResult.Item1.Count == 0) { file.Metadata = new Mp3Metadata(id3v2); return(ParseResult <Mp3File> .Create(file)); } else { var firstFrame = collectSamplesResult.Item1[0]; var contentLength = streamLength - stream.Position; if (collectSamplesResult.Item2 == BitrateType.Constant) { var duration = TimeSpan.FromSeconds(Math.Ceiling((contentLength / firstFrame.Length) * firstFrame.Duration.TotalSeconds)); var bitrate = firstFrame.Bitrate; file.Metadata = new Mp3Metadata(id3v2, bitrate, duration); } else { var xingFrame = await XingFrame.CreateAsync(stream, firstFrame).ConfigureAwait(false); if (xingFrame.FramesCount.HasValue) { var duration = TimeSpan.FromSeconds(xingFrame.FramesCount.Value * firstFrame.SamplesCount / firstFrame.Frequency); var averageBitrate = (UInt32)(contentLength / duration.TotalSeconds) * 8; file.Metadata = new Mp3Metadata(id3v2, averageBitrate, duration); } else { collectSamplesResult = await CollectSamplesAsync(stream, streamLength, null).ConfigureAwait(false); file.Metadata = new Mp3Metadata(id3v2, collectSamplesResult.Item4, collectSamplesResult.Item3); } } return(ParseResult <Mp3File> .Create(file)); } }
public static async Task <ParseResult <Mp3File> > ParseSamplesAsync(IBinaryStream stream) { var streamLength = await stream.GetLengthAsync().ConfigureAwait(false); stream.Position = 0; if (await Id3v2.IsPointingToHeaderAsync(stream).ConfigureAwait(false)) { await Id3v2.SkipAsync(stream).ConfigureAwait(false); } var collectSamplesResult = await CollectSamplesAsync(stream, streamLength, null).ConfigureAwait(false); if (collectSamplesResult.Item1.Count == 0) { return(ParseResult <Mp3File> .CreateUnknownFormat()); } var file = new Mp3File(); file.Type = collectSamplesResult.Item2; file.Samples = collectSamplesResult.Item1; return(ParseResult <Mp3File> .Create(file)); }