/// <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; }
/// <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); }