项目当中用到了音频播放器,所以就参考官方文档,写了一个,代码如下:

.h

#import <UIKit/UIKit.h>

@interface hAudioPlayViewController : UIViewController
@property(nonatomic,strong)NSString *titleStr;//音乐名字
@property(nonatomic,strong)NSString *kMusicFile;//音乐文件
@property(nonatomic,strong)NSString *nameStr;//演唱者
@end

.m

#import "hAudioPlayViewController.h"
#import <AVFoundation/AVFoundation.h> @interface hAudioPlayViewController ()<CustomNavigationBarDelegate,AVAudioPlayerDelegate> @property (nonatomic,strong) AVAudioPlayer *audioPlayer;//播放器
@property (weak, nonatomic) IBOutlet UIImageView *bgImg;
@property (weak, nonatomic) IBOutlet UILabel *nameLab;
@property (weak, nonatomic) IBOutlet UIButton *playBtn;
@property (weak, nonatomic) IBOutlet UIProgressView *progressV;
@property (weak ,nonatomic) NSTimer *timer;//进度更新定时器
@property (weak, nonatomic) IBOutlet UILabel *timeLab;
@property (assign, nonatomic) BOOL isPlay; @end @implementation hAudioPlayViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib. self.view.backgroundColor =BackgroundColor;
CustomNavigationBar *nav = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(, , KscreenW, NavHeight) withTitle:[NSString stringWithFormat:@"%@",self.titleStr] withLeftBtnHidden:NO withRightBtn:YES];
nav.delegate = self;
[self.view addSubview:nav]; self.isPlay = NO;
[self creatUI];
} -(void)leftBtnAction:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
[self.audioPlayer pause];
} -(void)creatUI
{
self.nameLab.text = self.nameStr;
[self play];
self.playBtn.selected = YES;
} -(NSTimer *)timer{
if (!_timer) {
_timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:true];
}
return _timer;
} /**
* 创建播放器
*
* @return 音频播放器
*/
-(AVAudioPlayer *)audioPlayer{
if (!_audioPlayer) { //这段代码是设置声道,防止设备在扬声器的状态下没有声音
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil]; NSURL *url = [NSURL URLWithString:self.kMusicFile]; //将文件先下载到本地,然后再播放
NSData *audioData = [NSData dataWithContentsOfURL:url];
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3",docDirPath,@"temp"];
[audioData writeToFile:filePath atomically:YES]; NSError *error=nil;
//初始化播放器,注意这里的Url参数只能时文件路径,不支持HTTP Url
_audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL URLWithString:filePath] error:&error];
//设置播放器属性
_audioPlayer.numberOfLoops=;//设置为0不循环
_audioPlayer.delegate=self;
[_audioPlayer prepareToPlay];//加载音频文件到缓存
if(error){
NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);
return nil;
}
}
return _audioPlayer;
} /**
* 播放音频
*/
-(void)play{
if (![self.audioPlayer isPlaying]) {
[self.audioPlayer play];
self.timer.fireDate=[NSDate distantPast];//恢复定时器
}
} /**
* 暂停播放
*/
-(void)pause{
if ([self.audioPlayer isPlaying]) {
[self.audioPlayer pause];
self.timer.fireDate=[NSDate distantFuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复 }
} /**
* 点击播放/暂停按钮
*
* @param sender 播放/暂停按钮
*/
- (IBAction)playClick:(UIButton *)sender {
sender.selected = !sender.selected; if (sender.selected==self.isPlay) {
[self pause];
}else
{
[self play];
}
} /**
* 更新播放进度
*/
-(void)updateProgress{
float progress= self.audioPlayer.currentTime /self.audioPlayer.duration;
[self.progressV setProgress:progress animated:true];
int current = (int)self.audioPlayer.currentTime;
int duration = (int)self.audioPlayer.duration;
self.timeLab.text = [NSString stringWithFormat:@"%@/%@",[self timeFormatted:current],[self timeFormatted:duration]];
} /**
* 把秒转换为时间格式
*/ -(NSString *)timeFormatted:(int)totalSeconds
{
int seconds = totalSeconds % ;
int minutes = (totalSeconds / ) % ;
// int hours = totalSeconds / 3600; return [NSString stringWithFormat:@"%02d:%02d",minutes, seconds];
} #pragma mark - 播放器代理方法
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"音乐播放完成...");
}

