Esempio n. 1
0
        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)
                }));
            }
        }
Esempio n. 2
0
File: Id3v2.cs Progetto: Venzz/Venz
        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;
        }
Esempio n. 3
0
        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));
            }
        }
Esempio n. 4
0
        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));
            }
        }
Esempio n. 5
0
        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));
        }