Exemplo n.º 1
0
 public Mp3Reader(FileInfo file)
 {
     _file       = file;
     _fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 65536);
     // Analyze keyframes data
     AnalyzeKeyFrames();
     _firstFrame = true;
     // Process ID3v2 header if present
     ProcessID3v2Header();
     // Create file metadata object
     _fileMeta = CreateFileMeta();
     // MP3 header is length of 32 bits, that is, 4 bytes
     // Read further if there's still data
     if (_fileStream.Length - _fileStream.Position > 4)
     {
         // Look to next frame
         SearchNextFrame();
         // Save position
         long pos = _fileStream.Position;
         // Read header...
         // Data in MP3 file goes header-data-header-data...header-data
         Mp3Header header = ReadHeader();
         // Set position
         _fileStream.Position = pos;
         // Check header
         if (header != null)
         {
             CheckValidHeader(header);
         }
         else
         {
             throw new NotSupportedException("No initial header found.");
         }
     }
 }
Exemplo n.º 2
0
        private Mp3Header ReadHeader()
        {
            Mp3Header header = null;

            while ((header == null) && ((this._fileStream.Length - this._fileStream.Position) > 4L))
            {
                try
                {
                    byte[] buffer = new byte[4];
                    this._fileStream.Read(buffer, 0, 4);
                    int data = (((buffer[0] << 0x18) | (buffer[1] << 0x10)) | (buffer[2] << 8)) | buffer[3];
                    header = new Mp3Header(data);
                }
                catch (IOException exception)
                {
                    log.Error("MP3Reader ReadTag", exception);
                    return(header);
                }
                catch (Exception)
                {
                    this.SearchNextFrame();
                }
            }
            return(header);
        }
Exemplo n.º 3
0
        private Mp3Header ReadHeader()
        {
            Mp3Header header = null;

            while (header == null && (_fileStream.Length - _fileStream.Position) > 4)
            {
                try
                {
                    byte[] buffer = new byte[4];
                    _fileStream.Read(buffer, 0, 4);
                    header = new Mp3Header(buffer);
                }
                catch (IOException ex)
                {
#if LOGGING
                    log.Error("MP3Reader ReadTag", ex);
#endif
                    break;
                }
                catch (Exception)
                {
                    SearchNextFrame();
                }
            }
            return(header);
        }
Exemplo n.º 4
0
 public KeyFrameMeta AnalyzeKeyFrames()
 {
     lock (this._syncLock)
     {
         if (this._frameMeta == null)
         {
             List <long>   list  = new List <long>();
             List <double> list2 = new List <double>();
             this._dataRate = 0;
             long   num      = 0L;
             int    num2     = 0;
             long   position = this._fileStream.Position;
             double item     = 0.0;
             this._fileStream.Position = 0L;
             this.ProcessID3v2Header();
             this.SearchNextFrame();
             while (this.HasMoreTags())
             {
                 Mp3Header header = this.ReadHeader();
                 if ((header == null) || (header.FrameSize == 0))
                 {
                     break;
                 }
                 long num5 = this._fileStream.Position - 4L;
                 if ((num5 + header.FrameSize) > this._fileStream.Length)
                 {
                     break;
                 }
                 list.Add(num5);
                 list2.Add(item);
                 num  += header.BitRate / 0x3e8;
                 item += header.FrameDuration;
                 this._fileStream.Position = num5 + header.FrameSize;
                 num2++;
             }
             this._fileStream.Position  = position;
             this._duration             = (long)item;
             this._dataRate             = (int)(num / ((long)num2));
             this._posTimeMap           = new Dictionary <long, double>();
             this._frameMeta            = new KeyFrameMeta();
             this._frameMeta.Duration   = this._duration;
             this._frameMeta.Positions  = new long[list.Count];
             this._frameMeta.Timestamps = new int[list2.Count];
             this._frameMeta.AudioOnly  = true;
             for (int i = 0; i < this._frameMeta.Positions.Length; i++)
             {
                 this._frameMeta.Positions[i]  = (int)list[i];
                 this._frameMeta.Timestamps[i] = (int)list2[i];
                 this._posTimeMap.Add(list[i], list2[i]);
             }
         }
         return(this._frameMeta);
     }
 }
Exemplo n.º 5
0
 private void CheckValidHeader(Mp3Header header)
 {
     switch (header.SampleRate)
     {
     case 0x1589:
     case 0x2b11:
     case 0x5622:
     case 0xac44:
         return;
     }
     throw new NotSupportedException("Unsupported sample rate: " + header.SampleRate);
 }
Exemplo n.º 6
0
        /// <summary>
        /// Check if the file can be played back with Flash. Supported sample rates are 44KHz, 22KHz, 11KHz and 5.5KHz
        /// </summary>
        /// <param name="header"></param>
        private void CheckValidHeader(Mp3Header header)
        {
            switch (header.SampleRate)
            {
            case 44100:
            case 22050:
            case 11025:
            case 5513:
                // Supported sample rate
                break;

            default:
                throw new NotSupportedException("Unsupported sample rate: " + header.SampleRate);
            }
        }
