Hysteria Player
HysteriaPlayer提供有用的基础播放器功能。
它提供了
- 播放项缓存管理。
- 预缓冲下一个播放项。
功能
- 支持本地和远程媒体。
- 使用几个block设置HysteriaPlayer,在你的
UIView
和UIViewController
子类中实现委托来更新UI,以在播放器事件更改时更新UI。 - 支持前进/后退功能。
- 如果播放器由于缓冲问题而暂停,当缓冲大小达到5秒时自动恢复播放。
- 可在后台播放。(检查后台音频模式,然后一切正常)
- 使用getHysteriaOrder:来获取您的PlayerItems的索引。
- 扩展后台长时间缓冲。
- 支持播放模式:重复、重复一次、随机。
教程
在第一部分中,我们需要什么?为什么选择HysteriaPlayer?
在第二部分中,展示如何使用HysteriaPlayer播放远程音频。 (版本2.0.0,有些过时。 版本2.1.0修改了一些API)
在第三部分中,制作一个简单的播放器用户界面。
您可以从这里下载教程源代码
安装
CocoaPods
如果您使用CocoaPods,安装HysteriaPlayer很简单。
Podfile
platform :ios, 'x.0'
pod 'HysteriaPlayer', '~> x.x.x'
end
手动安装
将库导入到您的项目中
将HysteriaPlayer.m
和HysteriaPlayer.h
拖拽到您的项目中。
添加框架
将CoreMedia.framework、AudioToolbox.framework和AVFoundation.framework添加到您的“链接二进制框架(libraries)”设置中。
将提供的point1sec.mp3文件复制到您的“支持文件(supporting files)”中
当您的应用被暂停但仍处于活动状态时,能够播放第一个PlayerItem,即使第一个PlayerItem仍在缓冲。
音频播放的后台模式
Xcode提供GUI复选框以启用各种后台模式。启用音频和AirPlay,您可以在项目 -> 功能 -> 后台模式
中找到此部分。
如何使用
代理,DataSource
在您自己的播放配置器模型中实现HysteriaPlayerDelegate
和HysteriaPlayerDataSource
。(它也可以是UIViewController
的子类,但将其作为独立的模型更有意义。)
#import "HysteriaPlayer.h"
@interface ViewController : UIViewController <HysteriaPlayerDelegate, HysteriaPlayerDataSource>
HysteriaPlayerDelegate
中有4个可选代理。
@optional
- (void)hysteriaPlayerWillChangedAtIndex:(NSUInteger)index;
- (void)hysteriaPlayerCurrentItemChanged:(AVPlayerItem *)item;
- (void)hysteriaPlayerRateChanged:(BOOL)isPlaying;
- (void)hysteriaPlayerDidReachEnd;
- (void)hysteriaPlayerCurrentItemPreloaded:(CMTime)time;
- (void)hysteriaPlayerDidFailed:(HysteriaPlayerFailed)identifier error:(NSError *)error;
- (void)hysteriaPlayerReadyToPlay:(HysteriaPlayerReadyToPlay)identifier;
HysteriaPlayerDataSource
中有3个可选代理。
@optional
- (NSUInteger)hysteriaPlayerNumberOfItems;
- (NSURL *)hysteriaPlayerURLForItemAtIndex:(NSUInteger)index preBuffer:(BOOL)preBuffer;
- (void)hysteriaPlayerAsyncSetUrlForItemAtIndex:(NSUInteger)index preBuffer:(BOOL)preBuffer;
如果您不实现hysteriaPlayerNumberOfItems
代理方法,您必须将itemsCount
属性设置到HysteriaPlayer。
并且您必须实现hysteriaPlayerURLForItemAtIndex:preBuffer
或hysteriaPlayerAsyncSetUrlForItemAtIndex:preBuffer
代理方法之一。
设置
...
- (void)setupHyseteriaPlayer
{
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
hysteriaPlayer.delegate = self;
hysteriaPlayer.datasource = self;
}
- (NSUInteger)hysteriaPlayerNumberOfItems
{
return self.itemsCount;
}
- (NSURL *)hysteriaPlayerURLForItemAtIndex:(NSUInteger)index preBuffer:(BOOL)preBuffer
{
return [[NSURL alloc] initFileURLWithPath:[localMedias objectAtIndex:index]];
}
代码片段
获取工作项中项的索引
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
NSNumber *order = [hysteriaPlayer getHysteriaOrder:[hysteriaPlayer getCurrentItem]];
获取播放项的时间尺度
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
NSDictionary *dict = [hysteriaPlayer getPlayerTime];
double durationTime = [[dict objectForKey:@"DurationTime"] doubleValue];
double currentTime = [[dict objectForKey:@"CurrentTime"] doubleValue];
获取播放器状态
switch ([hysteriaPlayer getHysteriaPlayerStatus]) {
case HysteriaPlayerStatusUnknown:
break;
case HysteriaPlayerStatusForcePause:
break;
case HysteriaPlayerStatusBuffering:
break;
case HysteriaPlayerStatusPlaying:
default:
break;
}
禁用播放项缓存
默认情况下启用缓存
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
[hysteriaPlayer enableMemoryCached:NO];
如果我不再需要播放器实例怎么办?
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
[hysteriaPlayer deprecatePlayer];
hysteriaPlayer = nil;
已知问题
如果你要在iOS 8及以下版本上播放HTTP实时流。(iOS 9+没有问题,无需担心)
在启动HysteriaPlayer时必须设置的属性之一。
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
hysteriaPlayer.skipEmptySoundPlaying = YES;
许可证
所有源代码均采用MIT许可证。
作者
由 Saiday 创建