private void ParseForMp3Frames(Stream stream, bool enableSeeking) { Mp3Frame frame = null; long offsetOfFirstFrame = 0; stream = new BufferedStream(stream); if (enableSeeking) { while (ID3v2.SkipTag(stream)) { /* skip all id3 tags (see https://github.com/filoe/cscore/issues/63) * there are some files with multiple id3v2 tags * not sure whether this is according to the id3 specification but we have to handle it anyway * as long as the SkipTag method returns true, another id3 tag has been found */ } } while (frame == null) { if (enableSeeking && stream.IsEndOfStream()) { break; } if (enableSeeking) { offsetOfFirstFrame = stream.Position; } frame = Mp3Frame.FromStream(stream); } if (frame == null) { throw new Exception("Could not find any MP3-Frames in the stream."); } if (enableSeeking) { XingHeader xingHeader = XingHeader.FromFrame(frame); if (xingHeader != null) { offsetOfFirstFrame = stream.Position; } } _inputFormat = new Mp3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); //Prescan stream if (enableSeeking) { _frameInfoCollection = new FrameInfoCollection(); while (_frameInfoCollection.AddFromMp3Stream(stream)) { } stream.Position = offsetOfFirstFrame; } }
private void ParseForMp3Frames(Stream stream, bool enableSeeking) { Mp3Frame frame = null; long offsetOfFirstFrame = 0; ID3v2.SkipTag(stream); while (frame == null && !stream.IsEndOfStream()) { offsetOfFirstFrame = stream.Position; frame = Mp3Frame.FromStream(stream); } if (frame == null) { throw new Exception("Could not find any MP3-Frames in the stream."); } if (stream.CanSeek) { XingHeader xingHeader = XingHeader.FromFrame(frame); if (xingHeader != null) { offsetOfFirstFrame = stream.Position; } } _inputFormat = new Mp3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); //todo: implement VBR //Prescan stream if (enableSeeking) { _frameInfoCollection = new FrameInfoCollection(); while (_frameInfoCollection.AddFromMp3Stream(stream)) { } stream.Position = offsetOfFirstFrame; } }
/// <summary> /// Initializes a new instance of the <see cref="FlacFile" /> class. /// </summary> /// <param name="stream">Stream which contains flac data which should be decoded.</param> /// <param name="scanFlag">Scan mode which defines how to scan the flac data for frames.</param> /// <param name="onscanFinished"> /// Callback which gets called when the pre scan processes finished. Should be used if the /// <paramref name="scanFlag" /> argument is set the <see cref="FlacPreScanMode.Async" />. /// </param> public FlacFile(Stream stream, FlacPreScanMode scanFlag, Action <FlacPreScanFinishedEventArgs> onscanFinished) { if (stream == null) { throw new ArgumentNullException(); } if (!stream.CanRead) { throw new ArgumentException("Stream is not readable.", "stream"); } _stream = stream; _closeStream = true; //skip ID3v2 while (ID3v2.SkipTag(stream)) { } //read fLaC sync var beginSync = new byte[4]; int read = stream.Read(beginSync, 0, beginSync.Length); if (read < beginSync.Length) { throw new EndOfStreamException("Can not read \"fLaC\" sync."); } if (beginSync[0] == 0x66 && beginSync[1] == 0x4C && //Check for 'fLaC' signature beginSync[2] == 0x61 && beginSync[3] == 0x43) { //read metadata List <FlacMetadata> metadata = FlacMetadata.ReadAllMetadataFromStream(stream).ToList(); Metadata = metadata.AsReadOnly(); if (metadata.Count <= 0) { throw new FlacException("No Metadata found.", FlacLayer.Metadata); } var streamInfo = metadata.First(x => x.MetaDataType == FlacMetaDataType.StreamInfo) as FlacMetadataStreamInfo; if (streamInfo == null) { throw new FlacException("No StreamInfo-Metadata found.", FlacLayer.Metadata); } _streamInfo = streamInfo; _waveFormat = CreateWaveFormat(streamInfo); Log.Verbose("Flac StreamInfo found -> WaveFormat: " + _waveFormat); Log.Verbose("Flac-File-Metadata read."); } else { throw new FlacException("Invalid Flac-File. \"fLaC\" Sync not found.", FlacLayer.OutSideOfFrame); } //prescan stream if (scanFlag != FlacPreScanMode.None) { var scan = new FlacPreScan(stream); scan.ScanFinished += (s, e) => { onscanFinished?.Invoke(e); }; scan.ScanStream(_streamInfo, scanFlag); _scan = scan; } }