新聞中心
iOS 視頻播放器的實(shí)現(xiàn)
最近工作之余, 寫了一個視頻播放器,輸入要播放的視頻資源地址,即可實(shí)現(xiàn)播放功能。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了河?xùn)|免費(fèi)建站歡迎大家使用!
目前功能比較簡單,支持鎖屏、屏幕旋轉(zhuǎn)等基礎(chǔ)功能,后續(xù)會繼續(xù)完善。。。
下面講解下實(shí)現(xiàn)思路:
因 MediaPlayer/MediaPlayer.h 中 MPMoviePlayerController MP_DEPRECATED("Use AVPlayerViewController in AVKit.", ios(2.0, 9.0)) 在iOS9以后已經(jīng)廢棄,為了更好的兼容性,采用了 AVFoundation/AVFoundation.h 為技術(shù)實(shí)現(xiàn)方案。
框架在此就不講解了,官網(wǎng)講的比較清楚,不懂的可以查看官檔。 - 戳這里
監(jiān)聽視頻資源的加載狀態(tài), 根據(jù)不同的狀態(tài)進(jìn)行相應(yīng)的操作。
更新視頻資源的播放進(jìn)度。
實(shí)現(xiàn)控制視圖 QYPlayerControlView 的Delegate。 當(dāng)控制視圖進(jìn)行了相應(yīng)操作,事件被傳遞到該類中進(jìn)行統(tǒng)一處理。
該類中還有對操作視圖 顯示/隱藏 的方法。
后續(xù)調(diào)整視頻亮度、音量、進(jìn)度等手勢都需添加在該分類中,便于統(tǒng)一管理。
主要存放時間轉(zhuǎn)換的分類 NSString+Custom 、常用宏 QYPlayerDefine 等工具類。
1). BaseViewController 中實(shí)現(xiàn)了控制屏幕旋轉(zhuǎn)的系統(tǒng)方法,實(shí)現(xiàn)的控制器要繼承自 BaseViewController 。
2). 在子控制器中實(shí)現(xiàn)如下方法。
此時屏幕旋轉(zhuǎn)功能已經(jīng)添加成功!
以上便是整個播放器的源碼解析,具體的細(xì)節(jié)請查看源碼。
源碼放在GitHub上了,想查看的小伙伴可以 -戳這里。
千里之行,始于足下。
iOS開發(fā)中對音效和音樂播放的簡單實(shí)現(xiàn)
一、簡單介紹
簡單來說,音頻可以分為2種
(1)音效
又稱“短音頻”,通常在程序中的播放時長為1~2秒
在應(yīng)用程序中起到點(diǎn)綴效果,提升整體用戶體驗(yàn)
(2)音樂
比如游戲中的“背景音樂”,一般播放時間較長
框架:播放音頻需要用到AVFoundation.framework框架
二、音效的播放
1.獲得音效文件的路徑
復(fù)制代碼 代碼如下:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
2.加載音效文件,得到對應(yīng)的音效ID
復(fù)制代碼 代碼如下:
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), soundID);
3.播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(soundID);
注意:音效文件只需要加載1次
4.音效播放常見函數(shù)總結(jié)
加載音效文件
復(fù)制代碼 代碼如下:
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
釋放音效資源
復(fù)制代碼 代碼如下:
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效帶點(diǎn)震動
復(fù)制代碼 代碼如下:
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、程序示例
先導(dǎo)入需要依賴的框架
導(dǎo)入需要播放的音效文件素材
說明:AVFoundation.framework框架中的東西轉(zhuǎn)換為CF需要使用橋接。
代碼示例:
復(fù)制代碼 代碼如下:
YYViewController.m文件
//
// YYViewController.m
// 14-音效播放
//
// Created by apple on 14-8-8.
// Copyright (c) 2014年 yangyong. All rights reserved.
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.獲得音效文件的全路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"buyao.wav" withExtension:nil];
//2.加載音效文件,創(chuàng)建音效ID(SoundID,一個ID對應(yīng)一個音效文件)
SystemSoundID soundID=0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
//AudioServicesDisposeSystemSoundID(soundID);
//3.播放音效文件
//下面的兩個函數(shù)都可以用來播放音效文件,第一個函數(shù)伴隨有震動效果
AudioServicesPlayAlertSound(soundID);
//AudioServicesPlaySystemSound(#systemsoundid)
}
@end
說明:點(diǎn)擊屏幕可以播放音效文件。
音樂的播放
一、簡單說明
音樂播放用到一個叫做AVAudioPlayer的`類,這個類可以用于播放手機(jī)本地的音樂文件。
注意:
(1)該類(AVAudioPlayer)只能用于播放本地音頻。
(2)時間比較短的(稱之為音效)使用AudioServicesCreateSystemSoundID來創(chuàng)建,而本地時間較長(稱之為音樂)使用AVAudioPlayer類。
二、代碼示例
AVAudioPlayer類依賴于AVFoundation框架,因此使用該類必須先導(dǎo)入AVFoundation框架,并包含其頭文件(包含主頭文件即可)。
導(dǎo)入必要的,需要播放的音頻文件到項(xiàng)目中。
代碼示例:
復(fù)制代碼 代碼如下:
//
// YYViewController.m
// 15-播放音樂
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個AVAudioPlayer只能播放一個url)
AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[audioPlayer prepareToPlay];
//4.播放
[audioPlayer play];
}
@end
代碼說明:運(yùn)行程序,點(diǎn)擊模擬器界面,卻并沒有能夠播放音頻文件,原因是代碼中創(chuàng)建的AVAudioPlayer播放器是一個局部變量,應(yīng)該調(diào)整為全局屬性。
可將代碼調(diào)整如下,即可播放音頻:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *audioplayer;
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個AVAudioPlayer只能播放一個url)
self.audioplayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.audioplayer prepareToPlay];
//4.播放
[self.audioplayer play];
}
@end
注意:一個AVAudioPlayer只能播放一個url,如果想要播放多個文件,那么就得創(chuàng)建多個播放器。
三、相關(guān)說明
新建一個項(xiàng)目,在storyboard中放三個按鈕,分別用來控制音樂的播放、暫停和停止。
程序代碼如下:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個AVAudioPlayer只能播放一個url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
- (IBAction)play {
//開始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會出現(xiàn)一些莫名其面的問題
[self.player stop];
}
@end
注意:如果點(diǎn)了“停止”,那么一定要播放器重新創(chuàng)建,不然的話會出現(xiàn)莫名其妙的問題。
點(diǎn)擊了stop之后,播放器實(shí)際上就不能再繼續(xù)使用了,如果還繼續(xù)使用,那么后續(xù)的一些東西會無法控制。
推薦代碼:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
#pragma mark-懶加載
-(AVAudioPlayer *)player
{
if (_player==Nil) {
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個AVAudioPlayer只能播放一個url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
return _player;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)play {
//開始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會出現(xiàn)一些莫名其面的問題
[self.player stop];
self.player=Nil;
}
@end
四、播放多個文件
點(diǎn)擊,url,按住common建查看。
可以發(fā)現(xiàn),這個url是只讀的,因此只能通過initWithContentsOfUrl的方式進(jìn)行設(shè)置,也就意味著一個播放器對象只能播放一個音頻文件。
那么如何實(shí)現(xiàn)播放多個音頻文件呢?
可以考慮封裝一個播放音樂的工具類,下一篇文章將會介紹具體怎么實(shí)現(xiàn)。
iOS視頻播放器(Swift)
iOS上除了一些第三方的播放器之外,我們一般常用的播放方式有使用:
一般簡單的播放url可以使用網(wǎng)頁播放的模式,有很多主流app的視頻打開都是用的這種。不需要UI自定義的時候我們選擇AVPlayerViewController,比較方便快捷。自定義需求較多時最好選用AVPlayer。
功能最全、自定義最高的播放器,也是使用最多得。使用起來較為復(fù)雜些。需導(dǎo)入AVKit控件
AVPlayer功能比較多,另外寫了一篇文章:
AVPlayer播放器
只是讓視頻播放起來,沒有暫停、停止、快進(jìn)等等功能。
適用于簡單的播放,不需要過多自定義的東西,使用比較簡單,有兩種方式,需要引入AVKit框架
(1)添加view
可以設(shè)置播放器的大小
(2)作為視圖控制器彈窗
使用起來類似AVPlayerViewController的第一種方式。需要引入MediaPlayer框架(iOS9后被拋棄,使用AVPlayerViewController即可)
通知來進(jìn)行一些操作的監(jiān)聽
使用起來類似AVPlayerViewController的第二種方式。需要引入MediaPlayer框架(iOS9后被拋棄,使用AVPlayerViewController即可)
swift視頻播放器使用
iOS音樂播放器開發(fā)(擴(kuò)展)-歌詞格式
在開發(fā)音樂播放器時 , 針對歌詞的處理是必不可少的 , 而要想解析歌詞得到我們需要的數(shù)據(jù) , 首先就要了解歌詞數(shù)據(jù)的構(gòu)成格式 , 下面為大家簡單介紹幾種常見的歌詞格式.
當(dāng)今互聯(lián)網(wǎng)上 , 我們常見的歌詞格式有 LRC、TRC(天天動聽歌詞)、KRC(KuGou ResourCe , 酷狗資源文件)和 QRC(QQ音樂歌詞) . 下面我為大家分析比較這些歌詞格式.
LRC 歌詞格式是世界上最通用的歌詞格式 , 沒有之一 . 它是最基本的歌詞格式 , 幾乎沒有支持其他歌詞格式而不支持這個歌詞格式的播放器 . LRC 歌詞格式的特性就是——簡單.
簡單分析一下
首先有一些記錄歌曲及歌詞信息的東東 , 我們將其稱作"ID 標(biāo)簽" (ID Tags) , 它可以包含歌曲名 (ti) , 專集 (al) , 歌手 (ar) , 歌詞創(chuàng)建者 (by) , 歌詞延遲調(diào)整 (offset) 等信息.
下面是主體部分 , LRC 格式為每行歌詞指定起始時刻 , 格式為
以上說的是簡單的 LRC 格式 也是我們最常見的格式 . 事實(shí)上 , 還有一些對其進(jìn)行了擴(kuò)展和完善 , 比如有一種擴(kuò)展的簡單格式和一種增強(qiáng)格式.
擴(kuò)展的 LRC 格式在原來的基礎(chǔ)上支持 "男女合唱標(biāo)記" . 語法是: 在歌詞正文前添加 "M:" (男) 、"F:" (女) 或 "D:" (合) . 下面就是一個示例 . 但是 , 這種格式并沒有被廣泛使用.
增強(qiáng) LRC 格式支持在原格式基礎(chǔ)上加入了逐字精準(zhǔn)支持 . 通過在每個字 (也可以是詞) 外添加額外的時刻標(biāo)簽 分鐘:秒.百分秒 . 這種格式的設(shè)計(jì)者的主頁已經(jīng)掛掉了 , 恕我不能提供更多信息和具體的示例 . 維基百科給的示例如下:
TRC 格式是由天天動聽制定的一種歌詞格式 , 可以看作是對 LRC 格式的擴(kuò)展-----為什么我這樣說呢 ? 請看下面我從一 TRC 文件中從頭摘取的文本.
因此 , 我們可以下結(jié)論 , TRC 格式在 LRC 格式基礎(chǔ)上 , 歌詞正文中每個字的前面增加了時間標(biāo)記毫秒數(shù) , 每個字連續(xù)解析 , 支持了逐字精準(zhǔn) . (上文中"字"可理解為詞) , 這在遇到英文時尤其有用.
KRC 是酷狗公司推出的專利歌詞格式 , 主要是支持了逐字精準(zhǔn) , 解決了所謂“歌詞顯示不準(zhǔn)確”的問題 . 酷狗在很久之前在用 LRC 歌詞做卡拉 OK 效果 , 但由于 LRC 的特性問題 , 在某一行中 , 每個字的持續(xù)時間只能是平均分配的 (直到現(xiàn)在,還有不少播放器是這樣做的) , 想必是后來實(shí)在看不下去了吧 . 這里值得說一點(diǎn) , 酷狗的歌詞是經(jīng)過加密處理的 , 直接打開會看到全部都是亂碼 , 不過這種事還是難不倒萬能的天朝攻城獅 , 下面是解密后的歌詞片段:
通過觀察我們可以看出 , KRC 格式記錄了歌詞的制作者名稱、ID、個性簽名 , 歌曲的基本信息也有在列 , 還包括歌曲長度和歌曲 hash 值 . 歌曲的 hash 值是實(shí)現(xiàn)打開歌詞文件就抓取對應(yīng)歌曲要求的重要信息 . 而在正文中 , 語法為:
由此可見 , 酷狗的歌詞格式也是支持逐字同步的 , 只不過語法中最后那個 0 我是真不懂啥意思 - - , 可能是延遲偏移毫秒數(shù)或者是巴拉巴拉什么的.
QRC 是QQ音樂推出的專用歌詞格式 , 同樣支持逐字精準(zhǔn) , 先前 QRC 格式是一種比較友好和開放的格式 , 但是現(xiàn)在.....萬惡的加密 , 它現(xiàn)在變成了一種可以說比 KRC 還封閉的格式 . 現(xiàn)在我們既不能查看到其源碼 , 也無法制作這種格式的歌詞 . 下面是早年間存在于世的 QRC歌詞片段:
解析語法為 (方括號內(nèi)表示一行的 , 小括號表示每個字的) :
感覺和 KRC 很像有木有 ? 現(xiàn)在具體是什么樣 只有QQ音樂項(xiàng)目組知道了.
LRC 最簡單 , 最廣泛 , 但是沒有逐字精準(zhǔn) . TRC、KRC、QRC 支持逐字精準(zhǔn) , 但是其中 KRC 和 QRC 格式不開放 . 從這點(diǎn)上看 , TRC 是不錯的選擇 . 但是 KRC 歌詞的資源更多 (應(yīng)僅次于 LRC 的資源 ) , 既然都已經(jīng)出現(xiàn)了解析方法 , 利用下應(yīng)該也是可以的 (但 KRC 格式擁有專利 , 謹(jǐn)慎喲) , LRC 總歸來說,是只能滿足簡單需求的啦 , 如果你只是用于研究寫寫demo , TRC 和 LRC 就夠了.
最后提醒大家一下 , 如果你正在做一個音樂播放器類的APP , 那么你一定要注意解析歌詞時的容錯處理 , 千萬別因?yàn)楦柙~數(shù)據(jù)有一點(diǎn)小錯誤而導(dǎo)致你整個APP蹦掉 , 血淋淋的教訓(xùn).
本文名稱:ios開發(fā)播放器,ios專業(yè)播放器
轉(zhuǎn)載來于:http://www.ef60e0e.cn/article/phejes.html