Ver código fonte

1.录音播放功能

huangxiaodong 2 meses atrás
pai
commit
ae28d2bde2

+ 2 - 0
创维盒子/code/mine/model/recordFileModel.h

@@ -16,10 +16,12 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, assign) BOOL isDirectory;//文件是否存在
 @property (nonatomic, strong) NSDate *modificationDate;//最后修改日志
 @property (nonatomic, assign) NSInteger totalTime;// 录音时长
+@property (nonatomic, assign) NSInteger curPlayerTime;// 当前播放时间
 
 @property (nonatomic, assign) BOOL showAllType;// 是否展示全部内容
 @property (nonatomic, assign) BOOL isSelectType;//是否选中
 @property (nonatomic, assign) BOOL isEditType;//是否编辑状态
+@property (nonatomic, assign) BOOL isPlayingType;// 是否未播放中
 @end
 
 NS_ASSUME_NONNULL_END

+ 126 - 2
创维盒子/code/mine/recordViewController.m

@@ -17,7 +17,7 @@
 #import "recordEditBottomView.h"
 #import "uploadFileRecordViewController.h"
 
-@interface recordViewController ()<UITableViewDelegate,UITableViewDataSource,DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>
+@interface recordViewController ()<UITableViewDelegate,UITableViewDataSource,DZNEmptyDataSetSource, DZNEmptyDataSetDelegate,AVAudioPlayerDelegate>
 @property (nonatomic, strong) UIButton *rightButton;//编辑
 @property(nonatomic,strong) editTypeHeadView*curEditTypeHeadView;
 @property(nonatomic,strong) recordEditBottomView*curEditTypeBottomView;
@@ -29,6 +29,10 @@
 @property(nonatomic,strong)recordBottomView *recordBottomV;//底部视图
 @property(nonatomic,strong)recordingView *recordingV;//录音中
 @property(nonatomic,strong)reNameRecordFileView * reNameRecordFileV;
+
+@property(nonatomic,strong)AVAudioPlayer * curAudioPlayer;//音频播放器
+@property (strong, nonatomic) NSTimer *progressTimer;
+@property(nonatomic,strong) recordFileModel* curPlayerModel;//当前播放的音频数据
 @end
 
 @implementation recordViewController
@@ -452,7 +456,7 @@
     [self.tableView reloadData];
 }
 
-#pragma mark 点击cell里面的按钮事件 //index  1 编辑 2 删除  10 播放 11 后退 12 前进
+#pragma mark 点击cell里面的按钮事件 //index  1 编辑 2 删除  10 播放(100 暂停) 11 后退 12 前进
 - (void)didClickCellFunBy:(NSInteger)index withRow:(NSInteger)row
 {
     switch (index) {
@@ -461,6 +465,19 @@
             break;
         case 2:
             [self deleteFileByRow:row];
+            break;
+        case 10:
+            [self didClickPlayerByRow:row];
+            break;
+        case 11:
+            [self playerBackwardFun];
+            break;
+        case 12:
+            [self playerForwardFun];
+            break;
+        case 100://
+            [self audioPlayerPauseFun];
+            break;
         default:
             break;
     }
@@ -789,4 +806,111 @@
     [vc gotoUploadFileByRecord:_didSelectListArr];
 }
 
