• 音乐播放器(主界面)


    import <UIKit/UIKit.h>

    import <AVFoundation/AVFoundation.h>

    @interface MjMusicViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,AVAudioPlayerDelegate>
    {
    NSInteger controlPlayStyle;
    NSInteger controlPlay;
    NSMutableArray *timeArray;
    NSMutableDictionary *LRCDictionary;
    NSUInteger lrcLineNumber;
    }

    @end

    *************************************************

    import "MjMusicViewController.h"

    import "DXSemiViewControllerCategory.h"

    import <AVFoundation/AVFoundation.h>

    define kLrcTableView 10001

    //#define kPlaySequent 1;
    //#define kPlayRandom 2;
    //#define kPlayCircle 3;

    static NSString *songIdentify = @"songIdentify";
    @interface MjMusicViewController ()

    @property (retain, nonatomic) IBOutlet UIView *controlView;
    @property (retain, nonatomic) IBOutlet UIImageView *imageView;
    @property (nonatomic,retain)AVAudioPlayer *audioPlayer;
    @property (retain, nonatomic) IBOutlet UIButton *songBtn;
    @property (retain, nonatomic) IBOutlet UIButton *playStyleBtn;
    @property (retain, nonatomic) IBOutlet UISlider *sliderProgress;
    @property (retain, nonatomic) IBOutlet UIButton *controlBtn;
    @property (retain, nonatomic) IBOutlet UIButton *priorSongBtn;
    @property (retain, nonatomic) IBOutlet UIButton *nextSongBtn;
    @property (retain, nonatomic) IBOutlet UILabel *labelAllTime;
    @property (retain, nonatomic) IBOutlet UILabel *labelProgressTime;
    @property (retain, nonatomic) IBOutlet UISlider *sliderVolume;
    @property (retain, nonatomic) IBOutlet UILabel *songNameLabel;
    @property (retain, nonatomic) IBOutlet UITableView *lrcTableView;

    @property (nonatomic,retain)NSArray *songsDataSource;
    @property (nonatomic,assign)NSInteger musicNum;
    @property (nonatomic,retain)NSString *currentSong;
    @property (nonatomic ,retain)UITableView *songTableView;
    @property (nonatomic,retain)NSURL *soundURL;

    @end

    @implementation MjMusicViewController

    • (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
      {
      self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
      if (self) {
      // Custom initialization
      self.songsDataSource = @[@"光辉岁月",@"Never Give Up",@"怒放的生命",@"你给我听好",@"You Belong With Me",@"Stay Beautiful",@"我只在乎你",@"泡沫"];

      }
      return self;
      }

    • (void)viewDidLoad
      {
      [super viewDidLoad];
      controlPlayStyle = 2;
      controlPlay = 1;
      self.controlView.alpha = 0.6f;
      self.controlView.backgroundColor = [UIColor lightGrayColor];
      self.view.backgroundColor = [UIColor lightGrayColor];
      self.navigationController.navigationBarHidden = YES;

      self.imageView.animationImages = @[[UIImage imageNamed:@"scene1.jpg"],
      [UIImage imageNamed:@"scene2.jpg"],
      [UIImage imageNamed:@"scene3.jpg"],
      [UIImage imageNamed:@"scene4.jpg"],
      [UIImage imageNamed:@"scene5.jpg"],
      ];

      self.imageView.animationDuration = 20.0;
      [self.imageView stopAnimating];
      [self.view addSubview:self.imageView];
      [self.imageView addSubview:self.songNameLabel];
      [self.imageView addSubview:self.labelProgressTime];
      [self.imageView addSubview:self.labelAllTime];
      [self.imageView addSubview:self.sliderProgress];
      [self.imageView addSubview:self.controlView];
      [self.imageView addSubview:self.lrcTableView];

    // 为了显示歌词

    self.lrcTableView.tag = 10001;
    self.lrcTableView.backgroundColor = [UIColor clearColor];
    self.lrcTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.lrcTableView.dataSource = self;
    self.lrcTableView.delegate =self;
    lrcLineNumber = 0;
    
    timeArray = [[NSMutableArray alloc] initWithCapacity:10];
    LRCDictionary = [[NSMutableDictionary alloc] initWithCapacity:10];
    

    // 初始化歌词
    [self initLRC];

    [NSTimer scheduledTimerWithTimeInterval:0.1
                                     target:self
                                   selector:@selector(onTimer:)
                                   userInfo:nil repeats:YES];
    self.soundURL = [[NSBundle mainBundle] URLForResource:@"光辉岁月" withExtension:@"mp3"];
    self.musicNum = 0;
    NSError *error = nil;
    self.audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:self.soundURL error:&error];
    self.audioPlayer.delegate = self;
    self.audioPlayer.numberOfLoops = 0;
    
    if (nil != error) {
        NSLog(@"Error:%@",error);
    }
    
    [self.audioPlayer prepareToPlay];
    
    [self.controlBtn setBackgroundImage:[UIImage imageNamed:@"play"]
                               forState:UIControlStateNormal];
    [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_orderplay"]
                                 forState:UIControlStateNormal];
    self.songNameLabel.text = @"光辉岁月";
    

    // 初始化Slider
    self.sliderProgress.minimumValue = 0.0;
    self.sliderProgress.maximumValue = self.audioPlayer.duration;
    [self.sliderProgress setThumbImage:[UIImage imageNamed:@"mv_voiceSliderThumb"] forState:UIControlStateNormal];
    [self.sliderVolume setThumbImage:[UIImage imageNamed:@"mv_voiceSliderThumb"] forState:UIControlStateNormal];
    //格式化label显示时间
    [self ruleTimeLabel:self.labelAllTime andTime:self.audioPlayer.duration];

    //添加UISongTableView
    CGRect songTableFrame = CGRectMake(320, 50, 300, 430);
    self.songTableView = [[UITableView alloc ]initWithFrame:songTableFrame
                                                      style:UITableViewStylePlain];
    self.songTableView.alpha = 0.6f;
    self.songTableView.dataSource = self;
    self.songTableView.delegate = self;
    [self.songTableView registerClass:[UITableViewCell class]
               forCellReuseIdentifier:songIdentify];
    

    // 添加手势
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc ]
    initWithTarget:self
    action:@selector(onSingleTap:)];
    // 表示多点触摸时的手指数量
    tapGesture.numberOfTouchesRequired = 1;
    // 表示轻拍的次数,现在一个手指轻拍一次,也就是单击的动作
    tapGesture.numberOfTapsRequired = 1;
    // 为视图view添加上手势的动作处理
    [self.imageView addGestureRecognizer:tapGesture];

    }

    pragma mark -

    pragma mark dataSource

    • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
      {
      if (tableView.tag == kLrcTableView) {
      return timeArray.count;
      }else{
      return self.songsDataSource.count;
      }

    }

    • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
      {
      static NSString *cellIdentifier = @"LRCCell";
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
      if (tableView.tag == kLrcTableView) {
      if (cell == nil) {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
      reuseIdentifier:cellIdentifier];
      }
      cell.selectionStyle = UITableViewCellSelectionStyleNone;//该表格选中后没有颜色
      cell.backgroundColor = [UIColor clearColor];
      if (indexPath.row == lrcLineNumber) {
      cell.textLabel.text = LRCDictionary[timeArray[indexPath.row]];
      cell.textLabel.textColor = [UIColor orangeColor];
      cell.textLabel.font = [UIFont systemFontOfSize:15];
      } else {
      cell.textLabel.text = LRCDictionary[timeArray[indexPath.row]];
      cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
      cell.textLabel.font = [UIFont systemFontOfSize:13];
      }
      cell.textLabel.backgroundColor = [UIColor clearColor];
      cell.textLabel.textAlignment = NSTextAlignmentCenter;
      }else
      {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
      reuseIdentifier:cellIdentifier];
      cell.textLabel.text = self.songsDataSource[indexPath.row];
      cell.textLabel.textAlignment = NSTextAlignmentLeft;

      }

      return cell;

    }
    //行高

    • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
      return 35;
      }

    pragma mark -

    pragma mark UITableView Delegate

    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
      if (tableView.tag == kLrcTableView) {

      }else{
      self.currentSong = self.songsDataSource[indexPath.row];
      self.musicNum = indexPath.row;
      [self initLRC];
      self.songNameLabel.text = self.songsDataSource[indexPath.row];
      self.soundURL = [[NSBundle mainBundle] URLForResource:self.currentSong withExtension:@"mp3"];

      if ([self.audioPlayer isPlaying]) {
      [self.audioPlayer stop];
      [self changeSongs];
      [self.audioPlayer play];
      }
      else
      {
      [self changeSongs];
      [self.audioPlayer play];
      [self.controlBtn setBackgroundImage:[UIImage imageNamed:@"pause"]
      forState:UIControlStateNormal];
      }
      }

    }

    pragma mark -

    pragma mark AVAudioPlayer Delegate

    • (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
      {

    // if (!controlPlayStyle) {
    // [self sequencePlay];
    // self.audioPlayer.delegate = self;
    // [self.audioPlayer play];
    // }else{
    // [self randomPlay];
    // self.audioPlayer.delegate = self;
    // [self.audioPlayer play];
    // }
    switch (controlPlay) {
    case 1:
    [self sequencePlay];
    self.audioPlayer.delegate = self;
    [self.audioPlayer play];
    break;
    case 2:
    [self randomPlay];
    self.audioPlayer.delegate = self;
    [self.audioPlayer play];
    break;
    case 3:
    self.audioPlayer.numberOfLoops = -1;
    self.audioPlayer.delegate = self;
    [self.audioPlayer play];
    break;

        default:
            break;
    }
    

    }

    pragma mark -

    pragma mark 方法回调

    • (void)onTimer:(NSTimer *)timer
      {
      self.sliderProgress.value = self.audioPlayer.currentTime;
      [self ruleTimeLabel:self.labelProgressTime andTime:self.audioPlayer.currentTime];
      //调用歌词函数
      [self displaySondWord:self.audioPlayer.currentTime];
      }

    • (IBAction)sliderProgressBtn:(UISlider *)sender {
      self.audioPlayer.currentTime = self.sliderProgress.value;
      self.sliderProgress.value =sender.value;
      }

    • (IBAction)onSliderVolumeBtn:(UISlider*)sender {
      self.audioPlayer.volume = sender.value;
      }

    //播放暂停控制按钮

    • (IBAction)onControlBtn:(id)sender {
      if ([self.audioPlayer isPlaying]) {
      [self.controlBtn setBackgroundImage:[UIImage imageNamed:@"play"]
      forState:UIControlStateNormal];
      [self.audioPlayer pause];
      }else{
      [self.controlBtn setBackgroundImage:[UIImage imageNamed:@"pause"]
      forState:UIControlStateNormal];
      [self.audioPlayer play];
      }
      }

    //得到歌曲列表

    • (IBAction)onSongsBtn:(id)sender {
      [UIView beginAnimations:@"animation" context:nil];
      [UIView setAnimationCurve:UIViewAnimationCurveLinear];
      [UIView setAnimationDuration:0.2];
      CGRect frame = self.songTableView.frame;
      frame.origin.x = 80;
      self.songTableView.frame = frame;
      [self.view addSubview:self.songTableView];
      [UIView commitAnimations];

    }

    //上一首歌

    • (IBAction)onPriorBtn:(id)sender {
      if (self.musicNum == 0) {
      self.musicNum = self.songsDataSource.count - 1;
      [self changeToPlay];
      }else{
      self.musicNum -= 1;
      [self changeToPlay];

      }

    }

    //下一首歌

    • (IBAction)onNextBtn:(id)sender {
      if (self.musicNum == self.songsDataSource.count - 1) {
      self.musicNum = 0;
      [self changeToPlay];
      }else{
      self.musicNum += 1;
      [self changeToPlay];

      }
      NSLog(@"%ld",(long)self.musicNum);
      }

    //随机播放

    • (IBAction)onSongRudomBtn:(id)sender {
      // if (controlPlayStyle == 2) {
      // controlPlayStyle = YES;
      // [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_randplay"]
      // forState:UIControlStateNormal];
      // }else if(controlPlayStyle == 3)
      // {
      // controlPlayStyle = NO;
      // [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_orderplay"]
      // forState:UIControlStateNormal];
      // }
      switch (controlPlayStyle) {
      case 1:
      [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_orderplay"]
      forState:UIControlStateNormal];
      controlPlay = 1;
      controlPlayStyle = 2;
      break;
      case 2:
      [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_randplay"]
      forState:UIControlStateNormal];
      controlPlay = 2;
      controlPlayStyle = 3;
      break;
      case 3:
      [self.playStyleBtn setBackgroundImage:[UIImage imageNamed:@"mode_repeatlist"]
      forState:UIControlStateNormal];
      controlPlay = 3;
      controlPlayStyle = 1;
      break;
      default:
      break;
      }
      }

    //手势

    • (void)onSingleTap:(UITapGestureRecognizer *)singleTap
      {
      [self.songTableView removeFromSuperview];
      }

    • (void)viewWillAppear:(BOOL)animated
      {
      [super viewWillAppear:animated];
      [self.imageView startAnimating];
      }

    • (void)viewDidDisappear:(BOOL)animated
      {
      [super viewDidDisappear:YES];
      [self.imageView stopAnimating];
      }

    //顺序播放

    • (void)sequencePlay
      {

        if (self.musicNum == self.songsDataSource.count - 1) {
            self.musicNum = 0;
            [self changeToPlay];
           
        }else{
            self.musicNum += 1;
            [self changeToPlay];
            
        }
      

    }

    //随机播放

    • (void)randomPlay
      {
      // if (self.audioPlayer.currentTime >= self.audioPlayer.duration-1.05) {
      NSInteger number = arc4random()%self.songsDataSource.count;
      self.musicNum = number;
      [self changeToPlay];

    }

    //切歌播放

    • (void)changeToPlay
      {
      self.currentSong = self.songsDataSource[self.musicNum];
      self.soundURL =[[NSBundle mainBundle] URLForResource:self.currentSong withExtension:@"mp3"];
      timeArray = [[NSMutableArray alloc] initWithCapacity:10];
      LRCDictionary = [[NSMutableDictionary alloc] initWithCapacity:10];
      [self initLRC];
      self.songNameLabel.text = self.songsDataSource[self.musicNum];
      if ([self.audioPlayer isPlaying]) {
      [self.audioPlayer stop];
      [self changeSongs];
      [self.audioPlayer play];
      }else{
      [self changeSongs];
      }
      self.audioPlayer.delegate = self;

    }

    //切歌

    • (void)changeSongs
      {
      NSError *error = nil;
      self.audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:self.soundURL
      error:&error];

      [self ruleTimeLabel:self.labelAllTime andTime:self.audioPlayer.duration];
      self.sliderProgress.minimumValue = 0.0;
      self.sliderProgress.maximumValue = self.audioPlayer.duration;
      if (nil != error) {
      NSLog(@"Error:%@",error);
      }

      [self.audioPlayer prepareToPlay];

    }

    //时间格式

    • (void)ruleTimeLabel:(UILabel *)label andTime:(float)time
      {
      NSDateFormatter *date = [[NSDateFormatter alloc]init];
      [date setDateFormat:@"mm:ss"];

      label.text = [date stringFromDate:[NSDate dateWithTimeIntervalSince1970:time]];

    }

    pragma mark 得到歌词

    • (void)initLRC {
      NSString *LRCPath = [[NSBundle mainBundle] pathForResource:self.songsDataSource[self.musicNum] ofType:@"lrc"];
      NSString *contentStr = [NSString stringWithContentsOfFile:LRCPath encoding:NSUTF8StringEncoding error:nil];
      // NSLog(@"contentStr = %@",contentStr);
      NSArray *array = [contentStr componentsSeparatedByString:@" "];
      for (int i = 0; i < [array count]; i++) {
      NSString *linStr = [array objectAtIndex:i];
      NSArray *lineArray = [linStr componentsSeparatedByString:@"]"];
      if ([lineArray[0] length] > 8) {
      NSString *str1 = [linStr substringWithRange:NSMakeRange(3, 1)];
      NSString *str2 = [linStr substringWithRange:NSMakeRange(6, 1)];
      if ([str1 isEqualToString:@":"] && [str2 isEqualToString:@"."]) {
      NSString *lrcStr = [lineArray objectAtIndex:1];
      NSString *timeStr = [[lineArray objectAtIndex:0] substringWithRange:NSMakeRange(1, 5)];//分割区间求歌词时间
      //把时间 和 歌词 加入词典
      [LRCDictionary setObject:lrcStr forKey:timeStr];
      [timeArray addObject:timeStr];//timeArray的count就是行数
      }
      }
      }
      }

    pragma mark 动态显示歌词

    • (void)displaySondWord:(NSUInteger)time {
      // NSLog(@"time = %u",time);
      for (int i = 0; i < [timeArray count]; i++) {

        NSArray *array = [timeArray[i] componentsSeparatedByString:@":"];//把时间转换成秒
        NSUInteger currentTime = [array[0] intValue] * 60 + [array[1] intValue];
        if (i == [timeArray count]-1) {
            //求最后一句歌词的时间点
            NSArray *array1 = [timeArray[timeArray.count-1] componentsSeparatedByString:@":"];
            NSUInteger currentTime1 = [array1[0] intValue] * 60 + [array1[1] intValue];
            if (time > currentTime1) {
                [self updateLrcTableView:i];
                break;
            }
        } else {
            //求出第一句的时间点,在第一句显示前的时间内一直加载第一句
            NSArray *array2 = [timeArray[0] componentsSeparatedByString:@":"];
            NSUInteger currentTime2 = [array2[0] intValue] * 60 + [array2[1] intValue];
            if (time < currentTime2) {
                [self updateLrcTableView:0];
                //                NSLog(@"马上到第一句");
                break;
            }
            //求出下一步的歌词时间点,然后计算区间
            NSArray *array3 = [timeArray[i+1] componentsSeparatedByString:@":"];
            NSUInteger currentTime3 = [array3[0] intValue] * 60 + [array3[1] intValue];
            if (time >= currentTime && time <= currentTime3) {
                [self updateLrcTableView:i];
                break;
            }
            
        }
      

      }
      }

    pragma mark 动态更新歌词表歌词

    • (void)updateLrcTableView:(NSUInteger)lineNumber {
      // NSLog(@"lrc = %@", [LRCDictionary objectForKey:[timeArray objectAtIndex:lineNumber]]);
      //重新载入 歌词列表lrcTabView
      lrcLineNumber = lineNumber;
      [self.lrcTableView reloadData];
      //使被选中的行移到中间
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lineNumber inSection:0];
      [self.lrcTableView selectRowAtIndexPath:indexPath
      animated:YES
      scrollPosition:UITableViewScrollPositionMiddle];
      // NSLog(@"%i",lineNumber);
      }

    • (void)didReceiveMemoryWarning
      {
      [super didReceiveMemoryWarning];

    }

    @end

  • 相关阅读:
    bzoj3531[Sdoi2014]旅行
    bzoj3212 Pku3468 A Simple Problem with Integers 线段树
    bzoj1858[Scoi2010]序列操作 线段树
    bzoj2243[SDOI2011]染色 树链剖分+线段树
    bzoj3038上帝造题的七分钟2
    bzoj1036[ZJOI2008]树的统计Count 树链剖分+线段树
    bzoj3211花神游历各国 线段树
    bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
    bzoj3129[Sdoi2013]方程 exlucas+容斥原理
    刷题总结——寻宝游戏(bzoj3991 dfs序)
  • 原文地址:https://www.cnblogs.com/wangdelong/p/3854223.html
Copyright © 2020-2023  润新知