获取 mp3 文件指定时间范围的字节范围位置

Posted

技术标签:

【中文标题】获取 mp3 文件指定时间范围的字节范围位置【英文标题】:Get byte range positions for a specified time range of an mp3 file 【发布时间】:2016-01-04 22:19:01 【问题描述】:

我希望能够确定 NSData 压缩 mp3 文件的片段开始和结束的字节位置。

例如,如果我正在使用 1 分钟长和 1000000 字节的 AVPlayer(或任何播放器)播放 mp3 文件,我想知道文件中大约有多少字节发生 30 秒标记,那么 40 秒标记发生了多少字节。

请注意,由于 mp3 文件被压缩,我不能只将字节分成两半来确定 30 秒标记。

如果这不能用 Swift/Objective-C 来完成,你知道这个判断是否可以用任何编程语言来完成吗?谢谢!

【问题讨论】:

你需要字节位置在数据包边界还是在中间ok? 嗯,我不熟悉数据包边界。我在任何时候都需要字节位置(例如我的问题中的 60 秒 mp3 中的 40 秒),而不仅仅是中间。我希望能够确定任何 mp3 文件中任何一秒的字节位置。不一定要准确,但需要在几秒钟内准确。 您可以将字节分成两半以获得接近 30 秒标记的内容,甚至(在某种程度上)使用 VBR。但是你需要对秒/偏移映射做什么? 谢谢@RhythmicFistman,你是对的。事实证明我有一个不同的问题要解决。我将发布一个简短的解释作为答案。 【参考方案1】:

原来我有一个不同的问题要解决。我试图在几秒钟的准确度内估计特定时间的字节位置,例如 32:45 长播客剧集的 4:29 点。

我使用了一个函数来计算大概的字节位置:

startTimeBytesPosition = (startTimeInSeconds / episodeDuration) * episodeFileSize

该功能对某些剧集来说就像一个魅力,但对于其他剧集,生成的开始时间会延迟大约 30-40 秒。

事实证明,这种不准确是因为某些 mp3 在一开始就包含元数据,而存储在元数据中的图像文件可能是 +500KB,所以我根据任何带有图像文件的剧集的字节位置计算时间将被关闭大约 500KB(在这种情况下转换为大约 30-40 秒)。

为了解决这个问题,我首先确定 mp3 文件中元数据的字节大小,然后用它来抵消近似函数:

startTimeBytesPosition = metadataBytesOffset + (startTimeInSeconds / episodeDuration) * episodeFileSize

到目前为止,这段代码似乎在几秒钟内准确地根据字节位置估算时间方面做得很好。

我应该注意,这是假设图像的元数据将始终出现在 mp3 文件的开头,我不知道是否会始终如此。

【讨论】:

CoreAudio AudioFileStream API 应该能够帮助您确定音频数据的真正起点。

以上是关于获取 mp3 文件指定时间范围的字节范围位置的主要内容,如果未能解决你的问题,请参考以下文章

连接/合并日期范围内的 mp3 文件

Linux常用命令汇总-cut

UnicodeDecodeError:“ascii”编解码器无法解码位置 13 中的字节 0xe2:序数不在范围内(128)

UnicodeDecodeError:“ascii”编解码器无法解码位置 13 中的字节 0xe2:序数不在范围内(128)

在c#中以指定的半径获取经纬度的范围

Linux命令之提取行指定范围内容cut