下载时播放音频文件

Posted

技术标签:

【中文标题】下载时播放音频文件【英文标题】:Playing audio file while I download it 【发布时间】:2013-08-12 13:24:40 【问题描述】:

我正在尝试播放部分下载的文件(我希望音频在有足够的下载数据时开始播放)。

我尝试了以下方法:

self.mutableData = nil;
self.mutableData = [NSMutableData data];
self.mutableData.length = 0;

GTMHTTPFetcher *fetcher =
[[self driveService].fetcherService fetcherWithURLString:song.filePath];

[fetcher setReceivedDataBlock:^(NSData *dataReceivedSoFar) 
    [self.mutableData appendData:dataReceivedSoFar];

    if (!self.audioPlayer.playing && self.mutableData.length > 1000000)
    
        self.audioPlayer = nil;
        self.audioPlayer = [[AVAudioPlayer alloc] initWithData:self.mutableData error:nil];
        [self.audioPlayer play];
    
];

[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) 
    if (error == nil) 
    
        NSLog(@"NSURLResponse: %@", fetcher.response.);
     
    else 
    
        NSLog(@"An error occurred: %@", error);
    
];

但它开始播放前 1-3 秒,然后应用程序要么崩溃,要么反复播放 1-3 秒,直到下载完成,然后播放整首歌曲。

我可以通过AVPlayer 以某种方式实现这一点,或者解决这个问题吗?

【问题讨论】:

您找到解决方案了吗?我有Data 的流在下载完成之前播放,但我无法弄清楚。 xD 【参考方案1】:

AVAudioPlayer 无法播放已打开以供写入/下载的文件,但 AVPlayer 可以。切换到 AVPlayer。

【讨论】:

这个答案缺乏细节,但我认为它不值得删除......总比没有好,不是吗? @ArtOfWarfare 不过也没什么。这是一年前发布的另一个答案的劣质副本!【参考方案2】:

要流式传输音频,您应该使用AVPlayer 或Audio Queue Services。

initWithData 不适用于此目的。下载完整文件后即可使用initWithData

【讨论】:

好的,我知道,但是如果我无法获得流媒体的直接链接怎么办?这是谷歌驱动器的问题,所以我的另一个解决方案是开始下载到设备,然后开始播放。你有什么建议吗?

以上是关于下载时播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章

当从 uri 播放视频或音频时,它是流式传输还是完全下载并播放?

如何快速播放下载的音频文件

从 url 下载时如何播放音频?

如何下载播放音频

在反应组件中播放 s3 音频并下载文件

将音频文件下载到文件管理器需要从本地路径播放