基于AVPlayer的音乐播放器

1,最近写了一个关于音乐播放器的demo,查阅资料的过程中,学会不少新东西。简单记录一下写的过程中遇到问题,备忘。

2,为了方便使用,将播放器写成单例  .h

先导入需要的库

#import <AudioToolbox/AudioToolbox.h>

#import <AVFoundation/AVFoundation.h>

#import <objc/runtime.h>

生成一个播放器的实例

@property (nonatomic,strong) AVPlayer *AVplay;

@property (nonatomic,strong) AVPlayerItem *AVItem;

3, 在.m文件中实现方法

AVplay = [[AVPlayer alloc] init];

添加播放完成的通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:AVplay.currentItem];

-(void)playbackFinished:(NSNotification *)notification{

/*

  播放完成后的操作在这里进行,比如播放下一曲

  */

}

4,初始化播放的链接

AVItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:url]];

[AVplay replaceCurrentItemWithPlayerItem:AVItem];

5,点击播放按钮,控制播放和暂停

_isPlaying = !_isPlaying;

if (_isPlaying) {

[self resume]; // 开始/继续 播放

}else{

[self pause]; // 暂停

}

- (void)resume{

[AVplay play];

}

- (void)pause{

[AVplay pause];

}

6,上一曲、下一曲 调用4的方法,AVItem重新赋值

7,获得当前播放的进度,赋值给进度条

-(float)progress{

float percentage = (CMTimeGetSeconds(AVplay.currentItem.currentTime)/CMTimeGetSeconds(AVplay.currentItem.duration));

return percentage;

}

8,获得进度条移动后的值,调整播放的进度

-(void)moveToSection:(CGFloat)section{

int32_t timeScale = AVplay.currentItem.asset.duration.timescale;

Float64 playerSection = CMTimeGetSeconds(AVplay.currentItem.duration) * section;

[AVplay seekToTime:CMTimeMakeWithSeconds(playerSection, timeScale) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

}

9,为了实现后台播放

// 后台播放 设置 音频会话类型

//需要 导入头文件  #import <AVFoundation/AVFoundation.h>

AVAudioSession *session = [AVAudioSession sharedInstance];

NSError *setCategoryError = nil;

BOOL success = [session setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];

if (!success)

{

return;

}

NSError *activationError = nil;

success = [session setActive:YES error:&activationError];

if (!success)

{

return;

}

同时还要再info.plist文件中找到 Required background modes 这一行,添加key值 选择App plays audio or streams audio/video using AirPlay

10,为了实现锁屏时显示播放信息

- (void)applicationDidEnterBackground:(UIApplication *)application {

// 让应用在后台运行

[application beginBackgroundTaskWithExpirationHandler:nil];

// 为了显示锁屏状态下的内容

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[self becomeFirstResponder]; // 相应事件

//刚进入后台时刷新一下锁屏内容

[[PlayManager sharedInstance] configPlayingInfo];

}

//判断时间类型

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

{

if (event.type == UIEventTypeRemoteControl) {

switch (event.subtype) {

case UIEventSubtypeRemoteControlPlay:

[[PlayManager sharedInstance] resume]; // 播放

break;

case UIEventSubtypeRemoteControlPause:

[[PlayManager sharedInstance] pause];//暂停

break;

case UIEventSubtypeRemoteControlPreviousTrack:

[[PlayManager sharedInstance] last]; // 播放上一曲按钮

break;

case UIEventSubtypeRemoteControlNextTrack:

[[PlayManager sharedInstance] next]; // 播放下一曲按钮

break;

default:

break;

}

}

}

//进入前台后取消相应

- (void)applicationWillEnterForeground:(UIApplication *)application {

[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

[self resignFirstResponder];

}

11,锁屏显示的内容的方法

- (void)configPlayingInfo{

if (_currentModel!=nil) {

if (NSClassFromString(@"MPNowPlayingInfoCenter")) {

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];

[dict setObject:_currentModel.title forKey:MPMediaItemPropertyTitle];//歌曲名设置

[dict setObject:_currentModel.source_name forKey:MPMediaItemPropertyArtist];//歌手名设置

[dict setObject:[[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"car"]]  forKey:MPMediaItemPropertyArtwork];//专辑图片设置

[dict setObject:[NSNumber numberWithDouble:CMTimeGetSeconds(AVplay.currentItem.currentTime)] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; //音乐当前已经播放时间

[dict setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];//进度光标的速度 (这个随 自己的播放速率调整,我默认是原速播放)

[dict setObject:[NSNumber numberWithDouble:CMTimeGetSeconds(AVplay.currentItem.duration)] forKey:MPMediaItemPropertyPlaybackDuration];//歌曲总时间设置

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];

}

[atWorkImg sd_setImageWithURL:[NSURL URLWithString:_currentModel.cover_url] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

  //锁屏状态下显示的图片是网络的,下载完再切换,否则会出现问题

NSDictionary *dic = [[MPNowPlayingInfoCenter defaultCenter] nowPlayingInfo];

NSMutableDictionary *muDic = [[NSMutableDictionary alloc] initWithDictionary:dic];

[muDic setObject:[[MPMediaItemArtwork alloc] initWithImage:atWorkImg.image]  forKey:MPMediaItemPropertyArtwork];

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:muDic];

}];

}

}

