我需要在我的应用程序中播放远程 mp3 文件。我正在使用AVURLAsset
并AVPlayer
做到这一点。一切都很好,但有些文件的长度不正确。我需要正确的长度来显示曲目播放的进度条。
这是长度错误的 mp3 文件: http ://content.mts.stream.ru/files/melody/mp3/3828.mp3
这是我尝试获取轨道长度的方法:
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
Float64 assetDuration = CMTimeGetSeconds(asset.duration);
Float64 itemDuration = CMTimeGetSeconds(item.duration);
两者都是assetDuration
~ itemDuration
45秒。实际曲目长度约为 30 秒。
如何获得 mp3 文件的实际长度?看起来 mp3 标签有错误,因为我的 Mac 上的预览实用程序也说它是 45 秒。然而 iTunes 说它是 30 秒。
我有一个想法,我可以获取 HTTP 响应的内容长度字段并计算轨道大小,但我需要获取比特率。
更新
我更深入并尝试使用 AudioToolbox:
AudioFileID fileID;
OSStatus result = AudioFileOpenURL((__bridge CFURLRef)url, kAudioFileReadPermission, 0, &fileID);
UInt32 bitrate = 0;
UInt32 bitrateSize = sizeof(UInt32);
result = AudioFileGetProperty(fileID, kAudioFilePropertyBitRate, &bitrateSize, &bitrate);
UInt64 size = 0;
UInt32 sizeSize = sizeof(UInt64);
result = AudioFileGetProperty(fileID, kAudioFilePropertyAudioDataByteCount, &sizeSize, &size);
AudioFileClose(fileID);
UInt64 seconds = size / (bitrate / 8);
并再次得到错误的值。所以看起来这个文件有一些编码问题。如果我能得到进一步的结果,我会更新这个问题。