Esempio n. 1
0
        /// <summary>
        /// Gets a fragment of track data from the file that is being streamed locally.
        /// </summary>
        /// <param name="trackType">The type of track being requested (video, audio, text)</param>
        /// <param name="bitrate">The bitrate of the track that should be returned.</param>
        /// <param name="timeOffset">The time offset of the fragment of data being requested.</param>
        /// <param name="language">The ISO language code of the track if there is one.</param>
        /// <param name="callback">The callback that will be invoked when the fragment has been retrieved.
        /// The callback will have the stream to the data.</param>
        /// <remarks>The fragment that will be returned will be a moof and mdat pair of boxes from the file.</remarks>
        public override async Task <WebRequestorResponse> GetTrackFragmentStream(ManifestTrackType trackType, uint bitrate, ulong timeOffset, string language)
        {
            if (language == string.Empty)
            {
                language = null;
            }

            var track = this.ManifestTracks
                        .Where(t => t.Type == trackType && t.Bitrate == bitrate && t.Language == language)
                        .SingleOrDefault();

            if (track != null)
            {
                var entry = track.Fragments.TrackFragmentRandomAccessEntries.FirstOrDefault(e => e.Time == timeOffset);

                if (entry != null)
                {
                    ulong moofSize   = 0;
                    ulong mdatSize   = 0;
                    long  moofOffset = 0;

                    using (var fileStream = await StorageFile.OpenStreamForReadAsync())
                    {
                        var reader = new BoxBinaryReader(fileStream);
                        moofOffset = (long)entry.MoofOffset;
                        reader.BaseStream.Seek(moofOffset, SeekOrigin.Begin);

                        moofSize = this.ReadBoxSize(reader);

                        // Run to the end of the moof to get to its mdat box
                        reader.BaseStream.Seek(moofOffset + (long)moofSize, SeekOrigin.Begin);

                        mdatSize = this.ReadBoxSize(reader);

                        // And back to the beginning of the moof so we can read both boxes into the stream
                        reader.BaseStream.Seek(moofOffset, SeekOrigin.Begin);

                        var size     = moofSize + mdatSize;
                        var fragment = reader.ReadBytes((int)size);

                        var stream = new MemoryStream(fragment);
                        return(new WebRequestorResponse(stream, System.Net.HttpStatusCode.OK, null, string.Empty));
                    }
                }
            }
            throw new WebRequestorFailure(System.Net.HttpStatusCode.NotFound, null);
        }
        /// <summary>
        /// Gets a fragment of track data from the file that is being streamed locally.
        /// </summary>
        /// <param name="trackType">The type of track being requested (video, audio, text)</param>
        /// <param name="bitrate">The bitrate of the track that should be returned.</param>
        /// <param name="timeOffset">The time offset of the fragment of data being requested.</param>
        /// <param name="language">The ISO language code of the track if there is one.</param>
        /// <param name="callback">The callback that will be invoked when the fragment has been retrieved.
        /// The callback will have the stream to the data.</param>
        /// <remarks>The fragment that will be returned will be a moof and mdat pair of boxes from the file.</remarks>
        public override async Task<WebRequestorResponse> GetTrackFragmentStream(ManifestTrackType trackType, uint bitrate, ulong timeOffset, string language)
        {
            if (language == string.Empty) language = null;

            var track = this.ManifestTracks
                    .Where(t => t.Type == trackType && t.Bitrate == bitrate && t.Language == language)
                    .SingleOrDefault();

            if (track != null)
            {
                var entry = track.Fragments.TrackFragmentRandomAccessEntries.FirstOrDefault(e => e.Time == timeOffset);

                if (entry != null)
                {
                    ulong moofSize = 0;
                    ulong mdatSize = 0;
                    long moofOffset = 0;

                    using (var fileStream = await StorageFile.OpenStreamForReadAsync())
                    {
                        var reader = new BoxBinaryReader(fileStream);
                        moofOffset = (long)entry.MoofOffset;
                        reader.BaseStream.Seek(moofOffset, SeekOrigin.Begin);

                        moofSize = this.ReadBoxSize(reader);

                        // Run to the end of the moof to get to its mdat box
                        reader.BaseStream.Seek(moofOffset + (long)moofSize, SeekOrigin.Begin);

                        mdatSize = this.ReadBoxSize(reader);

                        // And back to the beginning of the moof so we can read both boxes into the stream
                        reader.BaseStream.Seek(moofOffset, SeekOrigin.Begin);

                        var size = moofSize + mdatSize;
                        var fragment = reader.ReadBytes((int)size);

                        var stream = new MemoryStream(fragment);
                        return new WebRequestorResponse(stream, System.Net.HttpStatusCode.OK, null, string.Empty);
                    }
                }
            }
            throw new WebRequestorFailure(System.Net.HttpStatusCode.NotFound, null);
        }