Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我怎么知道一个mp3文件能播放多少秒?_Ios_Objective C_Macos_Nsdata - Fatal编程技术网

Ios 我怎么知道一个mp3文件能播放多少秒?

Ios 我怎么知道一个mp3文件能播放多少秒?,ios,objective-c,macos,nsdata,Ios,Objective C,Macos,Nsdata,我想从服务器上下载这首歌,但我不想下载整首歌,所以我想下载前90首,如果用户听了前80首,我会要求这首歌的其余部分。否则,这首歌的其余部分根本不需要下载 请求头有一个range参数,我可以传递最小-最大字节来决定我应该下载哪首歌 那么,我怎么知道一首歌可以播放90年代的多少字节呢?最简单的是,你需要知道编码文件的比特率(你可以通过读取文件头获得),然后乘以得到字节数,不管有多少MP3是用可变比特率编码的,正如马特在评论中所说,使解决方案非常复杂 然而,如果你稍微改变一下你的方法,你可以用一种简单

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

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


那么,我怎么知道一首歌可以播放90年代的多少字节呢?

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

然而,如果你稍微改变一下你的方法,你可以用一种简单得多的方法来实现类似的事情——而不是担心一定的时间长度,只需要读取一些字节

只需选择一个合理的字节数进行初始读取,并在即将耗尽这些数据时读取文件的其余部分

1兆字节可以让您获得60秒多一点的固定比特率128kbs编码的MP3文件-它可以让您获得30秒左右的固定比特率256kbs文件,如果它是可变比特率(VBR),则在30-60秒之间,因此这似乎是一个合理的初始读取量。

试试这个

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

}

你不能。mp3的编码方式没有这么简单的公式。你为什么要扭曲你的问题,试试在线流媒体