gpt4 book ai didi

c# - 如何在不下载整个文件的情况下计算 VBR mp3 的比特率?

转载 作者:太空狗 更新时间:2023-10-29 23:43:39 24 4
gpt4 key购买 nike

我想在下载开始时获取远程 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;

}

最佳答案

有点晚了,但如果有人需要它......

这个代码项目 article有很多关于 MP3 头的良好格式。

  • 找到 XING header 的起始位置。
  • 从第 8 个字节开始是 total frames 的整数(如果存在 将是 4 个字节,Big endian)。

每个 MPEG 帧给出每帧恒定数量的样本,由采样率决定,而不管总的bytes-in-frameX。您可以通过以下计算进行估算:

durationVBR = single_frame_time * total_frames; 

哪里...

single_frame_time = (SampleRate / SamplesPerFrame) * 1000;

SamplesPerFrame 的常量是:

MPEG-1

  • 第 I 层 = 384 个样本。
  • 第二层 = 1152 个样本。
  • 第 III 层 = 1152 个样本。

MPEG-2

  • 第 I 层 = 384 个样本。
  • 第二层 = 1152 个样本。
  • 第 III 层 = 576 个样本。

关于c# - 如何在不下载整个文件的情况下计算 VBR mp3 的比特率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com