AVAudioPlayer

本文详细介绍了如何使用AVAudioPlayer播放本地音频文件,并提供了iOS应用中的具体实现案例,包括预加载、播放控制和进度调整等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。

AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL并不可以是网络url而必须是本地文件URL,

因为 AVAudioPlayer不具备播放网络音频的能力,如果要播放网络URL,需要先转化为NSData.但是此法并不可取,

因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?

所以播放网络音频我们一般用音频队列。

注意:需要添加AVFoundation.framework
    AVAudioPlayer不支持边下边播,所以只能下载到本地再播放

    1.实例化方法
    - (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
    
    2.预加载资源
    - (BOOL)prepareToPlay;

    3.遵守协议
    AVAudioPlayerDelegate

    4.播放完成之后回调以下方法
    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;

先搭建UI吧,直接上图:

#import "AVAudioPlayerViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface AVAudioPlayerViewController ()
{
    //声明一个播放器
    AVAudioPlayer *_musicPlay;//音乐播放器
}

- (IBAction)playAction:(id)sender;//播放
- (IBAction)pauseAction:(id)sender;//暂停
- (IBAction)voiceAction:(UISlider *)sender;//音量
- (IBAction)progressAction:(UISlider *)sender;//进度

@property (weak, nonatomic) IBOutlet UISlider *progressSlider;//进度条
@property (nonatomic,strong)NSTimer *myTimer;//声明一个定时器类型的成员变量


@end

@implementation AVAudioPlayerViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //获取资源路径  需要事先导入本地音频内容
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"];
    NSLog(@"%@",filePath);
    
    NSURL *URL =[NSURL fileURLWithPath:filePath];
    _musicPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:URL error:nil];
    //实例化音乐播放器
//    _musicPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];
    
    //设置音量大小处于中等强度
    _musicPlay.volume = 0.5;
//循环次数,默认是1
    _musicPlay.numberOfLoops = 1;
   //    声道数
    NSUInteger channels = _musicPlay.numberOfChannels;//只读属性


//预加载资源 if ([_musicPlay prepareToPlay]) { NSLog(@"准备完毕"); } //设置总进度大小 self.progressSlider.maximumValue = _musicPlay.duration; } #pragma mark- 各类触发事件 -(void)change:(NSTimer *)sender{ //每一秒钟设置一下进度值 播放位置 self.progressSlider.value = _musicPlay.currentTime; } #pragma mark- AVAudioPlayer相关的方法 - (IBAction)playAction:(id)sender { //播放 [_musicPlay play]; self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(change:) userInfo:nil repeats:YES]; } - (IBAction)pauseAction:(id)sender { //暂停 [_musicPlay pause]; //停止定时器 [self.myTimer invalidate]; NSLog(@"%f",_musicPlay.currentTime); } - (IBAction)voiceAction:(UISlider *)sender { //改变音量大小 _musicPlay.volume = sender.value; } - (IBAction)progressAction:(UISlider *)sender { //设置进度 _musicPlay.currentTime = sender.value; }

代理方法

          加入播放出现异常,或者被更高级别的系统任务打断,我们的程序还没来得及收场就挂了,怎么办?不急,我们可以通过几个委托方法很好地处理所有的情形。

         首先给player设置委托是必须的:

  1. player.delegate = self; 
  1. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{  
  2.     //播放结束时执行的动作  
  3. }  
  4. - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{  
  5.     //解码错误执行的动作  
  6. }  
  7. - (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{  
  8.     //处理中断的代码  
  9. }  
  10. - (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{  
  11.     //处理中断结束的代码  

如果对你有帮助,请关注我哦!
 

转载于:https://www.cnblogs.com/laolitou-ping/p/6257265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值