多媒体之本地音乐的播放(利用观察者模式传值)及播放中控件的变化

在RootViewController的m文件里:

 1 #import "RootViewController.h"
 2 #import "ListViewController.h"
 3 @interface RootViewController ()
 4
 5 @end
 6
 7 @implementation RootViewController
 8
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view from its nib.
12     self.slider_Process.minimumValue=0;
13     if (self.songName.length==0) {
14         self.songName=@"蓝莲花";
15     }
16     self.lblTitle.text=self.songName;
17     //找歌曲路径
18     NSString *path=[[NSBundle mainBundle]pathForResource:@"蓝莲花" ofType:@"mp3"];
19     //路径格式转换
20     NSURL *URL=[NSURL fileURLWithPath:path];
21     player=[[AVAudioPlayer alloc] initWithContentsOfURL:URL error:nil];
22     player.delegate=self;
23     //把播放的歌曲加到缓存中
24     [player prepareToPlay];
25
26     //添加观察者(通知中心)
27     [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(songNameChange:) name:@"changeMusic" object:nil];
28
29 }
30 -(void)songNameChange:(NSNotification *)sender{
31     //获取歌曲名字.sender onject获得通知者的值
32     self.songName=[sender object];
33     self.lblTitle.text=self.songName;
34
35     NSString *strPath=[[NSBundle mainBundle] pathForResource:_songName ofType:@".mp3"];
36     NSURL  *URL=[NSURL fileURLWithPath:strPath];//从文件
37 //    NSURL *URL=[NSURL URLWithString:strPath];//从网上转换路径
38     if (player!=nil) {
39         player=nil;
40     }
41     player=[[AVAudioPlayer alloc] initWithContentsOfURL:URL error:nil];
42     player.delegate=self;
43     [player play];
44
45     //更新页面
46     //播放时声音的值就是音量滑块的值
47     [player setVolume:_slider_Volume.value];
48     //每隔一秒更新播放时间
49     [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
50 }
51 //更新播放时间
52 -(void)updateTime{
53     //获取播放歌曲的总时长,获取到的是秒数
54     NSTimeInterval allTime=player.duration;
55     int minute=allTime/60;
56     int second=(int)allTime%60;
57     //获取当前播放的时间的分、秒
58     NSTimeInterval currentTime=player.currentTime;
59     int currentMintue=currentTime/60;
60     int currentSecond=(int)currentTime%60;
61     //把当前时间和总时间格式化为一个字符串
62     NSString *strCurrentTime=[NSString stringWithFormat:@"%.2d:%.2d",currentMintue,currentSecond];
63     NSString *strAllTime=[NSString stringWithFormat:@"/%.2d:%.2d",minute,second];
64     self.lblTime.text=[NSString stringWithFormat:@"%@%@",strCurrentTime,strAllTime];
65
66     self.slider_Process.value=player.currentTime/player.duration;  //进度条随播放移动
67 }
68 #pragma mark - 实现音频播放协议里的函数
69 -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
70     NSLog(@"当前歌曲播放完毕");
71 }
72 -(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error{
73     NSLog(@"播放器出现异常");
74 }
75 - (void)didReceiveMemoryWarning {
76     [super didReceiveMemoryWarning];
77     // Dispose of any resources that can be recreated.
78 }

在ListViewController.h文件中:

 1 #import "ListViewController.h"
 2
 3 @interface ListViewController ()
 4
 5 @end
 6
 7 @implementation ListViewController
 8
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view from its nib.
12     [self initData];
13     [self createTableView];
14 }
15 -(void)initData{
16     dataAry=[[NSMutableArray alloc] init];
17     //从沙盒中读取数据
18     NSString *strPath=[[NSBundle mainBundle]pathForResource:@"musicList" ofType:@".plist"];
19     NSArray *ary=[NSArray arrayWithContentsOfFile:strPath];
20     [dataAry addObjectsFromArray:ary];
21 }
22 -(void)createTableView{
23     tv=[[UITableView alloc] initWithFrame:CGRectMake(0, 20, 375, 600) style:UITableViewStylePlain];
24     UIImageView *iv=[[UIImageView alloc] initWithFrame:tv.frame];
25     iv.image=[UIImage imageNamed:@"king1"];
26     [tv setBackgroundView:iv];
27     tv.delegate=self;
28     tv.dataSource=self;
29     [self.view addSubview:tv];
30 }
31 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
32     return dataAry.count;
33 }
34 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
35     NSString *identifier=@"song";
36     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
37     if (!cell) {
38         cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
39     }
40     cell.textLabel.text=dataAry[indexPath.row];
41     cell.backgroundColor=[UIColor clearColor];
42     return cell;
43 }
44 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
45     //获得选中行的歌曲名字
46     NSString *songName=dataAry[indexPath.row];
47     //把名字传回到第一个页面(Root页面)采用观察者模式
48     [[NSNotificationCenter defaultCenter] postNotificationName:@"changeMusic" object:songName];
49     [self dismissViewControllerAnimated:NO completion:nil];
50
51 }
52 - (void)didReceiveMemoryWarning {
53     [super didReceiveMemoryWarning];
54     // Dispose of any resources that can be recreated.
55 }