相关的时间转化,暂停与播放等基本功能已完善,不过没有做其他更精细化的操作,譬如保存进度,第二次进来继续上次的进度播放;快进等操作!

官方文档地址:

https://developer.apple.com/documentation/avfoundation/avaudioplayer?language=objc

碰到问题,设备在扬声器下没有声音:

1,原因:

没有设置声道;

AVAudioSession是一个单例,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用

针对不同的音频应用场景,需要设置不同的音频回话分类

2,解决方法:

在初始化AVAudioPlayer之前,设置声道,代码如下:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];

效果如下:

上面描述的是AudioPlayer的用法,下面说下AVPlayer的用法,他们两直接的区别如果同时播放音频的话,AudioPlayer比较适合播放本地的文件,而AVPlayer则可以播放在线的音频文件,当然也可以播放视频文件,这里先不说,比较简单,代码如下:

#import "hAVPlayerViewController.h"
#import <AVFoundation/AVFoundation.h> @interface hAVPlayerViewController ()<CustomNavigationBarDelegate>
@property (weak, nonatomic) IBOutlet UILabel *titleLab;
@property (weak, nonatomic) IBOutlet UIButton *playBtn;
@property (weak, nonatomic) IBOutlet UILabel *timeLab;
@property (assign, nonatomic) BOOL isPlay;//用来标记是否播放
@property (weak, nonatomic) IBOutlet UIProgressView *progress; //播放器
@property (nonatomic,strong)AVPlayer *avPlayer; //监控进度
@property (nonatomic,strong)NSTimer *avTimer; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *imgTop; @end @implementation hAVPlayerViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib. self.view.backgroundColor =BackgroundColor;
CustomNavigationBar *nav = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(, , KscreenW, NavHeight) withTitle:[NSString stringWithFormat:@"%@",self.model.title] withLeftBtnHidden:NO withRightBtn:YES];
nav.delegate = self;
[self.view addSubview:nav]; self.imgTop.constant = NavHeight; self.isPlay = NO; //mp3播放网址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",self.model.music_url]]; //播放器初始化
self.avPlayer = [[AVPlayer alloc]initWithURL:url];
/*
//设置播放器初始音量
self.avPlayer.volume =1; //初始0音量
self.volume.value =5.0f; //设置最大值最小值音量
self.volume.maximumValue =10.0f; self.volume.minimumValue =0.0f;
*/ //监控播放进度
self.avTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timer) userInfo:nil repeats:YES]; self.titleLab.text = [NSString stringWithFormat:@"%@",self.model.title];
self.playBtn.selected = YES; [self.avPlayer play];
} -(void)leftBtnAction:(id)sender
{
[self.avPlayer pause];
[self.navigationController popViewControllerAnimated:YES];
} //监控播放进度方法
- (void)timer
{
float progress= CMTimeGetSeconds(self.avPlayer.currentItem.currentTime) / CMTimeGetSeconds(self.avPlayer.currentItem.duration);
[self.progress setProgress:progress animated:true];
int current = (int)CMTimeGetSeconds(self.avPlayer.currentItem.currentTime);
int duration = CMTimeGetSeconds(self.avPlayer.currentItem.duration);
self.timeLab.text = [NSString stringWithFormat:@"%@/%@",[self timeFormatted:current],[self timeFormatted:duration]];
} /**
* 把秒转换为时间格式
*/
-(NSString *)timeFormatted:(int)totalSeconds
{
int seconds = totalSeconds % ;
int minutes = (totalSeconds / ) % ;
// int hours = totalSeconds / 3600; return [NSString stringWithFormat:@"%02d:%02d",minutes, seconds];
} //播放/暂停
- (IBAction)play:(id)sender { UIButton *btn = (UIButton *)sender; btn.selected = !btn.selected; if (btn.selected == self.isPlay) {
[self.avPlayer pause];
}else{
[self.avPlayer play];
}
}