Exemplo n.º 7
0
        public bool HasMoreTags()
        {
            Mp3Header header = null;

            while (header == null && (_fileStream.Length - _fileStream.Position) > 4)
            {
                try
                {
                    byte[] buffer = new byte[4];
                    _fileStream.Read(buffer, 0, 4);
                    header = new Mp3Header(buffer);
                }
                catch (IOException ex)
                {
#if LOGGING
                    log.Error("MP3Reader HasMoreTags", ex);
#endif
                    break;
                }
                catch (Exception)
                {
                    SearchNextFrame();
                }
            }

            if (header == null)
            {
                return(false);
            }

            if (header.FrameSize == 0)
            {
                // TODO find better solution how to deal with broken files...
                // See APPSERVER-62 for details
                return(false);
            }

            if (_fileStream.Position + header.FrameSize - 4 > _fileStream.Length)
            {
                // Last frame is incomplete
                _fileStream.Position = _fileStream.Length;
                return(false);
            }

            _fileStream.Position = _fileStream.Position - 4;
            return(true);
        }
Exemplo n.º 8
0
 public Mp3Reader(FileInfo file)
 {
     this._file       = file;
     this._fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 0x10000);
     this.AnalyzeKeyFrames();
     this._firstFrame = true;
     this.ProcessID3v2Header();
     this._fileMeta = this.CreateFileMeta();
     if ((this._fileStream.Length - this._fileStream.Position) > 4L)
     {
         this.SearchNextFrame();
         long      position = this._fileStream.Position;
         Mp3Header header   = this.ReadHeader();
         this._fileStream.Position = position;
         if (header == null)
         {
             throw new NotSupportedException("No initial header found.");
         }
         this.CheckValidHeader(header);
     }
 }
Exemplo n.º 9
0
        public bool HasMoreTags()
        {
            Mp3Header header = null;

            while ((header == null) && ((this._fileStream.Length - this._fileStream.Position) > 4L))
            {
                try
                {
                    byte[] buffer = new byte[4];
                    this._fileStream.Read(buffer, 0, 4);
                    int data = (((buffer[0] << 0x18) | (buffer[1] << 0x10)) | (buffer[2] << 8)) | buffer[3];
                    header = new Mp3Header(data);
                }
                catch (IOException exception)
                {
                    log.Error("MP3Reader HasMoreTags", exception);
                    break;
                }
                catch (Exception)
                {
                    this.SearchNextFrame();
                }
            }
            if (header == null)
            {
                return(false);
            }
            if (header.FrameSize == 0)
            {
                return(false);
            }
            if (((this._fileStream.Position + header.FrameSize) - 4L) > this._fileStream.Length)
            {
                this._fileStream.Position = this._fileStream.Length;
                return(false);
            }
            this._fileStream.Position -= 4L;
            return(true);
        }
Exemplo n.º 10
0
        public KeyFrameMeta AnalyzeKeyFrames()
        {
            lock (_syncLock)
            {
                if (_frameMeta != null)
                {
                    return(_frameMeta);
                }

#if !NET_1_1
                List <long>   positionList  = new List <long>();
                List <double> timestampList = new List <double>();
#else
                ArrayList positionList  = new ArrayList();
                ArrayList timestampList = new ArrayList();
#endif
                _dataRate = 0;
                long   rate    = 0;
                int    count   = 0;
                long   origPos = _fileStream.Position;
                double time    = 0;
                _fileStream.Position = 0;
                ProcessID3v2Header();
                SearchNextFrame();
                while (this.HasMoreTags())
                {
                    Mp3Header header = ReadHeader();
                    if (header == null)
                    {
                        // No more tags
                        break;
                    }

                    if (header.FrameSize == 0)
                    {
                        // TODO find better solution how to deal with broken files...
                        // See APPSERVER-62 for details
                        break;
                    }

                    long pos = _fileStream.Position - 4;
                    if (pos + header.FrameSize > _fileStream.Length)
                    {
                        // Last frame is incomplete
                        break;
                    }

                    positionList.Add(pos);
                    timestampList.Add(time);
                    rate += header.BitRate / 1000;
                    time += header.FrameDuration;
                    _fileStream.Position = pos + header.FrameSize;
                    count++;
                }
                // restore the pos
                _fileStream.Position = origPos;

                _duration = (long)time;
                _dataRate = (int)(rate / count);
#if !NET_1_1
                _posTimeMap = new Dictionary <long, double>();
#else
                _posTimeMap = new Hashtable();
#endif
                _frameMeta            = new KeyFrameMeta();
                _frameMeta.Duration   = _duration;
                _frameMeta.Positions  = new long[positionList.Count];
                _frameMeta.Timestamps = new int[timestampList.Count];
                _frameMeta.AudioOnly  = true;
                for (int i = 0; i < _frameMeta.Positions.Length; i++)
                {
                    _frameMeta.Positions[i]  = (int)positionList[i];
                    _frameMeta.Timestamps[i] = (int)timestampList[i];
                    _posTimeMap.Add(positionList[i], timestampList[i]);
                }
                return(_frameMeta);
            }
        }
