iOS - 视频和音频相关

注:本文采用了第三方框架 Masonry 和 ReactiveCocoa,请自行导入

相关素材

Paste_Image.png

第一.视频

    1.导入头文件和定义属性

            #import <MediaPlayer/MediaPlayer.h>
            @property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//视频播放控制器

    2.在 viewDidLoad 方法里面添加 play 方法和通知

            //添加通知
            [self addNotification];

    3.相关方法
          
            -(void)dealloc{
                //移除所有通知监控
                [[NSNotificationCenter defaultCenter] removeObserver:self];
            }
            
            #pragma mark - 私有方法
            /**
             *  取得本地文件路径
             *
             *  @return 文件路径
             */
            -(NSURL *)getFileUrl{
                NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"经济技术.mp4" ofType:nil];
                NSURL *url=[NSURL fileURLWithPath:urlStr];
                return url;
            }
            
            
            /**
             *  取得网络文件路径
             *
             *  @return 文件路径
             */
            -(NSURL *)getNetworkUrl{
                NSString *urlStr=@"http://v.qq.com/x/cover/954n4p1nqozp5bg.html";
                urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                NSURL *url=[NSURL URLWithString:urlStr];
                return url;
            }
            
            /**
             *  创建媒体播放控制器
             *
             *  @return 媒体播放控制器
             */
            -(MPMoviePlayerController *)moviePlayer{
                if (!_moviePlayer) {
                    NSURL *url=[self getFileUrl];
                    _moviePlayer=[[MPMoviePlayerController alloc]initWithContentURL:url];
                    _moviePlayer.view.frame = CGRectMake(0, 65, WIDTH, (HEIGHT-65-46)/3);
                    _moviePlayer.view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
                    [self.view addSubview:_moviePlayer.view];  

                    //覆盖播放器表面背景
                    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 65, WIDTH, (HEIGHT-65-46)/3)];
                    myView.backgroundColor = [UIColor clearColor];
                    [self.view addSubview:myView];
                    
                    //播放点击按钮
                    UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                    [playBtn setImage:[UIImage imageNamed:@"bofang"] forState:UIControlStateNormal];
                    [myView addSubview:playBtn];
                    [playBtn makeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(myView.top).offset((HEIGHT-65-46)/3*0.5-20);
                        make.left.equalTo(self.view.left).offset(WIDTH/2-20);
                        make.width.equalTo(40);
                        make.height.equalTo(40);
                    }];
                    [[playBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
                        [myView removeFromSuperview];
                        [self.moviePlayer play];
                    }];
                  
                }
                return _moviePlayer;
            }
            
            /**
             *  获取视频缩略图
             */
            -(void)thumbnailImageRequest{
                //获取13.0s、21.5s的缩略图
                [self.moviePlayer requestThumbnailImagesAtTimes:@[@13.0,@21.5] timeOption:MPMovieTimeOptionNearestKeyFrame];
            }

第二.音频

    1.导入头文件和定义属性

            #import <AVFoundation/AVFoundation.h>
            //音频相关
            @property (nonatomic,strong) AVAudioPlayer *audioPlayer;//播放器
            @property (nonatomic,strong)  UILabel *controlPanel; //控制面板
            @property (nonatomic,strong)  UIProgressView *playProgress;//播放进度
            @property (nonatomic,strong) UIView *playBG;
            @property (nonatomic,strong)  UIButton *playOrPause; //播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态)
            @property (nonatomic,strong) NSTimer *timer;//进度更新定时器
            @property (nonatomic,strong) UILabel *havTime;
            @property (nonatomic,strong) UILabel *totalTime;

       2.相关申明