仅做记录!

ios开发之--AVAudioPlayer/AVPlayer的应用的更多相关文章

  1. IOS开发中AVFoundation中AVAudioPlayer的使用

    IOS开发中如何调用音频播放组件 1.与音频相关的头文件等都在AVFoundation.h中,所以第一步是添加音频库文件: #import <AVFoundation/AVFoundation. ...

  2. ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

    ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...

  3. ios开发——实用技术篇&网络音频播放

    网络音频播放 在日常的iOS开发中,我们通常会遇到媒体播放的问题,XCode中已经为我们提供了功能非常强大的AVFoundation框架和 MediaPlayer框架.其中AVFoundation框架 ...

  4. iOS开发之多媒体播放

    iOS开发之多媒体播放 iOS sdk中提供了很多方便的方法来播放多媒体.本文将利用这些SDK做一个demo,来讲述一下如何使用它们来播放音频文件. AudioToolbox framework 使用 ...

  5. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  6. iOS开发之微信聊天页面实现

    在上篇博客(iOS开发之微信聊天工具栏的封装)中对微信聊天页面下方的工具栏进行了封装,本篇博客中就使用之前封装的工具栏来进行聊天页面的编写.在聊天页面中主要用到了TableView的知识,还有如何在俩 ...

  7. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  8. iOS开发拓展篇—音乐的播放

    iOS开发拓展篇—音乐的播放 一.简单说明 音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件. 注意: (1)该类(AVAudioPlayer)只能用于播放本地 ...

  9. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

随机推荐

  1. java replaceall 使用正则表达式替换单等号,不替换其他相关的等号。

    写项目需要将公式配置到数据库中,取出后根据公式规则进行比较,由于公式的等于是用单等号,在java中无法直接使用,故需要将单等号替换成双等号,单又不能影响大于等于以及其他形式.故果断选择正则表达式替换. ...

  2. R matrix 转换为 dataframe

    When I try converting a matrix to a data frame, it works for me: > x <- matrix(1:6,ncol=2,dimn ...

  3. 浅谈跨域以WebService对跨域的支持

    跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...

  4. modelsim 出现此错误怎么办

    笔者的电脑装成了win8的系统,然后像平常一样打开modelsim,这时跳出如下图的界面: 笔者的modelsim之前是安装过的,所以这个界面已经说明,当前的许可证没有安装好.解决上述问题的办法是重新 ...

  5. 3D Face Reconstruction

    方法1 Large Pose 3D Face Reconstruction from a Single Image via Direct Volumetric CNN Regression http: ...

  6. js dom添加回车事件

    <!DOCTYPE html> <html lang="en" class="no-js"> <head> <meta ...

  7. Spring系列(一):Spring的基本概念及其核心

    一.Spring是什么 Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系. 二.为什么要使用Spring 1. 降低组件之间的耦合度,实现软件各层之间的 ...

  8. Unity--------------------万向锁的概念

    万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...

  9. (转)Live555单线程原理

    1. 概述 在live555-Server库中,使用单线程实现了多用户请求视频数据,这似乎多线程才能实现的功能,并且用户请求视频数据各个流程衔接的都十分完美,其执行效率非常高. live555是如何实 ...

  10. POJ 3481 Double Queue(STL)

    题意  模拟银行的排队系统  有三种操作  1-加入优先级为p 编号为k的人到队列  2-服务当前优先级最大的   3-服务当前优先级最小的  0-退出系统 能够用stl中的map   由于map本身 ...