예제 #1
0
        /// <summary>
        /// Provides setting of the mp3 frame header used to convert between time per frame and frame number.
        /// </summary>
        /// <param name="header">MP3AudioFrameHeader used to calculate the time each MP3AudioFrame contains.</param>
        public void SetFrameLength(MP3AudioFrameHeader header)
        {
            if (header == null)
            {
                throw new ArgumentNullException("Header");
            }

            ticksPerFrame = header.SampleCount * TimeSpan.TicksPerSecond / header.SamplingRate;
        }
예제 #2
0
        /// <summary>
        /// 获取数据帧长度
        /// </summary>
        /// <returns></returns>
        private int GetAuidoFrameLength(out double playTime)
        {
            playTime = 0;

            byte[] headerBuffer = MP3Buffer.GetRange(0, 4).ToArray();
            //MP3Stream.Read(headerBuffer, 0, headerBuffer.Length);
            ////读取位置回到ff fb
            //MP3Stream.Position = MP3Stream.Position - 4;

            if (headerBuffer[0] != 0xFF)
            {
                Console.WriteLine("没有读取到FF头");

                return(0);
            }

            MP3AudioFrameHeader header = new MP3AudioFrameHeader(headerBuffer);

            int length = 0;
            //每帧采样数
            int frameCount = FrameCountDictionary[header.Version][header.Layer];
            //比特率
            int kbps = KBPSDictionary[header.Version][header.Layer][header.BitrateIndex];
            //采样率
            double khz = KHZDictionary[header.Version][header.SamplingFrequency];

            switch (header.Layer)
            {
            //11 -> Layer 1, L1
            case "11":
                break;

            //10 -> Layer 2, L2
            //01 -> Layer 3, L3
            case "10":
            case "01":
                length   = (int)Math.Floor(((frameCount / 8 * kbps) / khz)) + (header.Padding == "0" ? 0 : 1);
                playTime = frameCount / khz;
                break;

            default:
                break;
            }

            return(length);
        }