IOS 基于AV Foundation框架开发简单音乐播放器
发布日期:2021-10-02 15:44:24 浏览次数:1 分类:技术文章

本文共 3050 字,大约阅读时间需要 10 分钟。

虽然Media Player 框架也可实现音乐播放功能,具体参考如下文章:

但是Apple推荐使用 AV Foundation框架来实现音频播放功能。另外,AV Foundation框架还提供了录音功能,可以在App中之间录制声音文件。

  • AVAudioRecorder — 录音功能;
  • AVAudioPlayer — 播放音频功能;

我们基于AV Foundation框架,实现了一个简单的音乐播放器MusicPlayer,App运行界面如下所示:

示例App的功能是,播放在项目本地的多个 MP3 音频文件,示例App中添加了2首侃侃的歌曲:嘀嗒 和 网络情缘。EntLib.com Team Leader 最爱的曲目之一。

简单的旋律,沙哑的声音。

低沉、婉转、略带忧伤和沧桑。
淡淡唱来,象水一样穿越你的心灵。

Xcode项目采用Single View Application模板,项目名称MusicPlayer,类前缀MusicPlayer。

开发环境:Xcode 4.5 + iOS 6 iPhone 模拟器

使用AV Foundation框架需要注意的几个问题:

(1) 项目中引入AVFoundation框架;

(2) 在项目相应头文件中,需要import 2个接口文件,分别为:

#import <AVFoundation/AVFoundation.h>

#import <CoreAudio/CoreAudioTypes.h>

(3) 在项目相应头文件需要遵守协议 AVAudioPlayerDelegate,并将播放器的delegate属性设置为self;

(4) 实现协议方法audioPlayerDidFinishPlaying:successfully:负责处理音频播放结束之后的处理,如继续播放下一首歌曲等等;

本示例程序音乐播放器MusicPlayer的全部源代码如下所示。

MusicPlayerViewController.h 头文件源代码:

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

@interface MusicPlayerViewController : UIViewController <AVAudioPlayerDelegate>

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
@property (strong, nonatomic) IBOutlet UIButton *musicButton;
@property (strong, nonatomic) IBOutlet UILabel *songLabel;

- (IBAction)playMusic:(id)sender;

@end
MusicPlayerViewController.m 实现文件源代码:

//

//  MusicPlayerViewController.m
//  MusicPlayer
//
//  Created by EntLib.com on 12-10-12.
//  Copyright (c) 2012年 EntLib.com. All rights reserved.
//
#import "MusicPlayerViewController.h"

@interface MusicPlayerViewController ()

@end

@implementation MusicPlayerViewController

NSArray *audioArray;

NSString *audioFile;
int audioIndex;

- (void)viewDidLoad

{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
audioArray = [NSArray arrayWithObjects:@"嘀嗒",@"网络情缘", nil];
audioIndex = 0;
}

- (void)didReceiveMemoryWarning

{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)playAudio:(int)audioIndex{

audioFile = [audioArray objectAtIndex:audioIndex];
self.songLabel.text = [[NSString alloc]initWithFormat:@"正在播放:%@", audioFile ];
NSURL *audioFileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:audioFile ofType:@"mp3"]];
self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:nil];
self.audioPlayer.delegate = self;
[self.audioPlayer play];
}

- (IBAction)playMusic:(id)sender {

if ([self.musicButton.titleLabel.text isEqualToString:@"播放音乐"]) {
[self playAudio:0];
[self.musicButton setTitle:@"暂停" forState:UIControlStateNormal];
}else if([self.musicButton.titleLabel.text isEqualToString:@"播放"]){
[self.audioPlayer play];
[self.musicButton setTitle:@"暂停" forState:UIControlStateNormal];
}else {
[self.audioPlayer pause];
[self.musicButton setTitle:@"播放" forState:UIControlStateNormal];
}
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{

// play the next audio - 播放下一首歌曲
if (audioIndex < audioArray.count) {
audioIndex++;
}
if(audioIndex == audioArray.count){
audioIndex = 0;
}
[self playAudio:audioIndex];
}
@end

转载地址:https://blog.csdn.net/jinyeweiyang/article/details/41286331 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iOS程序进入后台后仍运行定时器NSTimer
下一篇:smarty

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月21日 18时16分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

MySQL5.7 固态盘性能设置_MySQL 5.7 安装完成后,立即要调整的性能选项 2019-04-21
idea java web mysql_解决idea中javaweb的mysql8.0.15配置问题 2019-04-21
mysql.net 环境配置_windows环境下下安装配置mysql5.7.24 2019-04-21
servlet对象是在服务器端还是在客户端被创建?_Servlet编程之会话管理 2019-04-21
sqoop mysql hadoop_如何将mysql数据导入Hadoop之Sqoop安装 2019-04-21
webpack卸载_webpack的安装 2019-04-21
mysql主库线程_MySQL 主从扩展--主库的线程状态 2019-04-21
phpmyadmin管理mysql_LAMP实验二:使用phpMyAdmin管理MySQL 2019-04-21
mysql一秒最多写多少次_Mysql的两种“超过多少次”写法(力扣596) 2019-04-21
mysql el函数_MySQL中的常用函数 2019-04-21
mysql 备份 晓燕_mysql字符串函数 2019-04-21
mysql返回第n个值_获取mysql一组数据中的第N大的值 2019-04-21
java读文件几种方式_JAVA读取文件的几种方式 2019-04-21
java arraylist常用方法_C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)... 2019-04-21
如何实现java文档注释_JavaDoc注释与帮助说明文档 2019-04-21
Java一亿电话号码去重_20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap... 2019-04-21
java判断ipv6地址类型_IPv6地址类型与格式 2019-04-21
linux java jdk_linux安装JDK 2019-04-21
java的showcase_java – 如何在Eclipse中导入ShowcaseView? 2019-04-21
JAVA中math的作用_Java中Random 和 Math 的概述及使用(二十六) 2019-04-21