• AVAudioPlayer音频播放


    AVAudioPlayer类创建的实例可以看作为一个音频播放器,可以播放来自文件或存储的音频数据。
    它支持多种音频格式,而且能够进行进度、音量、播放速度等控制。
    使用这个类,可以:
    1、在指定的时间开始播放音频
    2、从文件或内存缓冲区播放音频
    3、循环播放

    属性 描述
    @property(readonly, getter=isPlaying) BOOL playing 是否正在播放,只读
    @property float volume 音量大小,范围0~1.0
    @property float pan 立体声,-1.0完全左声道,0.0左右声道平衡,1.0完全右声道
    @property float rate 播放速率,范围0.5~2.0,1.0时为正常播放,如果需要更改播放速率必须设置enableRate为YES
    @property BOOL enableRate 是否可以更改播放速率
    @property NSInteger numberOfLoops 重复播放次数,为0时只播放一次,小于0时为无限播放,大于0时表示循环次数
    @property(readonly) NSDictionary *settings 音频播放次数信息,只读
    @property(readonly) NSUInteger numberOfChannels 与音频播放器相关联的声音通道的数量。(只读)
    @property(nonatomic, copy) NSArray *channelAssignments 与音频播放器相关AVAudioSessionChannelDescription对象数组
    @property(readonly) NSTimeInterval duration 播放时长
    @property NSTimeInterval currentTime 当前播放时长
    @property(readonly) NSTimeInterval deviceCurrentTime 输出设备播放音频的时间,注意如果播放中被暂停此时间也会继续累加
    @property(readonly) NSURL *url 音频文件路径,只读
    @property(readonly) NSData *data 音频数据,只读
    @property(getter=isMeteringEnabled) BOOL meteringEnabled 否启用音频测量,默认为NO,一旦启用音频测量可以通过updateMeters方法更新测量值
    对象方法 描述
    - (instancetype)initWithContentsOfURL:(NSURL *)url  error:(NSError **)outError 使用文件URL初始化播放器,注意这个URL不能是HTTP URL,AVAudioPlayer不支持加载网络媒体流,只能播放本地文件
    - (instancetype)initWithData:(NSData *)data error:(NSError **)outError

    使用NSData初始化播放器,注意使用此方法时必须文件格式和文件后缀一致,否则出错,所以相比此方法更推荐使用上述方法

    或- (instancetype)initWithData:(NSData *)data fileTypeHint:(NSString *)utiString error:(NSError **)outError方法进行初始化

    - (BOOL)play 播放音频文件
    - (BOOL)playAtTime:(NSTimeInterval)time 在指定的时间开始播放音频
    - (void)pause 暂停播放
    - (void)stop 停止播放
    - (BOOL)prepareToPlay 将音频文件加载到缓冲区
    - (float)averagePowerForChannel:(NSUInteger)channelNumber 获得指定声道的分贝平均值,注意如果要获得分贝平均值必须在此之前调用updateMeters方法
    - (float)peakPowerForChannel:(NSUInteger)channelNumber 获得指定声道的分贝峰值,注意如果要获得分贝峰值必须在此之前调用updateMeters方法
    - (void)updateMeters 更新音频测量值,注意如果要更新音频测量值必须设置meteringEnabled为YES,通过音频测量值可以即时获得音频分贝等信息
    代理方法 说明
    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 播放完成后调用,在这里可以进行一些属性的设置
    - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 音频解码发生错误

    AVAudioPlayer的使用比较简单:

    1、初始化AVAudioPlayer对象,通常指定本地文件路径

    2、设置播放器属性,例如播放次数,音量大小,设置代理等

    3、开始播放,调用play方法

    下面就是AVAudioPlayer实现的一个简单播放器,它播放本地的音频文件,实现了播放、暂停、显示播放进度,现实播放时间等功能:

      1 #import "JZViewController.h"
      2 #import <AVFoundation/AVFoundation.h>
      3 
      4 @interface JZViewController() <AVAudioPlayerDelegate>
      5 
      6 @property (nonatomic, strong) AVAudioPlayer * audioPlayer;
      7 @property (nonatomic, strong) UIImageView * imageView;
      8 @property (nonatomic, strong) UIProgressView * progressView;
      9 @property (nonatomic, strong) UILabel * timeLabel;
     10 @property (nonatomic, strong) UILabel * currenttimeLabel;
     11 @property (nonatomic, assign) NSTimer * timer;
     12 @property (nonatomic, assign) int intTime;
     13 @property (nonatomic, assign) int timeNum;
     14 @property (nonatomic, assign) UIButton * button;
     15 
     16 @end
     17 
     18 @implementation JZViewController
     19 
     20 - (void)viewDidLoad
     21 {
     22     [super viewDidLoad];
     23     self.title = @"礼物"; //播放音频为 礼物.mp3 钢琴曲
     24     self.view.backgroundColor = [UIColor whiteColor];
     25     
     26     [self.view addSubview:self.imageView];
     27     
     28     [self initView];
     29 }
     30 
     31 //界面初始化,添加一个view、一个进度条、3个label、一个button
     32 - (void)initView
     33 {
     34     UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 150, [UIScreen mainScreen].bounds.size.width, 150)];
     35     view.backgroundColor = [UIColor colorWithRed:246 / 255.0 green:246 / 255.0 blue:246 / 255.0 alpha:0.9];
     36     view.alpha = 0.8f;
     37     [self.view addSubview:view];
     38 
     39     UIProgressView * progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(40, 50, [UIScreen mainScreen].bounds.size.width - 80, 0)];
     40     self.progressView = progressView;
     41     [view addSubview:progressView];
     42     
     43     UILabel * timeLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 40, 40, 40, 20)];
     44     timeLabel.backgroundColor = [UIColor clearColor];
     45     timeLabel.font = [UIFont systemFontOfSize:11];
     46     timeLabel.textAlignment = NSTextAlignmentCenter;
     47     self.timeLabel = timeLabel;
     48     [view addSubview:timeLabel];
     49     
     50     UILabel * currentTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, 40, 20)];
     51     currentTimeLabel.backgroundColor = [UIColor clearColor];
     52     currentTimeLabel.font = [UIFont systemFontOfSize:11];
     53     currentTimeLabel.textAlignment = NSTextAlignmentCenter;
     54     self.currenttimeLabel = currentTimeLabel;
     55     [view addSubview:currentTimeLabel];
     56     
     57     UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 50)];
     58     label.backgroundColor = [UIColor clearColor];
     59     label.text = @"礼物";
     60     label.textAlignment = NSTextAlignmentCenter;
     61     [view addSubview:label];
     62     
     63     UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - 30, 70, 60, 60)];
     64     button.backgroundColor = [UIColor clearColor];
     65     [button setImage:[UIImage imageNamed:@"start.jpg"] forState:UIControlStateNormal];
     66     [button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
     67     self.button = button;
     68     button.tag = 10;
     69     [view addSubview:button];
     70 }
     71 
     72 //初始化imageView,添加背景图片
     73 - (UIImageView *)imageView
     74 {
     75     if(!_imageView){
     76         UIImage * image = [UIImage imageNamed:@"sjz.jpg"];
     77         UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
     78         imageView.frame = [UIScreen mainScreen].bounds;
     79         _imageView = imageView;
     80     }
     81     return _imageView;
     82 }
     83 
     84 //懒加载,创建audioPlayer
     85 - (AVAudioPlayer *)audioPlayer
     86 {
     87     if(!_audioPlayer){
     88         NSString * urlStr = [[NSBundle mainBundle] pathForResource:@"礼物.mp3" ofType:nil];
     89         NSURL * url = [NSURL fileURLWithPath:urlStr];
     90         NSError * error = nil;
     91         _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
     92         //设置播放属性
     93         _audioPlayer.numberOfLoops = 0;
     94         _audioPlayer.delegate = self;
     95         [_audioPlayer prepareToPlay];  //加载音频文件到缓存
     96         
     97         
     98         if(error){
     99             NSLog(@"初始化播放器过程发生错误,错误信息:%@", error.localizedDescription);
    100             return nil;
    101         }
    102         
    103     }
    104     return _audioPlayer;
    105 }
    106 
    107 //点击button后调用的方法,播放、暂停音乐
    108 - (void)clickButton:(UIButton *)sender
    109 {
    110     if(sender.tag == 10){
    111         sender.tag = 20;
    112         [sender setImage:[UIImage imageNamed:@"stop.jpg"] forState:UIControlStateNormal];
    113         [self.audioPlayer play];
    114         self.timer.fireDate = [NSDate distantPast];
    115     }else{
    116         sender.tag = 10;
    117         [sender setImage:[UIImage imageNamed:@"start.jpg"] forState:UIControlStateNormal];
    118         [self.audioPlayer pause];
    119         self.timer.fireDate = [NSDate distantFuture];
    120     }
    121 }
    122 
    123 //初始化定时器
    124 - (NSTimer *)timer
    125 {
    126     if(!_timer){
    127         _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimeAddProgress) userInfo:nil repeats:YES];
    128         self.timeNum = (int)self.audioPlayer.duration;
    129     }
    130     return _timer;
    131 }
    132 
    133 //定时器的调用方法,在这里更新进度条,并且更新时间
    134 - (void)updateTimeAddProgress
    135 {
    136     float progress = self.audioPlayer.currentTime / self.audioPlayer.duration;
    137     [self.progressView setProgress:progress animated:YES];
    138     
    139     self.intTime++;
    140     NSString * str = [NSString stringWithFormat:@"%.2d:%.2d", self.intTime / 60, self.intTime % 60];
    141     self.currenttimeLabel.text = str;
    142     
    143     self.timeNum--;
    144     NSString * strTime = [NSString stringWithFormat:@"%.2d:%.2d", self.timeNum / 60, self.timeNum % 60];
    145     self.timeLabel.text = strTime;
    146 }
    147 
    148 //代理方法,做一些播放完成后的处理,删除掉定时器,button图片的更改、停止音乐播放等
    149 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
    150 {
    151     self.intTime = 0;
    152     [self.audioPlayer stop];
    153     [self.timer invalidate];
    154     self.timer = nil;
    155     
    156     self.button.tag = 10;
    157     [self.button setImage:[UIImage imageNamed:@"start.jpg"] forState:UIControlStateNormal];
    158 }
    159 
    160 @end
  • 相关阅读:
    ASP.NET Web API +Swagger创建与汉化生成 API说明文档
    Apple 开发者账号 All In One
    CS50 2022 All In One
    TypeScript private field All In One
    js RegExp test bug All In One
    vite preview not work All In One
    Flutter Resources All In One
    table 组件性能优化 All In One
    Stanford CS193p All In One
    Swift 5.x bug All In One
  • 原文地址:https://www.cnblogs.com/sjzlovecj/p/4738657.html
Copyright © 2020-2023  润新知