ios - 从mp3文件下载仅几秒钟

Eya*_*yal 12 mp3 download ios nsurlsession

我需要下载一个mp3文件,但我只需要歌曲的前20秒(如果歌曲少于20秒,则需要整首歌曲).
这就是我下载整首歌的方式:

    func downloadSong(audioUrl: URL) {

    let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let destinationUrl = documentsDirectoryURL.appendingPathComponent(audioUrl.lastPathComponent)

    URLSession.shared.downloadTask(with: audioUrl, completionHandler: { (location, response, error) -> Void in
        guard let location = location, error == nil else { return }
        do {

            try FileManager.default.moveItem(at: location, to: destinationUrl)
            // song available in destinationUrl

        } catch let error as NSError {

        }
    }).resume()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在20秒后停止下载?我知道我可以下载整首歌然后剪下来,但我想要更高效,特别是如果这首歌很长.

Par*_*was 7

MP3文件分为小块 - 帧.每帧的恒定时间长度为0.026秒.但是一帧的大小(以字节为单位)根据比特率而变化.例如.对于128kbps,它是(通常)417字节和192kbps 626字节.每帧的前4个字节是帧头,其余是音频数据.

引自这里.

每个帧都可以播放.因此,对于20数秒的数据,您需要大约770 frames(20/0.026).因此,下载第一770帧然后取消下载任务.然后播放下载的帧.

或者按大小,首先下载313.5 KB(计算为:(417 Bytes*770)/1024)128kbps文件的数据.您将获得20秒的数据.