View Code? Open in Web Editor
NEW
简单灵活的iOS音频播放组件。基于AVPlayer,支持本地和远程音频播放,具有缓存、耳机线控、锁屏和控制中心信息展示、单曲顺序随机播放、倍速播放、歌词同步等音频播放器功能,DFPlayer封装了缓冲条、进度条、播放暂停按钮、下一首按钮、上一首按钮、播放模式按钮、歌词同步的tableview等UI控件,一行代码布局即可实现相应功能。
License: MIT License
Objective-C 99.60%
Ruby 0.40%
dfplayer's People
Contributors
dfplayer's Issues
后台播放时候,点击暂停,过一会播放,进度条和当前时间显示会跳动,再回到正确的当前时间
当点上一首或下一首时,内存一直在涨,下不来,有歌词的歌曲尤为明显
操作步骤如下:
1 - 使用DF播放一个MP3
2 - 切到后台, 使用其他播放器中断DF的播放
3 - 暂停其他播放器的播放, 回到DF的前台
大约 20s后才会执行到, NSLog(@"----------------------:结束打断"); 这里
(void)df_playerAudioBeInterrupted:(NSNotification *)notification {
NSInteger InterruptionType = [[notification.userInfo objectForKey:AVAudioSessionInterruptionTypeKey] integerValue];
switch (InterruptionType) {
case AVAudioSessionInterruptionTypeBegan: {
NSLog(@"----------------------:开始打断");
}
break;
case AVAudioSessionInterruptionTypeEnded: {
NSLog(@"----------------------:结束打断");
}
break;
default:
break;
}
你好,感谢大神的分享。功能齐全,提个小建议,可以再做些模块解耦么?UI 组件和业务逻辑做拆分,分层分模块,方便高度定制或者只用其中小部分功能,哈哈。
可以加入停止键,按停止键的时候进度条和时间重置?
谢谢
iPhoneX 真机 上滑动进度条时会来回跳
设置这个方法后,时间进度条不会自动更新了。一直为0
DFPlayer().shared().category在Swift里面被转化成了NSString类型,而Swift里面AVAudioSessionCategory是一个枚举类型
这样造成了AF的冲突。我不明白为什么你不改个名称呢?
我这边是一个录音播放,上传,然后回显的逻辑。
在我的录音功能中修改了
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil];
然后DFPlayer中因为是在初始化的时候设置的这个Category
所以在录音开启后,DFPlayer中的Category没有改变,因此建议在播放的时候重置一下这个
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil];
if ([DFPlayerTool networkStatus] == DFPlayerNetworkStatusUnknown ||
[DFPlayerTool networkStatus] == DFPlayerNetworkStatusNotReachable){
if (cachePath){//有缓存,播放缓存
[self loadPlayerItemWithURL:[NSURL fileURLWithPath:cachePath]];
}else{//无缓存,提示联网
/// 这里有个逻辑漏洞, 前一个音频缓存完毕可以播放, 若此时断网, 则播放下一个音频的时候, 会播放第一个缓存完毕的音频
[self loadPlayerItemWithURL:self.currentAudioModel.audioUrl];
[self df_getStatusCode:DFPlayerStatusNoNetwork];
}
}
1.写了暂停,再播放列表其他经常会无法暂停掉上一个播放的音频 ,同时播放好几个
2.想要显示当前正在播放的时间,这个代理方法有时候执行有时候不执行- (void)df_player:(DFPlayer *)player progress:(CGFloat)progress currentTime:(CGFloat)currentTime{
3.返回上个界面有时候还会播放,-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.player df_pause];
[self.player df_deallocPlayer];
}
这样写也不管用
播放音频,再播放别的视频,音频被打断,再重新播放音频,通知栏上面的播放按钮不可点击,音频的信息也不能正常的显示。
An AVPlayerItem cannot be associated with more than one instance of AVPlayer
大神您好, 我看了您的demo 或许是因为太喜欢的缘故 所以平时总拿出来看看, 目前我在做音频的项目,准备用DFPlayer 但是我发现了两个bug 希望得到您的回复
1): 快速(能多快就多快,暴力测试)点击下一曲的时候 出现了crash
日志:*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[DFPlayerLyricsTableview _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:usingPresentationValues:]: row (0) beyond bounds (0) for section (0).'
*** First throw call stack:
2):还是快速点击切换歌曲 控制台会很大频率出现如下log
Task <...>.<1> load failed with error Error Domain=NSURLErrorDomain Code=-999
然后卡屏 过一会才能继续播放,
我在网上查了资料 猜测可能是线程堵塞的问题
//是否需要耳机线控功能
[DFPlayer shareInstance].isRemoteControl = NO;
耳机线控功能设置为NO后,进行后台进行播放,然后打开其它的音乐播放软件播放音乐,再切换到我的软件播放音乐,然后退出到后台进行播放,到这一步都是正常的,等到这一首播放完成要播放下一首时,不播放了,点击进行前台,又可以播放了;
之前这个问题就一直存在了,到后台播放下一首时播放不了,
我设置[DFPlayer shareInstance].isRemoteControl = YES;时是没有问题的,我现在不需要显示锁屏的控制台,所以设置为NO,但是就出现了上面的问题,希望能看一下,尽快给我一个回复,谢谢。
快速切换歌曲,会导致某首歌曲创建大小为0的缓存.mp3文件.再次播放该歌曲,会直接读取缓存文件,触发错误.
1.播放状态
当不循环播放的时候,一个音频播放完成,播放器的状态没有改变为 播放结束,还是播放中的状态
2.释放播放器
df_deallocPlayer方法里面没有重置当前播放的model,这个不好说是问题,可以当成记录最近播放的音频
Cannot remove an observer <DFPlayer 0x2811e1700> for the key path "status" from <AVPlayerItem 0x282ff5220> because it is not registered as an observer.
(null)
_playerItem removeObserver的时候发生的崩溃,这种崩溃怎么来查呢。涉及到的具体代码:
(void)setPlayerItem:(AVPlayerItem *)playerItem{
if (_playerItem == playerItem) {
return;
}
if (_playerItem) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
[_playerItem removeObserver:self forKeyPath:DFStatusKey];
[_playerItem removeObserver:self forKeyPath:DFLoadedTimeRangesKey];
[_playerItem removeObserver:self forKeyPath:DFPlaybackBufferEmptyKey];
[_playerItem removeObserver:self forKeyPath:DFPlaybackLikelyToKeepUpKey];
}
_playerItem = playerItem;
if (playerItem) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (df_playerDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
[playerItem addObserver:self forKeyPath:DFStatusKey options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:DFLoadedTimeRangesKey options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:DFPlaybackBufferEmptyKey options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:DFPlaybackLikelyToKeepUpKey options:NSKeyValueObservingOptionNew context:nil];
}
}