Exemplo n.º 11
0
        public ITag ReadTag()
        {
            lock (_syncLock)
            {
                if (_firstFrame)
                {
                    // Return file metadata as first tag.
                    _firstFrame = false;
                    return(_fileMeta);
                }

                Mp3Header header = ReadHeader();
                if (header == null)
                {
                    return(null);
                }

                int frameSize = header.FrameSize;
                if (frameSize == 0)
                {
                    // TODO find better solution how to deal with broken files...
                    // See APPSERVER-62 for details
                    return(null);
                }

                if (_fileStream.Position + frameSize - 4 > _fileStream.Length)
                {
                    // Last frame is incomplete
                    _fileStream.Position = _fileStream.Length;
                    return(null);
                }

                _tag          = new Tag(IOConstants.TYPE_AUDIO, (int)_currentTime, frameSize + 1, null, _prevSize);
                _prevSize     = frameSize + 1;
                _currentTime += header.FrameDuration;
                byte[] buffer = new byte[_tag.BodySize];
                //ByteBuffer body = ByteBuffer.Allocate(_tag.BodySize);
                byte tagType = (byte)((IOConstants.FLAG_FORMAT_MP3 << 4) | (IOConstants.FLAG_SIZE_16_BIT << 1));
                switch (header.SampleRate)
                {
                case 44100:
                    tagType |= (byte)(IOConstants.FLAG_RATE_44_KHZ << 2);
                    break;

                case 22050:
                    tagType |= (byte)(IOConstants.FLAG_RATE_22_KHZ << 2);
                    break;

                case 11025:
                    tagType |= (byte)(IOConstants.FLAG_RATE_11_KHZ << 2);
                    break;

                default:
                    tagType |= (byte)(IOConstants.FLAG_RATE_5_5_KHZ << 2);
                    break;
                }
                tagType |= (header.IsStereo ? IOConstants.FLAG_TYPE_STEREO : IOConstants.FLAG_TYPE_MONO);

                /*
                 * body.Put(tagType);
                 * body.PutInt(header.Data);
                 * byte[] buffer = new byte[frameSize - 4];
                 * _fileStream.Read(buffer, 0, buffer.Length);
                 * body.Put(buffer);
                 * body.Flip();
                 * _tag.Body = body.ToArray();
                 */
                buffer[0] = tagType;
                Array.Copy(header.Data, 0, buffer, 1, 4);
                _fileStream.Read(buffer, 5, frameSize - 4);
                _tag.Body = buffer;
                return(_tag);
            }
        }
Exemplo n.º 12
0
        public ITag ReadTag()
        {
            lock (this._syncLock)
            {
                if (this._firstFrame)
                {
                    this._firstFrame = false;
                    return(this._fileMeta);
                }
                Mp3Header header = this.ReadHeader();
                if (header == null)
                {
                    return(null);
                }
                int frameSize = header.FrameSize;
                if (frameSize == 0)
                {
                    return(null);
                }
                if (((this._fileStream.Position + frameSize) - 4L) > this._fileStream.Length)
                {
                    this._fileStream.Position = this._fileStream.Length;
                    return(null);
                }
                this._tag          = new Tag(IOConstants.TYPE_AUDIO, (int)this._currentTime, frameSize + 1, null, this._prevSize);
                this._prevSize     = frameSize + 1;
                this._currentTime += header.FrameDuration;
                byte[] buffer     = new byte[this._tag.BodySize];
                byte   num2       = (byte)((IOConstants.FLAG_FORMAT_MP3 << 4) | (IOConstants.FLAG_SIZE_16_BIT << 1));
                int    sampleRate = header.SampleRate;
                if (sampleRate == 0x2b11)
                {
                    num2 = (byte)(num2 | ((byte)(IOConstants.FLAG_RATE_11_KHZ << 2)));
                }
                else if (sampleRate != 0x5622)
                {
                    if (sampleRate != 0xac44)
                    {
                        goto Label_0163;
                    }
                    num2 = (byte)(num2 | ((byte)(IOConstants.FLAG_RATE_44_KHZ << 2)));
                }
                else
                {
                    num2 = (byte)(num2 | ((byte)(IOConstants.FLAG_RATE_22_KHZ << 2)));
                }
                goto Label_0171;
Label_0163:
                num2 = (byte)(num2 | ((byte)(IOConstants.FLAG_RATE_5_5_KHZ << 2)));
Label_0171:
                num2      = (byte)(num2 | (header.IsStereo ? IOConstants.FLAG_TYPE_STEREO : IOConstants.FLAG_TYPE_MONO));
                buffer[0] = num2;
                int data = header.Data;
                buffer[1] = (byte)(0xff & (data >> 0x18));
                buffer[2] = (byte)(0xff & (data >> 0x10));
                buffer[3] = (byte)(0xff & (data >> 8));
                buffer[4] = (byte)(0xff & data);
                this._fileStream.Read(buffer, 5, frameSize - 4);
                this._tag.Body = buffer;
                return(this._tag);
            }
        }