+#pragma mark 音频播放相关
+- (void)didClickPlayerByRow:(NSInteger)row
+{
+    if(row > _audioArr.count){
+        return;
+    }
+        
+    recordFileModel* dataModel = _audioArr[row];
+    NSURL* fileURL = [NSURL URLWithString:dataModel.filePath];
+    
+    _curPlayerModel = dataModel;
+    
+    for (recordFileModel*model in _audioArr) {
+        model.isPlayingType = NO;
+    }
+    
+    _curPlayerModel.isPlayingType = YES;
+    
+    if (_curAudioPlayer) {
+        [_curAudioPlayer stop];
+        _curAudioPlayer = nil;
+    }
+    
+    NSError *error;
+    _curAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
+    _curAudioPlayer.delegate = self;
+    _curAudioPlayer.currentTime = _curPlayerModel.curPlayerTime;
+    [_curAudioPlayer play];//播放
+    
+    [self startProgressTimer];
+        
+}
+
+#pragma mark 音频暂停播放
+- (void)audioPlayerPauseFun
+{
+    [_curAudioPlayer pause];
+    [self stopProgressTimer];
+}
+
+#pragma mark 播放代理
+- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
+{
+    HLog(@"播放完成")
+    [self stopProgressTimer];
+    
+    _curPlayerModel.isPlayingType = NO;
+    _curPlayerModel.curPlayerTime = 0;//           _curPlayerModel.totalTime;
+    [self.tableView reloadData];
+}
+
+- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error
+{
+    if (error) {
+        HLog(@"解码失败")
+    }
+}
+
+#pragma mark 播放进度相关
+- (void)startProgressTimer {
+    
+    [self stopProgressTimer];
+    
+    self.progressTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
+                                                         target:self
+                                                       selector:@selector(updateProgress)
+                                                       userInfo:nil
+                                                        repeats:YES];
+}
+
+- (void)stopProgressTimer {
+    [self.progressTimer invalidate];
+    self.progressTimer = nil;
+}
+
+- (void)updateProgress {
+    if (_curPlayerModel.totalTime > _curPlayerModel.curPlayerTime) {
+        _curPlayerModel.curPlayerTime += 1;
+    }
+    
+    [self.tableView reloadData];
+}
+
+#pragma mark 向前15秒
+- (void)playerForwardFun
+{
+    _curPlayerModel.curPlayerTime += 15;
+    if (_curPlayerModel.curPlayerTime > _curPlayerModel.totalTime) {
+        _curPlayerModel.curPlayerTime = _curPlayerModel.totalTime -2;
+    }
+    
+    _curAudioPlayer.currentTime = _curPlayerModel.curPlayerTime;
+    [self.tableView reloadData];
+}
+
+#pragma mark 向后15秒
+- (void)playerBackwardFun
+{
+    _curPlayerModel.curPlayerTime -= 15;
+    if (_curPlayerModel.curPlayerTime < 0) {
+        _curPlayerModel.curPlayerTime = 0;
+    }
+    
+    _curAudioPlayer.currentTime = _curPlayerModel.curPlayerTime;
+    [self.tableView reloadData];
+}
+
 @end

+ 1 - 1
创维盒子/code/mine/view/recordFileCell.h

@@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
 @interface recordFileCell : UITableViewCell
 @property(nonatomic,strong) recordFileModel *curRecordFileModel;
 
-//index  1 编辑 2 删除  10 播放 11 后退 12 前进
+//index  1 编辑 2 删除  10 播放(100 暂停) 11 后退 12 前进
 @property (nonatomic,copy) void (^didClickRecordButFun)(NSInteger index);
 
 @property (nonatomic,copy) void (^didClickSwitch)(BOOL SwitchOn);

+ 56 - 5
创维盒子/code/mine/view/recordFileCell.m

@@ -145,7 +145,7 @@
     _progressingView.backgroundColor = [UIColor hwColor:@"#333333"];
     [_progressingView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.mas_equalTo(0.f);
-        make.right.mas_equalTo(0);
+        make.width.mas_equalTo(0);
         make.top.mas_equalTo(0);
         make.height.mas_equalTo(2.f);
     }];
