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=;//音量 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

iOS多媒体总结&进入后台播放音乐的更多相关文章

  1. iOS设备后台播放音乐方法

    iOS设备后台播放音乐方法 1 在设置Capabliites中打开Background Modes,选择Audio And AirPlay 2 在控制viewDidLoad中添加下面代码 AVAudi ...

  2. iOS后台播放音乐

    iOS实现在后台播放音乐 iOS4之后就支持后台播放音频了.只需下面两步就可以实现后台播放音频操作了. 1. 在Info.plist中,添加"Required background mode ...

  3. iOS- 关于AVAudioSession的使用——后台播放音乐

    1.前言 •AVAudioSession是一个单例,无需实例化即可直接使用.AVAudioSession在各种音频环境中起着非常重要的作用 •针对不同的音频应用场景,需要设置不同的音频会话分类   1 ...

  4. IOS后台运行 之 后台播放音乐

    iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...

  5. iOS 后台播放音乐

    在info.plist文件中添加 下面是后台播放音频的完整测试代码: 引入文件<AVFoundation/AVFoundation.h> //后台播放音频设置 AVAudioSession ...

  6. ios 后台播放音乐1条注意事项

    除了设置程序的后台模式,还需要几行代码 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory: ...

  7. iOS 实现后台 播放音乐声音 AVAudioPlayer 以及铃声设置(循环播放震动)

    1.步骤一:在Info.plist中,添加"Required background modes"键,value为:App plays audio 或者: 步骤二: - (BOOL) ...

  8. H5页面在IOS下不会自动播放音乐的坑

    document.addEventListener(‘DOMContentLoaded‘, function () { function audioAutoPlay() { var audio = d ...

  9. MUI---IOS切换到后台继续播放音乐

    应用切换到后台继续音乐播放HBuilder默认生成的应用在iOS是不支持后台音乐播放的,当应用切换到后台时音乐将暂停播放,下次切换到前台继续播放.如果要支持应用切换到后台后继续播放音乐功能需要进行额外 ...

随机推荐

  1. js-禁止长页面滚动

    标题的需求问题其实我经常遇到.尤其是在碰到页面同时出现有视频及弹层的情况. 当然我说的问题皆是针对微信H5开发的哈 IOS中,视频播放,弹层出现时,视频在弹层的下面,不会出现问题: 安卓手机中,完了, ...

  2. SoapUI学习之SOAP和REST的区别

    一.Soap和Rest的定义 SOAP(Simple Object Access Protocol 简单对象访问协议),用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,事实上 ...

  3. PYTHON2.7之前需要独立安装pip

    如果python2版本是>=2.7.9, python3版本是>=3.4, pip已将一起随python安装成功了. 对于Python 2.6,你需要更旧setuptools.适用于Pyt ...

  4. 5G调研与总结

    5G的重点是: 将极大地超越现有的4G,主要包括速度,时延,带宽,能耗等方面 传输速度的快速提高(相对于4G来说提升了近10倍),在万物物联上的作用会更大 由于传速度快,让各种远程操控成为了可能(AR ...

  5. 应用安全 - 安全设备 - WAF原理/检测/绕过

    原理 基于Cookie值 Citrix Netscaler(2013年使用广泛) “Citrix Netscaler”会在HTTP返回头部Cookie位置加入“ns_af”的值,可以以此判断为Citr ...

  6. 前端 CSS的选择器 伪类选择器 CSS3 nth-child()

    first-child 选中第一个标签 应用CSS样式 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. SpringMvc参数绑定出现乱码解决方法

    在SpringMvc参数绑定过程中出现乱码的解决方法 1.post参数乱码的解决方法 在web.xml中添加过滤器 <!-- 过滤器 处理post乱码 --> <filter> ...

  8. Java数据结构之队列(Queue)

    1.使用场景 银行排队的案例: 2.队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则: 先存入队列的数据,要先取出. 后存入的要后取出 示意图:(使用数组模拟队列示意图) ...

  9. 找不到opencv_world320d.dll的问题

    OpenCV执行时出现找不到opencv_world320d.dll的问题,解决办法:把自己opencv文件目录下的D:\opencv3.2.0\opencv\build\x64\vc14\bin(本 ...

  10. 搜索(DFS)---填充封闭区域

    填充封闭区域 130. Surrounded Regions (Medium) For example, X X X X X O O X X X O X X O X X After running y ...