HysteriaPlayer provides useful basic player functionalities.
It provides:
- PlayerItem cache management.
- Pre-buffer next PlayerItem.
Features:
- Supporting both local and remote media.
- Setting up HysteriaPlayer with few blocks, implementing delegates in your
UIView
andUIViewController
subclasses to update UI when player event changed. - Ability to advance next/previous item.
- If player suspended bacause of buffering issue, auto-resume the playback when buffered size reached 5 secs.
- Background playable. (check the background audio mode then everything works)
- Using getHysteriaOrder: to get the index of your PlayerItems.
- Extends long time buffering in background.
- Player modes support: Repeat, RepeatOne, Shuffle.
In part 0, what we want? why HysteriaPlayer?
In part 1, demonstrating how to play remote audios with HysteriaPlayer. (version 2.0.0, a little bit outdated. version 2.1.0 modified some APIs)
In part 2, making a simple player user interface.
In part 3, registering lock screen details and remote controls.
You can download tutorial source code here
If you using CocoaPods, it's easy to install HysteriaPlayer.
Podfile:
platform :ios, 'x.0'
pod 'HysteriaPlayer', '~> x.x.x'
end
Drag HysteriaPlayer.m
, HysteriaPlayer.h
to your project.
Add CoreMedia.framework, AudioToolbox.framework and AVFoundation.framework to your Link Binary With Libraries.
Ability to play the first PlayerItem when your application is resigned active but first PlayerItem is still buffering.
XCode providing GUI checkbox to enable various background modes. Enable Audio and AirPlay, you can find this section from Project -> Capabilities -> Background Modes
.
Implement HysteriaPlayerDelegate
and HysteriaPlayerDataSource
in your own playback configurator model. (It can be an UIViewController
subclass as well but make it a standalone model makes more sense.)
#import "HysteriaPlayer.h"
@interface ViewController : UIViewController <HysteriaPlayerDelegate, HysteriaPlayerDataSource>
There are 4 optional delegates in HysteriaPlayerDelegate
:
@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;
3 optional delegates in HysteriaPlayerDataSource
:
@optional
- (NSUInteger)hysteriaPlayerNumberOfItems;
- (NSURL *)hysteriaPlayerURLForItemAtIndex:(NSUInteger)index preBuffer:(BOOL)preBuffer;
- (void)hysteriaPlayerAsyncSetUrlForItemAtIndex:(NSUInteger)index preBuffer:(BOOL)preBuffer;
If you don't implement hysteriaPlayerNumberOfItems
delegate method, you have to set itemsCount
property to HysteriaPlayer.
And you must implement one of hysteriaPlayerURLForItemAtIndex:preBuffer
or hysteriaPlayerAsyncSetUrlForItemAtIndex:preBuffer
delegate method.
...
- (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];
pausePlayerForcibly:(BOOL)
method telling HysteriaPlayer to/not to force pause the playback(mostly when user tapped play/pause button)
- (IBAction)play_pauseButton:(id)sender
{
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
if ([hysteriaPlayer isPlaying])
{
[hysteriaPlayer pausePlayerForcibly:YES];
[hysteriaPlayer pause];
}else{
[hysteriaPlayer pausePlayerForcibly:NO];
[hysteriaPlayer play];
}
}
switch ([hysteriaPlayer getHysteriaPlayerStatus]) {
case HysteriaPlayerStatusUnknown:
break;
case HysteriaPlayerStatusForcePause:
break;
case HysteriaPlayerStatusBuffering:
break;
case HysteriaPlayerStatusPlaying:
default:
break;
}
Default is cache enabled
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
[hysteriaPlayer enableMemoryCached:NO];
HysteriaPlayer *hysteriaPlayer = [HysteriaPlayer sharedInstance];
[hysteriaPlayer deprecatePlayer];
hysteriaPlayer = nil;
All source code is licensed under the MIT License.
Created by Saiday