douban / DOUAudioStreamer

A Core Audio based streaming audio player for iOS and macOS
BSD 3-Clause "New" or "Revised" License
2.77k stars 557 forks source link

add optional cachedFileURL method to DOUAudioFile Protocol #71

Open cute opened 9 years ago

cute commented 9 years ago

DOUAudioFile.h

@protocol DOUAudioFile <NSObject>

@required

- (NSURL *)audioFileURL;

@optional
- (NSURL *)cachedFileURL;
- (DOUAudioFilePreprocessor *)audioFilePreprocessor;

@end

_DOUAudioRemoteFileProvider


- (instancetype)_initWithAudioFile:(id <DOUAudioFile>)audioFile
{
  self = [super _initWithAudioFile:audioFile];
  if (self) {
    _audioFileURL = [audioFile audioFileURL];

    if ([audioFile respondsToSelector:@selector(cachedFileURL)]) {
        _cachedPath = [audioFile.cachedFileURL path];
        _cachedURL = audioFile.cachedFileURL;
    }else{
        _cachedPath = [[self class] _cachedPathForAudioFileURL:_audioFileURL];
        _cachedURL = [NSURL fileURLWithPath:_cachedPath];
    }

    if ([DOUAudioStreamer options] & DOUAudioStreamerRequireSHA256) {
      _sha256Ctx = (CC_SHA256_CTX *)malloc(sizeof(CC_SHA256_CTX));
      CC_SHA256_Init(_sha256Ctx);
    }

    [self _openAudioFileStream];
    [self _createRequest];
    [_request start];
  }

  return self;
}
scfhao commented 9 years ago

每播放一首歌都会产生一个缓存文件,如果这样自己指定目录,那这个目录就会越来越大,那就需要考虑清除缓存的问题了。

cute commented 9 years ago

@scfhao

可以自己来管理缓存,此策略只是在播放远程媒体的时候才会生效。 播放的时候可以使用缓存的文件来播放,而不需要再次远程读取。 在远程媒体路径随机的情况下,制定缓存的文件名, DOUAudioStreamer默认也生成了缓存文件,是根据URL sha256来命名的。 在updateBufferingStatus里可以判断音频文件是否下载完毕来决定下次是否使用此缓存。

guokai1120 commented 8 years ago

如何取出缓存的文件?可以给解释一下吗?

cute commented 8 years ago

@guokai1120 实现 cachedFileURL方法

@interface MyTrackFile< DOUAudioFile>

@end
@implementation MyTrackFile< DOUAudioFile>

-(NSURL) cachedFileURL
{
      //缓存保存路径
       return [NSURL fileURLWithPath: [NSTemporaryDirectory() stringByAppendingPathComponent:@"foo.mp3"]];
}

@end