// 暂时没有对打断事件的处理

时间: 2024-10-28 07:47:38

基于AVPlayer的音乐播放器的相关文章

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器

基于Service的音乐播放器

这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activity的界面按钮或拖动进度条时,系统通过发送广播通知后台Service来改变播放状态和播放指定音乐. 程序运行效果图:         程序代码: 程序界面类(MusicBox.java): package com.jph.musicbox; import com.jph.util.ConstUtil;

Android基于发展Service音乐播放器

这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activity的界面button或拖动进度条时,系统通过发送广播通知后台Service来改变播放状态和播放指定音乐. 程序执行效果图:         watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3l1emhlbmdmYW4=/font/5a6L5L2T/

QT5:C++实现基于Multimedia的音乐播放器(序)

前段时间C++课设,决定做个播放器,于是参考了网上的代码后,做了个很简陋的音乐播放器(只写了MP3格式)出来,虽然功能甚少,但还是决定把过程记录一下. 成品如下图: 播放器功能: 上.下一首,音量控制 单曲和列表循环.随机播放模式 添加歌曲(因为懒,连删除歌曲都没写) 所用技术:QT5,C++. 整个程序继承QT的QWidget完成,界面用qss修饰(qss的语法和CSS几乎一模一样),整个播放器主要靠QT的multimedia来完成音乐解码和播放.QMediaplayer用于解析音频文件,QM

QT5:C++实现基于multimedia的音乐播放器(二)

今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: 1 //播放模式 2 void Music::musicPlayPattern() 3 { 4 5 //z=++z%3; 6 if(z==0) 7 { 8 //顺序播放 9 playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Seq.png);}" 10 "QPushButton:hover{border-i

基于Jquery的音乐播放器进度条插件

自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下: 主要特色: ① 可自适应挂载元素的宽度,也可以自己设置进度条宽度: ② 支持部分默认参数修改(具体见使用说明): ③ 允许最大时间为23:59:59,高于此值将默认修改为此值: ④ 可以自己控制进度条动画的开关及重置: ⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用. 使用说明: /* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 *

QT5:C++实现基于multimedia的音乐播放器(一)

上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlayer),类名也随你喜欢(我的是Music),基类选择QWidget,不勾选界面UI(你也可以勾选UI,用QT自带的UI设计来创建界面),然后要记住项目保存路径不能有中文. 创建成功后,在MusicPlayer.pro(项目名称.pro)里加上"QT += multimedia"这一句: 1

html网页音乐播放器自带播放列表

基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandizhi/dom.php 全面支持手机端浏览器. 主要修改引用路径(不要修改文件相对存放地址) 第二就是正则拼接参数了 <script src="/city/js/libs/jquery-1.10.2.min.js"></script> <script src=&

SE Springer小组之《Spring音乐播放器》需求分析说明书一

软件需求说明书 软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础. 1 引言 1.1编写目的 使用户对该软件的初始规定有一个理解,也使软件开发者对该软件开发的目的.任务.需求及运行环境有一定的了解,为整个开发工作做好准备. 1.2背景 a.待开发的软件系统的名称:spring音乐播放器: b.本项目的任务提出者.开发者为宁牟明.曹乐平.莫雪萍.杨子鲲: 用户暂定为开发者自己或周围同学: C.spring音乐播放器软件系统要与本地的检