实现效果:

此例利用Xib快速构建UI并添加控件事件等。实现本地音乐的播放、及播放中各控件如何变化和利用KVC-KVO观察者传值。

时间: 2024-08-01 21:21:49

多媒体之本地音乐的播放(利用观察者模式传值)及播放中控件的变化的相关文章

Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面

实现功能: 功能1:点击MyMusicListFragment(本地音乐)底部UI中的专辑封面图片打开的PlayActivity(独立音乐播放界面) PlayActivity中,显示正在播放的歌名 PlayActivity中,显示专辑封面图片(大图) PlayActivity中,显示上一首按钮,实现对应功能 PlayActivity中,显示暂停播放按钮,实现对应功能 PlayActivity中,显示下一首,实现对应功能 功能2:实现同步MyMusicListFragment(本地音乐界面)和Pl

Android中利用ContentResolver获取本地音乐和相册

在Android中,例如图库和音乐播放器,它们能够扫描我们的系统,获取到本地的相片跟音乐,这一点是如何做到的呢? 当我们往手机上放图片或者音乐的时候,会在手机内存中某个位置上的某个database中存放图片或者音乐的信息,而我们的应用程序是能够通过ContentResolver去读取到这些数据的. 下面可以先看一下database在哪,如下: 然后在data/data/下面呢,有很多provider提供的数据库,而我们的音乐或者图片就是在一个叫做Media的库下: external是智能手机中内

手机影音第十四天,本地音乐列表的展示与播放(利用视频播放的布局)

代码已经托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 效果图: Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户.当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中.在这个

iOS音频播放之AudioQueue(一):播放本地音乐

AudioQueue简介 AudioStreamer说明 AudioQueue详解 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput AudioQueueAllocateBuffer AudioQueueEnqueueBuffer AudioQueueStart Pause Stop Flush Reset Dispose AudioQueueFreeBuffer AudioQueueGetProperty AudioQueueSetProper

android音乐播放器开发 SweetMusicPlayer 播放本地音乐

上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,现在来总结下播放本地音乐. 一,MediaPlayer 首先来看看MediaPlayer的生命周期: Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态.这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确

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

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

本地音乐播放、在线音乐播放与视频播放

1.本地音乐播放 1.导入库:AVFoundation.framework 2.添加头文件:#import <AVFoundation/AVFoundation.h> 代码如下: #import "ConfigViewController.h" #import "UIView+DLQuickView.h" #import <AVFoundation/AVFoundation.h> @interface ConfigViewController

简单本地音乐播放器

// //  ViewController.m //  AudioPlayer // //  Created by apple on 14-7-18. //  Copyright (c) 2014年 苹果IOS软件开发者. All rights reserved. // #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVAudi

Android Mediaplayer本地音乐播放器(绑定服务)

本文章介绍MediaPlayer本地音乐播放器,而当应用程序不再位于前台且没有正在使用它的活动时,为了确保音频继续播放,我们需要建立一个服务Service. Activity与绑定服务Service之间的交互是本文章的重点(这里需要说明一点的是,Activity不能直接访问服务对象中的方法,所以才有了我们一下的介绍,这也是为服务的安全等方面的考虑). 直接上代码: 布局文件:activity_main: <LinearLayout xmlns:android="http://schemas