多媒体之音乐播放

音效是比较简短的,音乐比较长,格式比较多,那就需要使用<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

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

时间: 2024-10-16 07:34:48

多媒体之音乐播放的相关文章

Android多媒体框架对音乐播放器的支持

下面介绍一下Andriod多媒体框架对开发者提供的支持有哪些. 1. MediaScannerReceiver 这个广播接收者在接收到ACTION_BOOT_COMPLETED.ACTION_MEDIA_MOUNTED或 ACTION_MEDIA_SCANNER_SCAN_FILE 广播时对SD卡中的图片.音乐和视频文件进行了扫描,因为扫描不能影响用户使用,这里启动了一个服务MediaScannerService,扫描的文件类型如下: /* Audio */ addFileType("MP3&q

Android 多媒体开发学习之简单的音乐播放器

我们今天的目的是学习如何创建一个简单的音乐播放器,可支持播放,暂停,继续播放,以及进度显示,已经进度拖拽. 既然我们的目的已经很明确,那我们先分析一下: 1: 我们播放音乐的任务可以放在Activity中吗? 假设我们当前音乐播放,我们切到别的应用,这时候播放音乐的Activity所在的进程就属于后台进程,因为后台进程会由于系统资源不足时,会杀死当前进程,会导致音乐不播放了.所以采用Activity是不行的. 2:播放音乐的任务放在一个服务中,那服务有2中启动方式,应该使用那种服务? a:如果采

团队项目 NABCD分析java音乐播放器

NABCD分析java音乐播放器 程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计的要求 利用学到的编程知识和编程技巧,要求学生: 1.系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能. 2.编程简练,可用,尽可能的使系统的功能更加完善和全面 3.说明书.流程图要清楚. 三.课程设计内容 1.课程设计的题目及简介 音乐

Qt版音乐播放器

    Qt版音乐播放器 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 一.关于Qt 1.1 什么是Qt Qt是一个跨平台应用程序和UI开发框架.使用Qt只需一次性开发应用程序,无需重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序. Qt Creator是全新的跨平台Qt IDE,可单独使用,也可与Qt库和开发工具组成一套完整的SDK,其中包括:高级C++代码编辑器,项目和集成管理工具,集成的上下文相关的帮助系统,图形化调试器,代码管理

团队项目《音乐播放器》运行及总结

一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计的要求 利用学到的编程知识和编程技巧,要求学生: 1.系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能. 2.编程简练,可用,尽可能的使系统的功能更加完善和全面 3.说明书.流程图要清楚. 三.课程设计内容 1.课程设计的题目及简介 音乐播放软件要求: 有图形界面,能播放MP3歌曲,有播放列表,前一首.

【程序开发小记】VB.NET音乐播放器

写在前面的话: 为了营造一个很好的交流学习的环境,也是为了迎合学校毕业设计的需求,开通了博客园.在下学期伊始,会每星期更新毕业设计的进度.博客业已开通,为了交流学习,要只是更新毕业设计的进度显得有些做作.博主并不是好看书时写些小评的主儿,遂不知有和内容好献于此,只得将之前课程中或是实习时开发的程序在此做个简述. 因这些项目也是博主心血,也是怕某些学弟学妹直接搬用引发事端,不便将源码原封不动摆在这里,在此只做简要说明. 若有意愿交流学习,可以在评论或是私信留下联系方式. 话不多说,接下来直奔主题.

NABCD分析java音乐播放器

程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计的要求 利用学到的编程知识和编程技巧,要求学生: 1.系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能. 2.编程简练,可用,尽可能的使系统的功能更加完善和全面 3.说明书.流程图要清楚. 三.课程设计内容 1.课程设计的题目及简介 音乐播放软件要求: 有图形界面,能播放

在线音乐播放器-----酷狗音乐api接口抓取

首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我等在线音乐播放器,是不会提供他们的数据库接口的,所以这个我们需要,在线抓取这些在线音乐播放器的接口,首先,这个事情,是属于违规的.是属于侵犯这些公司的版权的.所以,不能用于商业用途 我们以酷狗音乐为例子,抓取他的连接数据库的API接口 我是用的是谷歌,进入私密模式,因为在这种模式下,不会缓存歌曲 1

java编写的音乐播放器

一.音乐播放器的实现原理 Javase的多媒体功能很弱,所以有一个专门处理多媒体的插件叫JMF,JMF提供的模型可大致分为七类 * 数据源(Data source) * 截取设备(Capture Device,包括视频和音频截取设备) * 播放器(Player) * 处理器(Processor) * 数据池(DataSink) * 数据格式(Format) * 管理器(Manager) 而我所做的这个音乐播放器MyMusicPlayer(这是我创建的类名)正是调用了JMF中的Player类来实现