多媒体之音乐播放

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

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

Android 音乐播放器的开发实例详解_Android

   本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等.        先欣赏下本实例完成后运行的界面效果:         首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局.        上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用Se

OPhone程序开发入门之音乐播放器

OPhone平台提供了完整的多媒体解决方案.为开发者提供了统一的,简单易用的开发接口.本文首先介绍了OPhone平台的多媒体框架,然后详细介绍了 在OPhone平台上开发音乐播放程序所需的基本知识.通过一步一步构建一个简单的音乐播放器示例程序,来帮助读者了解具体的开发过程.该示例涵盖了Application,Activity,Service,Intent,BroadCast  Receiver等基本概念,使读者对OPhone程序的开发有一个全面的了解,进一步巩固和熟悉这些基本概念.最后介绍了如何

app-做一款带有社交功能的音乐播放APP,研发技术官应该具有哪些技术基础

问题描述 做一款带有社交功能的音乐播放APP,研发技术官应该具有哪些技术基础 自己的背景不是学技术的,这段时间正在创业准备中,想做一款带有社交功能的音乐播放APP,正在搭建团队,尤其是技术官,想问问针对这样的产品,研发技术官应该具有哪些技术基础?以便我去找人的时候更有针对性,非常感谢! 解决方案 设想下"研发技术官"如果有一定的水平,他为什么要和你合作?你在资本或者市场方面有没有吸引高水平技术partner的地方?这才是作为非技术创业者首先考虑的地方,如果你有这样的优势,自然会有人找你

使用Qt做一个简易音乐播放器[Phonon浅谈--续]

2010-2-13 使用Qt做一个简易音乐播放器[Phonon浅谈--续]   在第一篇Phonon浅谈中提及到了Phonon这个多媒体框架的一些基本知识,于是想着结合这些基本知识来实践一番,做一个简单的音乐播放器.   [步骤一] 新建一个Qt Gui工程,在建立过程中需要包含Phonon模块,之后生成文件如下图: Qt Gui工程会生成一个ui文件,在这里是mainwindow.ui.双击mainwindow.ui进行一番简单的布局,如下图: 关于这个ui界面,中央位置是一个QListWid

教你轻松制作java音乐播放器_java

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

三国争霸 Linux三款音乐播放器全方位PK

Linux三款音乐播放器全方位PK 电脑一直被大家用作音乐播放的设备.我们可以从互联网上听到成百上千人的音乐文件.现在已经有很多人的电脑根本离不开音乐播放器,Windows中的音乐播放器 大家可能都耳熟能详了,但是在Linux中,很多新手却很找到一款适合自己的音乐播放器,以致于对Linux逐渐失去兴趣. 其实,Linux中的音乐播放器也有很多,而且功能相当不错的,这里给大家介绍三个最具代表性的音乐播放器,并对三个进行对比,大家可以根据个人喜好选择适合自己的音乐播放器. 三国争霸 Linux三款音

Android 音乐播放器的开发实例详解

本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等. 先欣赏下本实例完成后运行的界面效果: 首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局. 上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用SeekBar而不用ProgressBar是因为我们需

Banshee v2.0.1发布 自由免费的音乐播放器

Banshee一个在GNU/Linux上使用Helix和GStreamer多媒体平台库来执行播放,编码和解码Ogg,MP3和其它的格式的自由免费的http://www.aliyun.com/zixun/aggregation/9366.html">音乐播放器.你可以播放和导入CD,轻松的与你的ipod同步分享或播放它.Banshee同样也可将播放列表报告发布到last.fm的播放列表中.还有其它的一些很酷功能如:它 Banshee v2.0.1发行说明: AmazonMp3.Store:

c sharp-winform音乐播放器有的键子不好使

问题描述 winform音乐播放器有的键子不好使 自己做的播放器,但是,快退.上一首下一首键都是黑的,点不了,不好使怎么办? 解决方案 上一首.下一首是windows media player内置的功能 你可以用this.axWindowsMediaPlayer1.currentPlaylist.add添加你的播放列表项,然后再播放,就可以有上一首下一首了. 解决方案二: winform音乐播放器