查找流 (mp3) 信息(持续时间、比特率)
Posted
技术标签:
【中文标题】查找流 (mp3) 信息(持续时间、比特率)【英文标题】:Find stream (mp3) info (duration,bitrate) 【发布时间】:2013-10-22 15:37:12 【问题描述】:我正在寻找一种方法来从 Windows Phone 7 平台上的 C# 音频流中获取比特率和持续时间。
首先,我尝试通过使用公式计算得到它(假设我可以有流的持续时间,我将作为数字下载)
比特率 = ((((文件大小)/duration)/1024)*8)
我可以从 webclient 下载流中的音频 (mp3) 并存储或播放它,但我想先检查一些规则,对于这些规则,我需要可以使用某种公式在没有持续时间和字节的情况下计算的比特率因为音频流可能具有可变比特率并且更深的计算将是错误的。
另外,有时,部分流是在应用程序中下载的,所以我没有完整的文件大小和持续时间,所以比特率计算不正确,所以我需要一个确定的方法。
那么我如何在不实际播放的情况下使用 Windows Phone 7 框架的某些功能从流中获取比特率或持续时间?
【问题讨论】:
我在 Nuget 的 wp7 项目中使用了 NAudio 对 NVorbis 的支持。我用这段代码来获取比特率(重要的)和时间和字节using (Mp3FileReader reader = new Mp3FileReader(data)) using (WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(reader)) file_bytes = (long)pcmStream.Length; file_time = (int)pcmStream.TotalTime.TotalSeconds; file_rate = (int)pcmStream.WaveFormat.AverageBytesPerSecond;
但每次我运行它时它都会崩溃,即使我只打电话:using (Mp3FileReader reader = new Mp3FileReader(data))
我还在 Nuget 的 wp7 项目中使用了 id3,代码使用:Mp3Stream mp3 = new Mp3Stream(ex.Result, Mp3Permissions.Read)) //Get mp3 stream info file_bytes = (long)ex.Result.Length; file_time = (int)(mp3.Audio.Duration.TotalSeconds); file_rate = (int)(mp3.Audio.Bitrate);
,但 192kbps 歌曲的 file_rate 为 48kbps(小 4 倍),其他 192 首歌曲显示为 128,为什么这没有给出正确的结果?
我找到了一种更优雅的方法来检索实际持续时间,然后我可以找到比特率(我会说更接近 Microsoft sdk),即:AudioTrack temp = new AudioTrack(new Uri(file_in + ext + ".mp3", UriKind.Relative), name_in, null, null, null, null, EnabledPlayerControls.None); file_time = Convert.ToInt32(temp.Duration.TotalSeconds); file_rate = Convert.ToInt32(Math.Round((decimal)((file_bytes / file_time) / constant.bit) * 8));
但我得到“COM Exception was unhandled”
【参考方案1】:
似乎唯一的解决方案是,我编写的一个编写良好的类可以读取歌曲标题(mp3 容器)的字节并提取持续时间和比特率等细节。
我发现另一个不符合我要求的优雅解决方案是先播放并使用 AudioBackroundAgent 获取这些细节,然后我们可以对文件大小和轨道持续时间进行数学运算以获得比特率!
【讨论】:
以上是关于查找流 (mp3) 信息(持续时间、比特率)的主要内容,如果未能解决你的问题,请参考以下文章