Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)
一、StreamingKit介绍和配置
1,基本介绍
2,主要特点
- 免费开源
- 简洁的 API
- 可读性很强的源代码
- 精心使用多线程提供了一个快速响应的 API,既能防止线程阻塞,又能保证缓冲流畅
- 缓冲并无缝播放所有不同格式的音频文件
- 容易实现的音频数据源(支持本地、HTTP、AutoRecovering HTTP 作为数据源)
- 容易 kuo 扩展数据源以支持自动缓冲、编码等
- 低耗电和低 CPU 使用率(CPU 使用率 0%,流式处理时使用率为 1%)
- 优化线性数据源,仅随机访问数据源需要搜索
- StreamingKit0.2.0 使用 AudioUnit API 而不是速度较慢的音频队列 API,允许对原始 PCM 数据进行实时截取以获得并行测量、EQ 等特征
- 电能计量
- 内置的均衡器(iOS5.0 及以上版本、OSX10.9 及以上版本)支持音频播放的同时动态改变、启用、禁用均衡器
- 提供了 iOS 和 Mac OSX 应用实例
3,安装配置
1
|
# import "STKAudioPlayer.h"
|
二、制作一个网络音频播放器
1,效果图
2,实现步骤
1
2
3
4
5
|
<key> NSAppTransportSecurity </key>
<dict>
<key> NSAllowsArbitraryLoads </key>
< true />
</dict>
|
(2)为了让播放器能在后台持续播放,我们需要将 Targets -> Capabilities -> BackgroundModes 设为 ON,同时勾选“ Audio, AirPlay, and Picture in Picture”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import UIKit
import AVFoundation
@UIApplicationMain
class AppDelegate : UIResponder , UIApplicationDelegate {
var window: UIWindow ?
func application(_ application: UIApplication , didFinishLaunchingWithOptions
launchOptions: [ UIApplicationLaunchOptionsKey : Any ]?) -> Bool {
// 注册后台播放
let session = AVAudioSession .sharedInstance()
do {
try session.setActive( true )
try session.setCategory( AVAudioSessionCategoryPlayback )
} catch {
print (error)
}
return true
}
func applicationWillResignActive(_ application: UIApplication ) {
}
func applicationDidEnterBackground(_ application: UIApplication ) {
}
func applicationWillEnterForeground(_ application: UIApplication ) {
}
func applicationDidBecomeActive(_ application: UIApplication ) {
}
func applicationWillTerminate(_ application: UIApplication ) {
}
}
|
(3)主视图代码( ViewController.swift)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
import UIKit
class ViewController : UIViewController {
//显示歌曲标题
@IBOutlet weak var titleLabel: UILabel !
//暂停按钮
@IBOutlet weak var pauseBtn: UIButton !
//可拖动的进度条
@IBOutlet weak var playbackSlider: UISlider !
//当前播放时间标签
@IBOutlet weak var playTime: UILabel !
//更新进度条定时器
var timer: Timer !
//音频播放器
var audioPlayer: STKAudioPlayer !
//播放列表
var queue = [ Music (name: "歌曲1" ,
url: URL (string: "http://mxd.766.com/sdo/music/data/3/m10.mp3" )!),
Music (name: "歌曲2" ,
url: URL (string: "http://mxd.766.com/sdo/music/data/3/m12.mp3" )!),
Music (name: "歌曲3" ,
url: URL (string: "http://mxd.766.com/sdo/music/data/3/m13.mp3" )!)]
//当前播放音乐索引
var currentIndex: Int = -1
//是否循环播放
var loop: Bool = false
//当前播放状态
var state: STKAudioPlayerState = []
override func viewDidLoad() {
super .viewDidLoad()
//设置进度条相关属性
playbackSlider!.minimumValue = 0
playbackSlider!.isContinuous = false
//重置播放器
resetAudioPlayer()
//开始播放歌曲列表
playWithQueue(queue: queue)
//设置一个定时器,每三秒钟滚动一次
timer = Timer .scheduledTimer(timeInterval: 0.1, target: self ,
selector: #selector(tick), userInfo: nil , repeats: true )
}
//重置播放器
func resetAudioPlayer() {
var options = STKAudioPlayerOptions ()
options.flushQueueOnSeek = true
options.enableVolumeMixer = true
audioPlayer = STKAudioPlayer (options: options)
audioPlayer.meteringEnabled = true
audioPlayer.volume = 1
audioPlayer.delegate = self
}
//开始播放歌曲列表(默认从第一首歌曲开始播放)
func playWithQueue(queue: [ Music ], index: Int = 0) {
guard index >= 0 && index < queue.count else {
return
}
self .queue = queue
audioPlayer.clearQueue()
let url = queue[index].url
audioPlayer.play(url)
for i in 1 ..< queue.count {
audioPlayer.queue(queue[ Int ((index + i) % queue.count)].url)
}
currentIndex = index
loop = false
}
//停止播放
func stop() {
audioPlayer.stop()
queue = []
currentIndex = -1
}
//单独播放某个歌曲
func play(file: Music ) {
audioPlayer.play(file.url)
}
//下一曲
func next() {
guard queue.count > 0 else {
return
}
currentIndex = (currentIndex + 1) % queue.count
playWithQueue(queue: queue, index: currentIndex)
}
//上一曲
func prev() {
currentIndex = max (0, currentIndex - 1)
playWithQueue(queue: queue, index: currentIndex)
}
//下一曲按钮点击
@IBAction func nextBtnTapped(_ sender: Any ) {
next()
}
//上一曲按钮点击
@IBAction func prevBtnTapped(_ sender: Any ) {
prev()
}
//暂停继续按钮点击
@IBAction func pauseBtnTapped(_ sender: Any ) {
//在暂停和继续两个状态间切换
if self .state == .paused {
audioPlayer.resume()
} else {
audioPlayer.pause()
}
}
//结束按钮点击
@IBAction func stopBtnTapped(_ sender: Any ) {
stop()
}
//定时器响应,更新进度条和时间
func tick() {
if state == .playing {
//更新进度条进度值
self .playbackSlider!.value = Float (audioPlayer.progress)
//一个小算法,来实现00:00这种格式的播放时间
let all: Int = Int (audioPlayer.progress)
let m: Int =all % 60
let f: Int = Int (all/60)
var time: String = ""
if f<10{
time= "0\(f):"
} else {
time= "\(f)"
}
if m<10{
time+= "0\(m)"
} else {
time+= "\(m)"
}
//更新播放时间
self .playTime!.text=time
}
}
//拖动进度条改变值时触发
@IBAction func playbackSliderValueChanged(_ sender: Any ) {
//播放器定位到对应的位置
audioPlayer.seek(toTime: Double (playbackSlider.value))
//如果当前时暂停状态,则继续播放
if state == .paused
{
audioPlayer.resume()
}
}
override func didReceiveMemoryWarning() {
super .didReceiveMemoryWarning()
}
}
//Audio Player相关代理方法
extension ViewController : STKAudioPlayerDelegate {
//开始播放歌曲
func audioPlayer(_ audioPlayer: STKAudioPlayer ,
didStartPlayingQueueItemId queueItemId: NSObject ) {
if let index = (queue.index { $0.url == queueItemId as ! URL }) {
currentIndex = index
}
}
//缓冲完毕
func audioPlayer(_ audioPlayer: STKAudioPlayer ,
didFinishBufferingSourceWithQueueItemId queueItemId: NSObject ) {
updateNowPlayingInfoCenter()
}
//播放状态变化
func audioPlayer(_ audioPlayer: STKAudioPlayer ,
stateChanged state: STKAudioPlayerState ,
previousState: STKAudioPlayerState ) {
self .state = state
if state != .stopped && state != .error && state != .disposed {
}
updateNowPlayingInfoCenter()
}
//播放结束
func audioPlayer(_ audioPlayer: STKAudioPlayer ,
didFinishPlayingQueueItemId queueItemId: NSObject ,
with stopReason: STKAudioPlayerStopReason ,
andProgress progress: Double , andDuration duration: Double ) {
if let index = (queue.index {
$0.url == audioPlayer.currentlyPlayingQueueItemId() as ! URL
}) {
currentIndex = index
}
//自动播放下一曲
if stopReason == .eof {
next()
} else if stopReason == .error {
stop()
resetAudioPlayer()
}
}
//发生错误
func audioPlayer(_ audioPlayer: STKAudioPlayer ,
unexpectedError errorCode: STKAudioPlayerErrorCode ) {
print ( "Error when playing music \(errorCode)" )
resetAudioPlayer()
playWithQueue(queue: queue, index: currentIndex)
}
//更新当前播放信息
func updateNowPlayingInfoCenter() {
if currentIndex >= 0 {
let music = queue[currentIndex]
//更新标题
titleLabel.text = "当前播放:\(music.name)"
//更新暂停按钮名字
let pauseBtnTitle = self .state == .playing ? "暂停" : "继续"
pauseBtn.setTitle(pauseBtnTitle, for : .normal)
//设置进度条相关属性
playbackSlider!.maximumValue = Float (audioPlayer.duration)
} else {
//停止播放
titleLabel.text = "播放停止!"
//更新进度条和时间标签
playbackSlider.value = 0
playTime.text = "--:--"
}
}
}
//歌曲类
class Music {
var name: String
var url: URL
//类构造函数
init (name: String , url: URL ){
self .name = name
self .url = url
}
}
|
源码下载: hangge_1667.zip
原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1667.html
Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)相关推荐
- Python制作一个多功能音乐播放器
文章目录 一.制作播放器的思路 二.制作播放器知识点和所需模块 三.播放器的代码展示 一.制作播放器的思路 制作一个多功能音乐播放器的思路 确定播放器的需求和功能,例如支持哪些音频格式.播放列表管理. ...
- 用html制作一个音乐排行榜,使用原生JavaScript制作一个漂亮的音乐播放器
简单介绍 起初在简书上发现了这篇博客--[html.css.jq]制作一个简洁的音乐播放器.这是一个用jQuery库实现的音乐播放器,界面简约大气. 我在这个基础上,反其道而行,使用原生JavaScr ...
- 【html、css、jq】制作一个简洁的音乐播放器
声明:本文章版权归饥人谷和张新望所有,转载需经作者同意 这个播放器的音乐是通过豆瓣FM的API获取到的,我们可以随机的听到豆瓣FM的任何音乐.(这些API是饥人谷的老师整理的) DEMO html+j ...
- 制作一个简单的音乐播放器
舞台布置及所加的元件如下图 然后直接在放代码即可. //声明 var jzdz:URLRequest=new URLRequest("http://59.52.188.151/s2.mp3& ...
- 【Python案例】——制作一个简易的音乐播放器【轻松入门】
目录
- kivy制作安卓APP--简单音乐播放器
简述 python kivy库制作的安卓简单音乐播放器,是一个简单小demo,本来用来年会节目控制音乐流程的,分享出来给大家参考,自带kivy launch将该文件解压到根目录,安装里面的launch ...
- C#制作简单的本地音乐播放器(二)—— 显示歌词
此篇文章主要补充 C#制作简单的本地音乐播放器(一) 中的"歌词显示"部分的内容. 页面设计部分 相关内容 本程序使用的歌词文件为lrc格式,lrc是英文lyric(歌词)的缩写, ...
- 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))
当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼. 那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验. 下面我会分享一下如 ...
- 用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲
一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...
最新文章
- ionic3中使用自定义配置
- php 外部调用内部变量,PHP 如何在方法体外部获取内部变量?
- [译] MDC-101 Flutter:Material Components(MDC)基础(Flutter)
- UA MATH567 高维统计II 随机向量8 图的max-cut问题 0.5近似算法
- vim 格式化json
- Day11多态部分-2 【1.2 多态的前提】
- Catlike Coding网站文章解析 -- 1.Procedural Grid
- python 示例_Python使用示例设置add()方法
- win2003域迁移实战记录
- mysql 增删改查操作笔记
- ftp匿名登录_flashfxp4,flashfxp4简介及好用的FTP工具
- Android系统 固定住CPU频率
- util.Date插入数据库有时差
- HTML 引用小图标
- 面向三种典型程序语言的中小学计算思维课堂设计研究
- deepin做服务器稳定吗,deepin从兴致勃勃到彻底放弃
- uni-app学习日记7
- mfrc522 c语言程序,MF RC522 51单片机测试程序
- python编辑程序、根据输入的百分制数_输入一个百分制成绩,利用switch语句编写程序,要求输出成绩等级A B C D,E。90以上为A...
- 基于Python实现期权定价和股票技术指标
热门文章
- static变量、static函数与普通变量、普通函数的区别
- [RK3288][Android6.0] 调试笔记 --- Camera丢帧检测
- ipv6单播地址包括哪两种类型_IPv6 地址类型和格式
- niosII的那些事--基于AVALON总线的IP核定制
- python处理表格数据教程_代码详解:使用Python从不同表格中提取数据
- 图像特征提取之DoG算子
- 项目提交到GitHub(全流程)
- django + uwsgi 问题解决 io.UnsupportedOperation: fileno
- 几种REST客户端简介(附下载路径)
- 计算机一级windows7打印机,win7共享打印机设置教程