我怎么知道mp3文件可以播放多少秒?

时间:2015-01-01 02:51:21

标签: ios objective-c macos nsdata

我想从服务器下载歌曲,但我不想下载整首歌曲,所以我想下载前90首,如果用户先听80首,我会请求其余的歌曲。否则这首歌的其余部分根本不需要下载。

请求标头有一个range参数,我可以传递最小 - 最大字节来决定我应该下载哪首歌。

那么,我怎么知道一首歌的字节数可以播放90秒?

2 个答案:

答案 0 :(得分:1)

试试这个

-(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

}

答案 1 :(得分:0)

最简单的是你需要知道编码文件的比特率(通过读取文件头可以得到),然后乘以得到字节数,然而许多MP3用可变比特率编码,如马特在评论中说,解决方案非常复杂。

然而,如果你稍微改变你的方法,你可以用更简单的方式实现类似的东西 - 而不是担心一定的时间长度,只需读取一些字节

只需选择一个合理数量的字节进行初始读取,当您接近耗尽此数据时,请读取文件的其余部分。

1兆字节为您提供了一个超过60秒的MP3文件,其固定比特率为128kbs - 它将为您提供大约30秒的固定比特率256kbs文件,如果它是30-60秒可变比特率(VBR),所以这似乎是最初读取的合理数量。