@@ -157,7 +157,7 @@
     _progressYuanView.layer.masksToBounds = YES;
     _progressYuanView.backgroundColor = [UIColor hwColor:@"#333333"];
     [_progressYuanView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.mas_equalTo(20.f);
+        make.left.equalTo(_progressBgView.mas_left).offset(0.0);
         make.centerY.equalTo(_progressingView.mas_centerY);
         make.width.mas_equalTo(6.f);
         make.height.mas_equalTo(6.f);
@@ -218,6 +218,8 @@
     _playOrPauseButton = [[UIButton alloc] init];
     [_playOrPauseButton setImage:[UIImage imageNamed:@"record_player_icon"] forState:UIControlStateNormal];
     [_playOrPauseButton setImage:[UIImage imageNamed:@"record_pause_icon"] forState:UIControlStateSelected];
+    _playOrPauseButton.tag = 10;
+    [_playOrPauseButton addTarget:self action:@selector(didClickButFun:) forControlEvents:UIControlEventTouchUpInside];
     [_cellBg2View addSubview:_playOrPauseButton];
     
     [_playOrPauseButton mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -230,6 +232,8 @@
     //后退
     _backwardButton = [[UIButton alloc] init];
     [_backwardButton setImage:[UIImage imageNamed:@"record_backward_icon"] forState:UIControlStateNormal];
+    _backwardButton.tag = 11;
+    [_backwardButton addTarget:self action:@selector(didClickButFun:) forControlEvents:UIControlEventTouchUpInside];
     [_cellBg2View addSubview:_backwardButton];
     
     [_backwardButton mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -242,6 +246,8 @@
     //前进
     _forwardButton = [[UIButton alloc] init];
     [_forwardButton setImage:[UIImage imageNamed:@"record_forward_icon"] forState:UIControlStateNormal];
+    _forwardButton.tag = 12;
+    [_forwardButton addTarget:self action:@selector(didClickButFun:) forControlEvents:UIControlEventTouchUpInside];
     [_cellBg2View addSubview:_forwardButton];
     
     [_forwardButton mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -257,6 +263,14 @@
 - (void)didClickButFun:(UIButton*)but
 {
     NSInteger tag = but.tag;
+    
+    if(but == _playOrPauseButton){
+        if (_playOrPauseButton.selected) {
+            tag = 100;
+        }
+        _playOrPauseButton.selected = !_playOrPauseButton.selected;
+    }
+    
     if (_didClickRecordButFun) {
         _didClickRecordButFun(tag);
     }
@@ -298,6 +312,13 @@
         totalSizeStr = [[NSString alloc] initWithFormat:@"%.2fG",totalSize_k/1024.0/1024.0];
     }
     
+    if (_curRecordFileModel.isPlayingType) {
+        _playOrPauseButton.selected = YES;
+    }
+    else{
+        _playOrPauseButton.selected = NO;
+    }
+    
     // 时长 totalTime
     NSInteger hour = 0;
     NSInteger min = 0;
@@ -307,13 +328,43 @@
     min = (_curRecordFileModel.totalTime  -60*hour)/60;
     second = _curRecordFileModel.totalTime  -60*hour - 60 *min;
     
-    NSString* totalTimeStr = [[NSString alloc] initWithFormat:@"%02ld:%02ld:%02ld",hour,min,second];;
+    NSString* totalTimeStr = [[NSString alloc] initWithFormat:@"%02ld:%02ld:%02ld",hour,min,second];
     
     _timeAndSizeLabel.text = [[NSString alloc] initWithFormat:@"%@ %@",totalTimeStr,totalSizeStr];
-    
-    _progressingLabel.text  = @"00:00:00";
     _totaltimeLabel.text = totalTimeStr;
     
+    //进度相关
+    // 播放时长 curPlayerTime
+    NSInteger playerhour = 0;
+    NSInteger playerMin = 0;
+    NSInteger playerSecond = 0;
+    
+    playerhour = _curRecordFileModel.curPlayerTime / 60 /60;
+    playerMin = (_curRecordFileModel.curPlayerTime  -60*playerhour)/60;
+    playerSecond = _curRecordFileModel.curPlayerTime  -60*playerhour - 60 *playerMin;
+    
+    NSString* playingTimeStr = [[NSString alloc] initWithFormat:@"%02ld:%02ld:%02ld",playerhour,playerMin,playerSecond];
+    
+    _progressingLabel.text  = playingTimeStr;
+    
+    CGFloat progress = _curRecordFileModel.curPlayerTime *1.0 /_curRecordFileModel.totalTime;
+    CGFloat BgWidth = _progressBgView.hw_w;
+    CGFloat progressingWidth = BgWidth* progress;
+    
+    [_progressingView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.mas_equalTo(0.f);
+        make.width.mas_equalTo(progressingWidth);
+        make.top.mas_equalTo(0);
+        make.height.mas_equalTo(2.f);
+    }];
+    
+    [_progressYuanView mas_remakeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(_progressingView.mas_right).offset(-2);
+        make.centerY.equalTo(_progressingView.mas_centerY);
+        make.width.mas_equalTo(6.f);
+        make.height.mas_equalTo(6.f);
+    }];
+    
     if(curRecordFileModel.isEditType){
         checkButton.hidden = NO;
         

+ 1 - 1
创维盒子/code/mine/view/recordingView.m

@@ -94,7 +94,7 @@
     [_timerlabel setTextColor:[UIColor hwColor:@"979797"]];
     [_timerlabel mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.mas_equalTo(12.0);
-        make.top.mas_equalTo(15.0);
+        make.top.equalTo(_titlelabel.mas_bottom).offset(10);
         make.height.mas_equalTo(20.0);
         make.right.mas_equalTo(-12.f);
     }];