iOS开发(OC)——音频播放AVPlayer

AVPlayer支持在线播放,使用如下:

1.头文件

#import <AVFoundation/AVFoundation.h>
@property (nonatomic, strong) AVPlayer *player;//播放实例

@property (nonatomic, strong) AVPlayerItem *currentItem;//当前播放的音频

3.初始化

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];//url播放地址
AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:asset];
self.player = [[AVPlayer alloc] init];
[self.player replaceCurrentItemWithPlayerItem:item];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];//设置后台播放
[self.player play];//开始播放

4.播放过程中的相关操作

[self.player pause];//暂停

[self.player play];//继续播放

[self.playerseekToTime:CMTimeMakeWithSeconds(startTime, NSEC_PER_SEC)];//从startTime开始播放,用于进度条滑动操作

self.player.currentTime;//当前时间,这是一个CMTime对象,通过CMTimeGetSeconds(time)返回double类型

self.player.currentItem.asset.duration;//音频总时长,也是一个CMTime对象,通过CMTimeGetSeconds(time)返回double类型,注意self.player.currentItem.duration也是有的,但是在某些设备获取不到,所以不要用self.player.currentItem.duration


5.题外话:当有其他音频插入时,AVPlayer会被中断,并且不会自动恢复播放,比如有电话打过来,可以额外监听电话

#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>

CTCallCenter *callCenter = [[CTCallCenter alloc] init];
__weak typeof(self) weakself = self;
    [self.callCenter setCallEventHandler:^(CTCall * _Nonnull call) {
        if ([[call callState] isEqual:CTCallStateDisconnected]) {//电话挂断(包括拒绝通话和通话完成的挂断)
            if (weakself.status == AudioPlayerStatePlaying) {//如果电话来之前正在播放,恢复播放
                [weakself.player play];
            }
        }
    }];

如果setCategory的时候设置了允许多个声音同时共存,就不会被打断,只是有多个声音同时存在,比如

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:nil];

起作用的是AVAudioSessionCategoryOptionDuckOthers

6.播放状态
可以通过kvo监听

[self.player.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];//记得在不需要的时候remove


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"status"]) {
        AVPlayerItem *item = object;
        if (item.status == 2) {//1成功2失败
           [self.player stop];
        }
    }
}

iOS开发交流群:301058503

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值