//==============================分割线分割线=============*=================

            //播放视图
            self.playBG = [[UIView alloc] init];
            [self.view addSubview:self.playBG];
            [self.playBG makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(pop.picLab.bottom).offset(60);
                make.left.equalTo(self.view.left).offset(60);
                make.width.equalTo(WIDTH-120);
                make.height.equalTo(80);
            }];
            
            self.playOrPause = [UIButton buttonWithType:UIButtonTypeCustom];
            [self.playOrPause setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
            [self.playOrPause setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateSelected];
            self.playOrPause.layer.cornerRadius = 25;
            self.playOrPause.layer.shouldRasterize = YES;
            self.playOrPause.layer.rasterizationScale = [UIScreen mainScreen].scale;
            [self.playBG addSubview:self.playOrPause];
            [self.playOrPause makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.playBG.top).offset(15);
                make.left.equalTo(self.playBG.left).offset(10);
                make.width.equalTo(50);
                make.height.equalTo(50);
            }];         
          [[self.playOrPause rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
                self.playOrPause.selected = !self.playOrPause.selected;
                if (self.playOrPause.selected) {
                    [self play];
                }else{
                    [self pause];
                }
           }];
            
            self.playProgress = [[UIProgressView alloc] init];
            [self.playProgress setProgressViewStyle:UIProgressViewStyleDefault];
            self.playProgress.progressTintColor = WHITECOLOR;
            self.playProgress.trackTintColor = [UIColor colorWithRed:120/255.0 green:53/255.0 blue:54/255.0 alpha:1];
            [self.playBG addSubview:self.playProgress];
            [self.playProgress makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.playBG.top).offset(37.5);
                make.left.equalTo(self.playOrPause.right).offset(5);
                make.width.equalTo(WIDTH-120-75);
                make.height.equalTo(5);
            }];
           
            self.havTime = [[UILabel alloc] init];
            self.havTime.text = @"00:00";
            self.havTime.textAlignment = NSTextAlignmentLeft;
            self.havTime.font = [UIFont systemFontOfSize:12];
            self.havTime.textColor = WHITECOLOR;
            [self.playBG addSubview:self.havTime];
            [self.havTime makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.playProgress.bottom).offset(0);
                make.left.equalTo(self.playOrPause.right).offset(5);
                make.width.equalTo(100);
                make.height.equalTo(20);
            }];
            
            self.totalTime = [[UILabel alloc] init];
            NSInteger totalTime = self.audioPlayer.duration;
            self.totalTime.text = [NSString stringWithFormat:@"%02ld:%02ld",totalTime/60,totalTime/60];
            self.totalTime.textAlignment = NSTextAlignmentRight;
            self.totalTime.font = [UIFont systemFontOfSize:12];
            self.totalTime.textColor = WHITECOLOR;
            [self.playBG addSubview:self.totalTime];
            [self.totalTime makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.playProgress.bottom).offset(0);
                make.right.equalTo(self.playProgress.right).offset(0);
                make.width.equalTo(100);
                make.height.equalTo(20);
            }];

//==============================分割线分割线=============*=================

    3.相关方法

    #pragma mark - 音频相关

        -(NSTimer *)timer{
            if (!_timer) {
                _timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:true];
            }
            return _timer;
        }
        
        /**
         *  创建播放器
         *
         *  @return 音频播放器
         */
        -(AVAudioPlayer *)audioPlayer{
            if (!_audioPlayer) {
                NSString *urlStr=[[NSBundle mainBundle]pathForResource:@"华语群星 - 牵丝戏.mp3" ofType:nil];
                NSURL *url=[NSURL fileURLWithPath:urlStr];
                NSError *error=nil;
                //初始化播放器,注意这里的Url参数只能时文件路径,不支持HTTP Url
                _audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
                //设置播放器属性
                _audioPlayer.numberOfLoops=0;//设置为0不循环
                _audioPlayer.delegate=self;
                [_audioPlayer prepareToPlay];//加载音频文件到缓存
                if(error){
                    NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);
                    return nil;
                }
            }
            return _audioPlayer;
        }
        
        /**
         *  播放音频
         */
        -(void)play{
            if (![self.audioPlayer isPlaying]) {
                [self.audioPlayer play];
                self.timer.fireDate=[NSDate distantPast];//恢复定时器
            }
        }
        
        /**
         *  暂停播放
         */
        -(void)pause{
            if ([self.audioPlayer isPlaying]) {
                [self.audioPlayer pause];
                self.timer.fireDate=[NSDate distantFuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复
                
            }
        }
        
        
        /**
         *  更新播放进度
         */
        -(void)updateProgress{
            [UIView animateWithDuration:6 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
                float progress = self.audioPlayer.currentTime /self.audioPlayer.duration;
                [self.playProgress setProgress:progress animated:YES];
            } completion:nil];
            
            //    NSLog(@"----progress---%f",progress);
            
            NSInteger time = self.audioPlayer.currentTime;
            self.havTime.text = [NSString stringWithFormat:@"%02ld:%02ld",time/60,time%60];
            //    NSLog(@"----self.havTime.text---%@",self.havTime.text);
        
        
        
        }
        
        #pragma mark - 播放器代理方法
        -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
            NSLog(@"音乐播放完成...");
            self.playProgress.progress = 0;
            self.playOrPause.selected = !self.playOrPause.selected;         
        }

相关链接
视频和音频
音频相关

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,033评论 4 62
  • 你何时来 梧桐换新绿 你何时走 落红化春泥 我沉睡在春天里 期盼永远不要醒来 初夏的蝉声却恼人 惊醒了梦中人 推开...
    橘子君_澜阅读 224评论 0 2
  • 她是你一颗糖就能收买的女孩,也是你十座金山都换不回的姑娘 一 好朋友狗子在遇到女神之前还谈过一...
    郝家火阅读 436评论 0 1
  • 过往两相看,静美一心人。同生共长,不离不弃,我们真好,甜蜜如一。 澹泊明志,宁静致远。君子相邀,不负知交。写下一些...
    窗花阅读 186评论 1 2
  • 嗨,大家好,我是此号老大,墨菲工作很忙,再忙,也得好好的吃饭不是?如果工作&生活是一场不服输的较量,那么锅碗瓢盆碰...
    墨与菲阅读 148评论 0 0