使用AVPlayer实现在线音频播放注意问题
//(oneplayer为单例)
+(OnePlayer*)onePlayer
{
static OnePlayer * player = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
player = [[OnePlayer alloc]init];
});
return player;
}
//初始化
//url初始化
-(OnePlayer*)initWithMyUrl:(NSURL*)url
{
[self isCurrentPlayingUrl:url];
if (_isPlaying) {
[self pause];
}
[self replaceCurrentItemWithPlayerItem:[self creatPlayerItemWithMyUrl:url]];
//提示网络
// [[ShareManger defoutManger] judgeNetStatusAndAlert];
self.isPlyed = NO;
self.failPlay = NO;
[self start];
return self;
}
//初始化item
-(void)initWithaPlayerItem:(AVPlayerItem*)item
{
if (self.currentItem.status != AVPlayerStatusFailed) {
if (self.currentItem) {
[self removeObserverFromPlayerItem:self.currentItem];
[self removeNotification];
}
}
[self replaceCurrentItemWithPlayerItem:item];
[self addNotification];
}
//创建item
-(AVPlayerItem*)creatPlayerItemWithMyUrl:(NSURL*)url
{
_playingUrl = url;
if (self.currentItem.status != AVPlayerStatusFailed) {
if (self.currentItem) {
[self removeObserverFromPlayerItem:self.currentItem];
[self removeNotification];
}
}
AVPlayerItem * playerItem = [[AVPlayerItem alloc]initWithURL:url];
[self addObserberToPlayerItem:playerItem];
[self addNotification];
return playerItem;
}
//改变item
-(void)changeToItemWithMyUrl:(NSURL*)url
{
_playingUrl = url;
if (self.currentItem.status != AVPlayerStatusFailed) {
if (self.currentItem) {
[self removeObserverFromPlayerItem:self.currentItem];
[self removeNotification];
}
}
//重写getter方法
-(AVPlayerLayer*)playerLayer
{
if (!_playerLayer) {
_playerLayer = [AVPlayerLayer playerLayerWithPlayer:self];
}
return _playerLayer;
}
//第一次开始播放
-(void)start
{
[super play];
}
//重写播放方法
-(void)play
{
if (!_isPlaying) {
[super play];
_isPlaying = YES;
}
}
//重写暂停方法
-(void)pause
{
if (_isPlaying) {
[super pause];
_isPlaying = NO;
}
}
//判断新的URL是不是现在播放的URL
-(BOOL)isCurrentPlayingUrl:(NSURL*)url
{
NSString * urlStr = [url absoluteString];
NSString * isPlayingStr = [_playingUrl absoluteString];
if ([urlStr isEqualToString:isPlayingStr]) {
return YES;
}else{
return NO;
}
}
AVPlayerItem * playerItem = [[AVPlayerItem alloc]initWithURL:url];
[self addObserberToPlayerItem:playerItem];
[self replaceCurrentItemWithPlayerItem:playerItem];
[self addNotification];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器