我怎么知道 mp3 文件可以播放多少秒?
How can I known how many seconds can a mp3 file play?
我想从服务器下载歌曲,但我不想下载整首歌,所以我想下载前90秒,如果用户听前80秒,我会要求剩下的这首歌的。否则这首歌的其余部分根本不需要下载。
请求头有一个range
参数,我可以通过最小-最大字节来决定我应该下载哪一首歌曲。
那么,我怎么知道一首歌有多少字节可以播放90秒?
最简单的是你需要知道编码文件的比特率(你可以通过读取文件头来获得)然后乘以得到字节数但是许多 MP3 是用可变比特率编码的,正如马特在他的评论中所说,这使得解决方案非常复杂。
但是,如果您稍微改变一下方法,您可以通过更简单的方式实现类似的效果 - 而不是担心一定的时间长度,只需读取一定数量的字节
只需选择合理数量的字节开始读取,当您接近耗尽此数据时读取文件的其余部分。
1 兆字节可让您播放 60 秒多一点的 MP3 文件,该文件以 128kbs 的固定比特率进行编码 - 它将为您提供大约 30 秒的固定比特率 256kbs 文件,如果是 30-60 秒之间它是可变比特率 (VBR),所以这似乎是一个合理的初始阅读量。
试试这个
-(void)playselectedsong{
AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
self.songPlayer = player;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[songPlayer currentItem]];
[self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == songPlayer && [keyPath isEqualToString:@"status"]) {
if (songPlayer.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (songPlayer.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
[self.songPlayer play];
} else if (songPlayer.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");
}
}
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
// code here to play next sound file
}
我想从服务器下载歌曲,但我不想下载整首歌,所以我想下载前90秒,如果用户听前80秒,我会要求剩下的这首歌的。否则这首歌的其余部分根本不需要下载。
请求头有一个range
参数,我可以通过最小-最大字节来决定我应该下载哪一首歌曲。
那么,我怎么知道一首歌有多少字节可以播放90秒?
最简单的是你需要知道编码文件的比特率(你可以通过读取文件头来获得)然后乘以得到字节数但是许多 MP3 是用可变比特率编码的,正如马特在他的评论中所说,这使得解决方案非常复杂。
但是,如果您稍微改变一下方法,您可以通过更简单的方式实现类似的效果 - 而不是担心一定的时间长度,只需读取一定数量的字节
只需选择合理数量的字节开始读取,当您接近耗尽此数据时读取文件的其余部分。
1 兆字节可让您播放 60 秒多一点的 MP3 文件,该文件以 128kbs 的固定比特率进行编码 - 它将为您提供大约 30 秒的固定比特率 256kbs 文件,如果是 30-60 秒之间它是可变比特率 (VBR),所以这似乎是一个合理的初始阅读量。
试试这个
-(void)playselectedsong{
AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
self.songPlayer = player;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[songPlayer currentItem]];
[self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == songPlayer && [keyPath isEqualToString:@"status"]) {
if (songPlayer.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (songPlayer.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
[self.songPlayer play];
} else if (songPlayer.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");
}
}
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
// code here to play next sound file
}