public bool AddFromMP3Stream(Stream stream) { try { MP3FrameInfo info = new MP3FrameInfo(); info.StreamPosition = stream.Position; info.SampleIndex = TotalSamples; frame = MP3Frame.FromStream(stream); if (frame != null) { info.SampleAmount = frame.SampleCount; info.Size = Convert.ToInt32(stream.Position - info.StreamPosition); TotalSamples += frame.SampleCount; Add(info); return(true); } else { return(false); } } catch (Exception) { return(false); } }
private MP3Frame GetNextFrame(Stream stream) { MP3Frame frame; do { frame = MP3Frame.FromStream(stream, ref _frameBuffer); } while (frame == null); return(frame); }
private MP3Frame ReadNextMP3Frame() { MP3Frame frame = MP3Frame.FromStream(_stream, ref _frameBuffer); if (frame != null && _frameInfoCollection != null) { _frameInfoCollection.PlaybackIndex++; } return(frame); }
private void ParseForMP3Frame(Stream stream) { if (_parsedStream) { return; } MP3Frame frame = null; long offsetOfFirstFrame = 0; while (frame == null && !stream.IsEndOfStream()) { offsetOfFirstFrame = stream.Position; frame = MP3Frame.FromStream(stream); } if (frame == null) { throw new MP3Exception("Could not find any MP3-Frames in the stream."); } XingHeader xingHeader = XingHeader.FromFrame(frame); if (xingHeader != null) { offsetOfFirstFrame = stream.Position; } _inputFormat = new MP3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); //implement VBR? //Prescan stream _frameInfoCollection = new FrameInfoCollection(); while (_frameInfoCollection.AddFromMP3Stream(stream)) { ; } stream.Position = offsetOfFirstFrame; _parsedStream = true; }
public MP3Stream(Stream stream, bool scanStream, int lengthOffset) { int frameLength = 0; if (scanStream) { _frameInfoCollection = new FrameInfoCollection(); } else { _frameInfoCollection = null; } _dataStartIndex = stream.Position; do { _frame = MP3Frame.FromStream(stream); if (_frame == null && stream.IsEndOfStream()) { throw new FormatException("Stream is no MP3-stream. No MP3-Frame was found."); } } while (_frame == null && !stream.IsEndOfStream()); frameLength = _frame.FrameLength; _sampleRate = _frame.SampleRate; XingHeader = XingHeader.FromFrame(_frame); //The first frame can contain a Xingheader if (XingHeader != null) { //Todo: dataInitPosition = stream.Position _dataStartIndex = stream.Position; } _dataLength = stream.Length - _dataStartIndex - lengthOffset; if (scanStream) { stream.Position = _dataStartIndex; PreScanFile(stream); CanSeek = true; } else { CanSeek = false; } stream.Position = _dataStartIndex; /* * bytes * 8 (8bits perbyte) / ms = totalbits / totalms = bits per ms */ if (scanStream) { _bitRate = ((_dataLength * 8.0) / ((double)_frameInfoCollection.TotalSamples / (double)_sampleRate)); } else { _bitRate = ((_frame.BitRate) / 1); } MP3Format = new MP3Format(_sampleRate, _frame.ChannelCount, frameLength, (int)Math.Round(_bitRate)); _converter = new AcmConverter(MP3Format); WaveFormat = _converter.DestinationFormat; //_bytesPerSample = (WaveFormat.BitsPerSample / 8 * WaveFormat.Channels); _pcmDstBuffer = new byte[SamplesPerFrame * WaveFormat.BytesPerBlock * 2]; stream.Position = _dataStartIndex; _stream = stream; }