我想在下载远程mp3文件开始时获取其持续时间的信息。我一开始可以获取帧,但不知道必须读取哪些帧,Xing 或 VBRi。
如何通过读取标签来获取此信息?
MemoryStream ms = new MemoryStream();
waveOut.Play();
long offset = from;
ms.Position = 0;
byte[] decBuffer = new byte[50 * 1024];
while (true)
{
if (paused)
{
waveOut.Stop();
bwProvider.ClearBuffer();
break;
}
lock (LockObj)
{
byte[] readed = Helper.ReadStreamPartially(localStream, offset, 100 * 1024, orders);
if (readed == null)
continue;
ms = new MemoryStream(readed);
}
Mp3Frame frame;
try
{
frame = Mp3Frame.LoadFromStream(ms);
}
catch
{
continue;
}
if (frame == null)
continue;
int decompressed = decompressor.DecompressFrame(frame, decBuffer, 0);
bwProvider.AddSamples(decBuffer, 0, decompressed);
if (Helper.IsBufferNearlyFull(bwProvider))
Thread.Sleep(500);
offset += ms.Position;
}
有点晚了,但如果其他人需要它......
这篇 CodeProject 文章有很多关于 MP3 标头的良好表述。
- 找到 XING 标头的起始位置。
- 第 8 个字节以后是
total frames
的整数(如果存在,则为 4 个字节,大端序)。
每个 MPEG 帧每帧提供恒定数量的样本,由采样率决定,与帧中的总字节数 X 无关。您可以使用以下计算进行估算:
durationVBR = single_frame_time * total_frames;
哪里。。。
single_frame_time = (SampleRate / SamplesPerFrame) * 1000;
SamplesPerFrame
的常量是:
MPEG-1
- 第 I 层 = 384 个样本。
- 第 II 层 = 1152 个样本。
- 第 III 层 = 1152 个样本。
MPEG-2
- 第 I 层 = 384 个样本。
- 第 II 层 = 1152 个样本。
- 第 III 层 = 576 个样本。