SYAudio

导入录音头文件(注意添加framework:AVFoundation.frameworkAudioToolbox.framework

#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@property (nonatomic, strong) AVPlayer *player;
@property (nonatomic, strong) id timeObserver;@property (nonatomic, assign) BOOL hasObserver;

开始播放

- (void)playerStart:(NSString *)filePath
{if (!filePath || filePath.length <= 0) {NSLog(@"无效的文件");return;}// 移除监听器[self removeObserver];// 设置播放的urlNSURL *url = [NSURL fileURLWithPath:filePath];if ([filePath hasPrefix:@"http://"] || [filePath hasPrefix:@"https://"]) {url = [NSURL URLWithString:filePath];}// 设置播放的项目AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];if (self.player == nil) {self.player = [[AVPlayer alloc] init];}[self.player replaceCurrentItemWithPlayerItem:playerItem];[self.player play];// 添加监听器[self addObserver];
}

暂停播放

- (void)playerPause
{[self.player pause];
}

添加监听

- (void)addObserver
{if (!self.hasObserver) {self.hasObserver = YES;// KVO// KVO来观察status属性的变化[self.player.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];// KVO监测加载情况[self.player.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];//SYAudioPlay __weak *weakSelf = self;self.timeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(audioPlaying:time:)]) {[weakSelf.delegate audioPlaying:CMTimeGetSeconds(weakSelf.player.currentItem.duration) time:CMTimeGetSeconds(time)];}}];// 通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinish) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];}
}

移除监听

- (void)removeObserver
{if (self.hasObserver) {self.hasObserver = NO;[self.player.currentItem removeObserver:self forKeyPath:@"status"];[self.player.currentItem removeObserver:self forKeyPath:@"loadedTimeRanges"];[self.player removeTimeObserver:self.timeObserver];self.timeObserver = nil;[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];}
}

实现监听

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{if ([keyPath isEqualToString:@"status"]) {// 取出status的新值AVPlayerItemStatus status = [change[NSKeyValueChangeNewKey] intValue];switch (status) {case AVPlayerItemStatusFailed: {NSLog(@"item 有误");                } break;case AVPlayerItemStatusReadyToPlay: {NSLog(@"准好播放了");[self.player play];} break;case AVPlayerItemStatusUnknown: {NSLog(@"视频资源出现未知错误");} break;default: break;}} else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {NSArray *array = self.player.currentItem.loadedTimeRanges;// 本次缓冲的时间范围CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];// 缓冲总长度NSTimeInterval totalBuffer = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration);// 音乐的总时间NSTimeInterval duration = CMTimeGetSeconds(self.player.currentItem.duration);// 计算缓冲百分比例NSTimeInterval scale = totalBuffer / duration;//NSLog(@"总时长:%f, 已缓冲:%f, 总进度:%f", duration, totalBuffer, scale);}
}

播放完成

- (void)playFinish
{NSLog(@"播放完成");
}

使用AVPlayer播放本地,或网络音频文件相关推荐

  1. iOS 音频录制、播放(本地、网络)

    文章目录一.录音机(AVAudioRecorder)1.简介2.如何使用3.具体实现(开始.暂停.停止.播放 四个功能)4.附件实现demo二.播放音频1.播放本地音频文件(AVAudioPlayer ...

  2. html中怎么写播放音乐格式,HTML+CSS入门 如何实现多浏览器播放wav格式的音频文件...

    本篇教程介绍了HTML+CSS入门 如何实现多浏览器播放wav格式的音频文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 使用audioplayer.js 基本上能支持 ...

  3. Win10系统,用C++调用OpenCV接口,播放本地视频文件,播放本地和网络摄像头

    1 前言 前边2篇文章介绍了在WIN10系统上,分别用C++和Python调用OpenCV接口,加载和显示一张静态图片.本篇我们来看一下,用C++如何调用OpenCV接口,打开和播放本地视频文件,打开 ...

  4. h5移动端播放amr格式的音频文件兼容安卓IOS

    基于amr.js和RecorderJs,最底部有线上demo代码 播放 AMR: var amr = new BenzAMRRecorder(); amr.initWithUrl('path/to/v ...

  5. 用C#来播放.wav格式的音频文件

    .net自带的有播放.wav格式音频文件的类:System.Media.SoundPlayer,只要调用这个类就可以了. 代码如下:     string path = "....../so ...

  6. python播放音频文件_详解使用pygame播放一段MP3音频文件

    近日,在梳理pygame模块的时候发现一个很有用的模块mixer模块,这个模块翻译过来就是混音器,它可以加载和播放音频文件,甚至可以对混音器进行设置和处理,其功能非常强大.今天,我们一起来梳理一下混音 ...

  7. android 存放音频文件夹里,Android 实现简单的音乐播放器效果(音频文件的三种存放)...

    Android 实现简单的音乐播放器效果(音频文件的三种存放).三种方法主要使用到的类 MediaPlayer.create() getAssets() new Mediaplayer() - 几个控 ...

  8. spring boot循环控制读取本地视频或音频文件

    1.后台配置类 UploadFilePathConfig.java package com.xxxxxx.controller;import org.springframework.beans.fac ...

  9. html audio播放本地语音文件,HTML5+ - audio音频播放及网络音频文件播放

    1.介绍常用方法 createPlayer()创建音频对象 play: 开始播放音频 pause: 暂停播放音频 resume: 恢复播放音频 stop: 停止播放音频 seekTo: 跳到指定位置播 ...

最新文章

  1. 一篇文章告诉你标准化和归一化的区别?
  2. ubutun:从共享文件夹拷贝文件尽量使用cp命令而不是CTRL+C/V
  3. HDU1285拓扑排序模版题
  4. input val >=zero input_val <=one
  5. [票据打印]打印走纸控制(1) - 设置纸型
  6. BZOJ-1934-Vote善意的投票-SHOI2007
  7. C++用递归实现链表的逆转(附完整源码)
  8. 使用python套用excel模板_Python自动化办公Excel-从表中批量复制粘贴数据到新表
  9. 33. Avoid Hiding inerited names
  10. Normalize.css的使用及下载
  11. 傅里叶光学导论_激光位移传感器的光学系统设计
  12. 【论文笔记】基于聚类特征深度LSTM的语音情感识别
  13. SpringCloud——pom文件初始配置
  14. 全国计算机等级考试二级Web程序设计考试大纲(2018年版)
  15. 团队管理之—— 大项目:把握关键点,谋定而后动
  16. 计算机内存128毫升,内存换算公式(内存怎么换算)
  17. 恶魔和梦魇的私语------- 关于软件开发的务虚主义对话(3)
  18. android m是什么版本号,Android m是什么版本
  19. 58%数据泄漏由内部引起,防泄密系统助力企业数据安全管理防泄露
  20. 【深度解读】金氪首创ERC-721 概念版T恤发布,那ERC-721是什么?

热门文章

  1. 进程管理之进程优先级
  2. 这个5G网优工程师也太牛了!手机丢了,自己找回来了!
  3. TensorFlow基础之模型建立与训练:线性回归、MLP多层感知机、卷积神经网络
  4. O2OA开源办公平台:搭建自定义工程及开发
  5. Linux各个发行版本代号整理
  6. Spring官方文档中文翻译
  7. 色散介质中的脉冲展宽
  8. 6代u笔记本完美支持win7_华硕飞行堡垒六代笔记本安装win7系统的操作教程
  9. 表计算函数(Tableau)
  10. node安装以及nvm管理node版本