zoukankan      html  css  js  c++  java
  • iOS多媒体总结&进入后台播放音乐

    1. 播放mp3需要导入框架,AVFoundation支持音频文件(.caf、.aif、.wav、.wmv和.mp3)的播放。

    #import <AVFoundation/AVFoundation.h>//音频播放框架

    步骤:

    a.声明一个音频播放对象:

    {
       AVAudioPlayer *_player;
    }

    b.用一个支持的文件路径来初始化_player: (据说只能播放本地文件,像酷我等音乐软件应该是播放前下载到本地,然后进行播放的,因为在用酷我时,隔断时间就会提示我内存过大,请清理,应该就清理下载到到本地的音频文件)

        NSString *path=[[NSBundle mainBundle]pathForResource:@"纯音乐-The True That You Leave" ofType:@"mp3"];
        _player=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
        [_player prepareToPlay];
        [_player play];
        //[_player pause];暂停
        //[_player stop];停止
        _player.volume=1;//音量 0.0-1.0

    c. 如果想看播放时间可以注册一个定时器:

    [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(player) userInfo:nil repeats:YES];
    NSLog(@"音频当前时间%lf",_player.currentTime);//音频当前时间
    NSLog(@"音频总时间%lf",_player.duration);//音频总时间

    d. 这样就实现了,如果想加个进度条,可以用UISlider: 下面这个是从Xib中拖出来的

    @property (weak, nonatomic) IBOutlet UISlider *musicPlaySlider;

    //更新时间进度条这样做
        self.musicPlaySlider.value = (float)_player.currentTime/_player.duration;

    //想移动UISlider 从指定那个时刻开始播放这样做
        [self.musicPlaySlider addTarget:self action:@selector(moveMusicPlaySlider:) forControlEvents:UIControlEventValueChanged];

    然后实现moveMusicPlaySlider:方法:
    -(void)moveMusicPlaySlider:(UISlider *)sender{
        NSLog(@"slider改变%f",sender.value);
        self.musicPlaySlider.value = sender.value;
        [_player stop];
        _player.currentTime = _player.duration * sender.value;//给指定位置播放
        [_player play];
        
    }

    音乐进度条3方应该很好找吧...

    2. 播放mp4需要导入

    #import <MediaPlayer/MediaPlayer.h>

    步骤:

    a. 声明一个视频播放器控制器

    @property (nonatomic,strong) MPMoviePlayerController *moviePlayer;

    b. 初始化moviePlayer可以放到懒加载:

    -(MPMoviePlayerController *)moviePlayer {
      
        if (!_moviePlayer) {
            NSURL *url = [self getFileUrl];
            _moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:url];
            _moviePlayer.view.frame = self.view.bounds;
            _moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
            [self.view addSubview:_moviePlayer.view];
        }
        return _moviePlayer;
    }

    c. 开始播放:

    //播放
        [self.moviePlayer play];
    如果想看播放状态,截屏等 可以写一个方法注册通知:
    -(void)addNotification {

        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
        [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
        [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
        //缩略图截屏完成
        [notificationCenter addObserver:self selector:@selector(mediaPlayerThumbnailRequestFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:self.moviePlayer];
        
    }

    然后这个方法里查看播放状态:
    -(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification {
        /*
         MPMoviePlaybackStateStopped,
         MPMoviePlaybackStatePlaying,
         MPMoviePlaybackStatePaused,
         MPMoviePlaybackStateInterrupted,
         MPMoviePlaybackStateSeekingForward,
         MPMoviePlaybackStateSeekingBackward
         */
        switch (self.moviePlayer.playbackState) {
            case MPMoviePlaybackStatePlaying:
                NSLog(@"playing...");
                break;
            case MPMoviePlaybackStatePaused:
                NSLog(@"paused...");
                break;
            case MPMoviePlaybackStateStopped:
                NSLog(@"stop...");
                break;
            default:
                NSLog(@"playsatus...%li",self.moviePlayer.playbackState);
                break;
        }
    }

    如果想播放时指定时间点截图可以这样做:
    //获取2.0s时刻缩略图
        [self.moviePlayer requestThumbnailImagesAtTimes:@[@2.0] timeOption:MPMovieTimeOptionNearestKeyFrame];
    然后在上面通知里的方法处理截图:
    // 缩略图请求完成,此方法每次截图成功都会调用一次
    -(void)mediaPlayerThumbnailRequestFinished:(NSNotification *)notification{
        /*
         {name = MPMoviePlayerThumbnailImageRequestDidFinishNotification; object = <MPMoviePlayerController: 0x608000004ba0>; userInfo = {
         MPMoviePlayerThumbnailImageKey = "<UIImage: 0x6080000914e0>, {640, 352}";
         MPMoviePlayerThumbnailTimeKey = 0;
         }}
         */
        NSLog(@"视频截图完成...%@",notification);
        UIImage *image=notification.userInfo[MPMoviePlayerThumbnailImageKey];
        //保存图片到相册(首次调用会请求用户获得访问相册权限)
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
        //保存截图会暂停播放,继续
        if (self.moviePlayer.playbackState == 2) {
            [self.moviePlayer play];
        }
    }



    3. 调用系统相册

    UIImagePickerController *imagePicker=[[UIImagePickerController alloc]init];
        imagePicker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
    //    UIImagePickerControllerSourceTypePhotoLibrary,相册
    //    UIImagePickerControllerSourceTypeCamera,调用相机
    //    UIImagePickerControllerSourceTypeSavedPhotosAlbum相簿
        imagePicker.delegate=self;
        [self presentViewController:imagePicker animated:YES completion:^{}];
    
    然后在代理方法中处理图片:
    #pragma mark - UIImagePickerControllerDelegate
    //照片选择完成回调代理
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    }

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{
        UIImageView *view=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
        [view setImage:image];
        [self.view addSubview:view];
    }

    基本使用就这些...待完善

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    看到黑马做的那个百度音乐播放器,自己照着视频写了一遍,也没有很好的完善,就是熟悉了一下大致思路 Demo地址:

    https://github.com/nwgdegitHub/musicPlayDemo

    4. 模拟器上进入后台仍能播放音乐,真机上要设置2个地方,一个是Capabilities中Backgroud Modes的第一个开关,另一个是在Appdelegate加点代码:

    UIBackgroundTaskIdentifier _bgTaskId;
    - (void)applicationWillResignActive:(UIApplication *)application {
        
        //开启后台处理多媒体事件
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        AVAudioSession *session=[AVAudioSession sharedInstance]; [session setActive:YES error:nil];
        //后台播放
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        //这样做,可以在按home键进入后台后 ,播放一段时间,几分钟吧。但是不能持续播放网络歌曲,若需要持续播放网络歌曲,还需要申请后台任务id,具体做法是:
        _bgTaskId = [AppDelegate backgroundPlayerID:_bgTaskId];
    }
    //实现一下backgroundPlayerID:这个方法:
    +(UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId {
        //设置并激活音频会话类别
        AVAudioSession *session=[AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; [session setActive:YES error:nil];
        //允许应用程序接收远程控制
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        //设置后台任务ID
        UIBackgroundTaskIdentifier newTaskId=UIBackgroundTaskInvalid; newTaskId=[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; if(newTaskId!=UIBackgroundTaskInvalid&&backTaskId!=UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:backTaskId]; } return newTaskId;
    }

    这样就能实现进入后台播放了。参考来自  http://www.jianshu.com/p/03d80157948a

    此文仅为鄙人学习笔记之用,朋友你来了,如有不明白或者建议又或者想给我指点一二,请私信我。liuw_flexi@163.com/QQ群:582039935. 我的gitHub: (学习代码都在gitHub) https://github.com/nwgdegitHub/
  • 相关阅读:
    ubuntu下安装oracle
    网站框架策划时的小技巧--页面原型篇
    中国电商价格欺诈何时休?
    系统升级日记(4):如何快速的修改Infopath中的各种URL
    系统升级日记(3)- 升级SharePoint解决方案和Infopath
    系统升级日记(2)- 升级到SharePoint Server 2013
    系统升级日记(1)- 升级到SQL Server 2012
    【译】《C# Tips -- Write Better C#》
    [.NET] 一步步打造一个简单的 MVC 电商网站
    反骨仔的 2016 年度全文目录索引
  • 原文地址:https://www.cnblogs.com/liuw-flexi/p/7506502.html
Copyright © 2011-2022 走看看