Objective-C: 如何让AVPlayer一直在后台播放
Objective-C: How to make AVPlayer keep playing in the background
I know that there are a lot questions like mine but nothing is working
for me.
我试图让 AVPlayer
在我退出应用程序时继续播放,我已经实现了以下 Singleton Class
:
.h 文件:
#import <AVFoundation/AVFoundation.h>
#import <Foundation/Foundation.h>
@interface LiveStreamSingleton : NSObject<AVAudioPlayerDelegate>{
}
+(LiveStreamSingleton *)sharedInstance;
-(void)playStream;
-(void)stopStream;
-(bool)status;
@end
.m 文件:
#import "LiveStreamSingleton.h"
static LiveStreamSingleton *sharedInstance = nil;
@interface LiveStreamSingleton (){
AVPlayer *audioPlayer;
}
@end
@implementation LiveStreamSingleton
+ (LiveStreamSingleton*) sharedInstance {
static dispatch_once_t _singletonPredicate;
static LiveStreamSingleton *_singleton = nil;
dispatch_once(&_singletonPredicate, ^{
_singleton = [[super allocWithZone:nil] init];
});
return _singleton;
}
+ (id) allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
-(void)playStream{
//NSError *error = nil;
NSURL *urlStream;
NSString *urlAddress = @"http://198.178.123.23:8662/stream/1/;listen.mp3";
urlStream = [[NSURL alloc] initWithString:urlAddress];
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:urlStream options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
audioPlayer = [AVPlayer playerWithPlayerItem:playerItem];
//This enables background music playing
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer = [AVPlayer playerWithURL:urlStream];
if(!audioPlayer.error){
NSLog(@"Trying to play from singleton!");
[audioPlayer play];
NSLog(@"rate: %f",audioPlayer.rate);
}
}
-(void)stopStream{
NSLog(@"Trying to stop from singleton!");
[audioPlayer pause];
}
-(bool)status{
bool stat;
if(audioPlayer.rate > 0){
stat = true;
}else{
stat = false;
}
return stat;
}
@end
我已经设置了 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
在后台播放,但我在我的 ipad 上试过了,它不起作用。
有什么想法吗?
在 属性 列表 (.plist) 文件中添加一个名为 Required background modes 的键..
如下图..
并在
中添加以下代码
Objective-C
AppDelegate.h
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
AppDelegate.m
在应用程序 didFinishLaunchingWithOptions
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Swift
import AVFoundation
import AudioToolbox
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}
catch {
}
}
}
希望对您有所帮助。
I know that there are a lot questions like mine but nothing is working for me.
我试图让 AVPlayer
在我退出应用程序时继续播放,我已经实现了以下 Singleton Class
:
.h 文件:
#import <AVFoundation/AVFoundation.h>
#import <Foundation/Foundation.h>
@interface LiveStreamSingleton : NSObject<AVAudioPlayerDelegate>{
}
+(LiveStreamSingleton *)sharedInstance;
-(void)playStream;
-(void)stopStream;
-(bool)status;
@end
.m 文件:
#import "LiveStreamSingleton.h"
static LiveStreamSingleton *sharedInstance = nil;
@interface LiveStreamSingleton (){
AVPlayer *audioPlayer;
}
@end
@implementation LiveStreamSingleton
+ (LiveStreamSingleton*) sharedInstance {
static dispatch_once_t _singletonPredicate;
static LiveStreamSingleton *_singleton = nil;
dispatch_once(&_singletonPredicate, ^{
_singleton = [[super allocWithZone:nil] init];
});
return _singleton;
}
+ (id) allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
-(void)playStream{
//NSError *error = nil;
NSURL *urlStream;
NSString *urlAddress = @"http://198.178.123.23:8662/stream/1/;listen.mp3";
urlStream = [[NSURL alloc] initWithString:urlAddress];
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:urlStream options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
audioPlayer = [AVPlayer playerWithPlayerItem:playerItem];
//This enables background music playing
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer = [AVPlayer playerWithURL:urlStream];
if(!audioPlayer.error){
NSLog(@"Trying to play from singleton!");
[audioPlayer play];
NSLog(@"rate: %f",audioPlayer.rate);
}
}
-(void)stopStream{
NSLog(@"Trying to stop from singleton!");
[audioPlayer pause];
}
-(bool)status{
bool stat;
if(audioPlayer.rate > 0){
stat = true;
}else{
stat = false;
}
return stat;
}
@end
我已经设置了 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
在后台播放,但我在我的 ipad 上试过了,它不起作用。
有什么想法吗?
在 属性 列表 (.plist) 文件中添加一个名为 Required background modes 的键..
如下图..
并在
中添加以下代码Objective-C
AppDelegate.h
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
AppDelegate.m
在应用程序 didFinishLaunchingWithOptions
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
Swift
import AVFoundation
import AudioToolbox
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}
catch {
}
}
}
希望对您有所帮助。