多媒体之音乐播放

简介:

音效是比较简短的,音乐比较长,格式比较多,那就需要使用<AVFoundation/AVFoundation.h>框架,AVAudioPlayer只支持本地的


//
//  ViewController.m
//  AVFoundation
//
//  Created by City--Online on 15/5/5.
//  Copyright (c) 2015年 CYW. All rights reserved.
//
 
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
 
@interface ViewController ()<AVAudioPlayerDelegate>
@property(nonatomic,strong)AVAudioPlayer *audioPlayer;
@property(nonatomic,strong)UIButton *btnStop;
@property(nonatomic,strong)UIButton *btnPause;
@property(nonatomic,strong) UIButton *btnPlayer;
@property(nonatomic,strong)UIProgressView *progress;
@property(nonatomic,strong)UIProgressView *averagePowerProgress;
@property(nonatomic,weak)NSTimer *timer;
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    [self stepUI];
     
    NSString *path=[[NSBundle mainBundle]pathForResource:@"1" ofType:@".mp3"];
    NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
    _audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
    //立体声平衡 -1 左声道  0 左右声道平衡  1右声道
    _audioPlayer.pan=1.0;
    //音量(0-1)
    _audioPlayer.volume=0.8;
    //是否允许改变速率
    _audioPlayer.enableRate=YES;
    //播放速率 (0.5-2) 1.0正常播放
    _audioPlayer.rate=0.8;
    //是否启用音频测量 默认NO
    _audioPlayer.meteringEnabled=true;
    //循环次数
    _audioPlayer.numberOfLoops=3;
    //设置代理
    _audioPlayer.delegate=self;
     
     
}
-(void)stepUI
{
    // 进度条
   _progress=[[UIProgressView alloc]initWithFrame:CGRectMake(100, 100, 200, 10)];
    [self.view addSubview:_progress];
     
    _averagePowerProgress=[[UIProgressView alloc]initWithFrame:CGRectMake(100,  200, 100, 10)];
    [self.view addSubview:_averagePowerProgress];
     
    //停止播放
    _btnStop=[UIButton buttonWithType:UIButtonTypeSystem];
    [_btnStop setTitle:@"停止" forState:UIControlStateNormal];
    _btnStop.frame=CGRectMake(40, 150, 40, 40);
    _btnStop.tag=1001;
    [_btnStop addTarget:self action:@selector(operation:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_btnStop];
     
    //播放
    _btnPlayer=[UIButton buttonWithType:UIButtonTypeSystem];
    [_btnPlayer setTitle:@"播放" forState:UIControlStateNormal];
    _btnPlayer.frame=CGRectMake(90, 150, 40, 40);
    _btnPlayer.tag=1002;
    [_btnPlayer addTarget:self action:@selector(operation:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_btnPlayer];
     
    _btnPause=[UIButton buttonWithType:UIButtonTypeSystem];
    [_btnPause setTitle:@"暂停" forState:UIControlStateNormal];
    _btnPause.frame=CGRectMake(140, 150, 40, 40);
    _btnPause.tag=1003;
    [_btnPause addTarget:self action:@selector(operation:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_btnPause];
     
    _timer=[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
   
}
-(void)operation:(id)sender
{
    UIButton *btn=(UIButton *)sender;
    switch (btn.tag) {
        case 1001:
            if ([_audioPlayer isPlaying]) {
                [_audioPlayer stop];
                [_progress setProgress:0];
                //
                 _timer.fireDate=[NSDate distantFuture];
                _audioPlayer.currentTime=0;
                 
                NSLog(@"%ld",_audioPlayer.numberOfChannels);
            }
            break;
        case 1002:
            if (![_audioPlayer isPlaying]) {
                [_audioPlayer play];
                //恢复定时
                _timer.fireDate=[NSDate distantPast];
            }
            break;
        case 1003:
            if ([_audioPlayer isPlaying]) {
                [_audioPlayer pause];
                //暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复
                _timer.fireDate=[NSDate distantFuture];
            }
            break;
 
        default:
            break;
    }
     
 
}
-(void)updateProgress
{
    float progress=_audioPlayer.currentTime/_audioPlayer.duration;
    [_progress setProgress:progress animated:YES];
    //更新音频测量值,注意如果要更新音频测量值必须设置meteringEnabled为YES,通过音频测量值可以即时获得音频分贝等信息
    [_audioPlayer updateMeters];
    //获得指定声道的分贝峰值,注意如果要获得分贝峰值必须在此之前调用updateMeters方法
//   float  peakPower=[_audioPlayer peakPowerForChannel:2];
//    NSLog(@"%lf",peakPower);
    //获得指定声道的分贝平均值,注意如果要获得分贝平均值必须在此之前调用updateMeters方法
   float averagePower= [_audioPlayer averagePowerForChannel:1];
    //类似上下波动
    [_averagePowerProgress setProgress:(-averagePower)/50.0 animated:YES];
    NSLog(@"%lf",averagePower);
     
}
 
 
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionRouteChangeNotification object:nil];
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
{
    NSLog(@"播放完毕");
}
 
 
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
     NSLog(@"%@",error);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
@end

 

上面的是进度条,下面的是分贝平均值,类似有的音乐播放器波浪效果

相关文章
|
3月前
|
JavaScript 前端开发 数据处理
b超单生成器一键生成, 在线制作b超免费生成图, b超单在线生成器【网页JS版学习】
基于网页JS的B超单在线生成器。这个项目包含完整的HTML、CSS和JavaScript代码,实现表单输入、图像处理和PDF导出功能。
|
10月前
|
SQL 数据可视化 数据挖掘
让项目数据更有说服力:五款必备数据可视化管理工具推荐
在现代企业管理中,数据是决策的重要依据。有效的数据可视化工具能帮助项目经理快速洞察项目进展、评估风险、优化资源配置。本文推荐五款必备的数据可视化管理工具,包括板栗看板、Power BI、Tableau、Google Data Studio和Qlik Sense,从功能、易用性和优缺点等方面进行全面评析,帮助您将数据转化为行动,推动项目高效前行。
342 4
|
11月前
|
测试技术 数据安全/隐私保护
北邮人论坛登录页面测试用例
北邮人论坛登录页面测试用例
199 1
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
人工智能 自然语言处理 机器人
字节打造大模型TTS:不仅能高保真合成,而且支持调整编辑
【6月更文挑战第26天】字节跳动的Seed-TTS是先进的文本转语音系统,生成与人类语音难辨别的声音,并允许编辑。模型通过语音、文本编码器、解码器和声码器实现高保真、可控及多样化的语音生成。应用于智能客服、有声读物、导航,提升用户体验。虽在多模态任务、长文本生成、实时应用及隐私问题上面临挑战[[arxiv.org/pdf/2406.02430](https://arxiv.org/pdf/2406.02430)]。
442 7
|
自然语言处理 索引
es-DSL语句基础操作(Elasticseach)
es-DSL语句基础操作(Elasticseach)
327 1
|
安全 Linux 数据安全/隐私保护
SELinux详解
SELinux详解
426 0
|
Linux KVM 虚拟化
【Linux系统KVM虚拟机实战】LVM逻辑卷之扩展Swap交换分区
【Linux系统KVM虚拟机实战】LVM逻辑卷之扩展Swap交换分区
496 1
|
数据采集 存储 自然语言处理
基于FPGA多通道采样系统设计资料(1)
基于FPGA多通道采样系统设计资料(1)
477 0