/***原计划写一个音视频媒体全部支持的播放器,目前出于需求,只做了音乐(.MP3)的播放,后续视频及其他媒体类型播放会补上.***/
自定义音乐播放界面,实现以下三个功能:
1.根据URL读取并播放音乐文件(.MP3)
2.通过UISlider展示当前进度
3.手动滑动Slider的滑块能定位到实际进度并从实际进度开始播放
先上效果图:
代码如下:
//声明文件
JakMediaPlayerViewController.h:
//
// JakMediaPlayerViewController.h
//
// Created by zyh on 16/8/4.
// Copyright © 2016年 HC. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface JakMediaPlayerViewController : UIViewController
@end
//实现文件
JakMediaPlayerViewController.m:
//
// JakMediaPlayerViewController.m
//
// Created by zyh on 16/8/4.
// Copyright © 2016年 HC. All rights reserved.
//
#import "JakMediaPlayerViewController.h"
#import "Define.h"
@interface JakMediaPlayerViewController ()<AVAudioPlayerDelegate>
@property(nonatomic,strong)AVAudioPlayer *musicPlayer;
@property(nonatomic,strong)UIButton *playAndPauseBtn ;
@property(nonatomic,strong)UISlider *playProgress;
@property(nonatomic,strong)UILabel *currentLabel;
@property(nonatomic,strong)NSTimer *timer;//定时器用来控制播放进度
@property(nonatomic)BOOL isPlaying;//用来判断播放状态
@end
@implementation JakMediaPlayerViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"xxxxx"];
self.musicPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
self.musicPlayer.delegate = self;
[self.musicPlayer prepareToPlay];
//显示文件名称
UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, MY_WIDTH+40 , MY_WIDTH, 30)];
nameLabel.textAlignment = NSTextAlignmentCenter;
nameLabel.font = [UIFont systemFontOfSize:23];
nameLabel.text = @"xxxx";
[self.view addSubview:nameLabel];
//显示进度
self.playProgress = [[UISlider alloc]initWithFrame:CGRectMake(40, MY_HEIGHT - 150, MY_WIDTH - 80, 30)];
self.playProgress.value = 0.0;
[self.playProgress addTarget:self action:@selector(valueChanged) forControlEvents:UIControlEventValueChanged];
self.playProgress.maximumTrackTintColor = [UIColor lightGrayColor];
[self.view addSubview:self.playProgress];
//显示当前已播放时间
self.currentLabel = [[UILabel alloc]initWithFrame:CGRectMake(20, MY_HEIGHT - 110, 40, 20)];
self.currentLabel.textAlignment = NSTextAlignmentCenter;
self.currentLabel.text =[self getMinuteSecondWithTime:self.musicPlayer.currentTime];
[self.view addSubview:self.currentLabel];
//显示音乐文件总时间
UILabel * totalLabel = [[UILabel alloc]initWithFrame:CGRectMake(MY_WIDTH-60, MY_HEIGHT - 110, 40, 20)];
totalLabel.textAlignment = NSTextAlignmentCenter;
totalLabel.text =[self getMinuteSecondWithTime:self.musicPlayer.duration];
[self.view addSubview:totalLabel];
//设置播放/暂停按钮
self.playAndPauseBtn = [[UIButton alloc]initWithFrame:CGRectMake(MY_WIDTH/2-25, MY_HEIGHT - 80, 50, 50)];
[self.playAndPauseBtn addTarget:self action:@selector(playAndPauseBtnTouched) forControlEvents:UIControlEventTouchUpInside];
[self.playAndPauseBtn setImage:[UIImage imageNamed:@"player_button_play"] forState:UIControlStateNormal];
[self.view addSubview:self.playAndPauseBtn];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// [self.musicPlayer play];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.isPlaying = NO;
[self.musicPlayer stop];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//播放时调用,进度条更新当前进度,当前时间标签更新当前时间
-(void)playedMusic{
self.playProgress.value = self.musicPlayer.currentTime/self.musicPlayer.duration;
self.currentLabel.text = [self getMinuteSecondWithTime:self.musicPlayer.currentTime];
}
//手动拖动进度条的时候调用
-(void)valueChanged{
self.musicPlayer.currentTime = self.playProgress.value *self.musicPlayer.duration;
self.isPlaying = NO;
[self playAndPauseBtnTouched];
}
//点击播放/暂停 按钮时调用
-(void)playAndPauseBtnTouched{
self.isPlaying = !self.isPlaying;
if (self.isPlaying) {
[self.playAndPauseBtn setImage:[UIImage imageNamed:@"player_button_stop"] forState:UIControlStateNormal];
[self.musicPlayer play];
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playedMusic) userInfo:nil repeats:YES];
}else{
[self.playAndPauseBtn setImage:[UIImage imageNamed:@"player_button_play"] forState:UIControlStateNormal];
[self.musicPlayer pause];
[self.timer invalidate];
}
}
//通过获取时间展示"分钟:秒钟"
-(NSString *)getMinuteSecondWithTime:(NSTimeInterval)time{
int minute = (int)time / 60;
int second = (int)time % 60;
if (second > 9) {
return [NSString stringWithFormat:@"%d:%d",minute,second];
}
return [NSString stringWithFormat:@"%d:0%d",minute,second];
}
//代理方法,播放结束后调用
#pragma mark -- AVAudioPlayerDelegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
[self playAndPauseBtnTouched];
}
@end
尚有不足,欢迎指正.