十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在開發(fā)音樂播放器時 , 針對歌詞的處理是必不可少的 , 而要想解析歌詞得到我們需要的數(shù)據(jù) , 首先就要了解歌詞數(shù)據(jù)的構(gòu)成格式 , 下面為大家簡單介紹幾種常見的歌詞格式.
創(chuàng)新互聯(lián)建站的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
當今互聯(lián)網(wǎng)上 , 我們常見的歌詞格式有 LRC、TRC(天天動聽歌詞)、KRC(KuGou ResourCe , 酷狗資源文件)和 QRC(QQ音樂歌詞) . 下面我為大家分析比較這些歌詞格式.
LRC 歌詞格式是世界上最通用的歌詞格式 , 沒有之一 . 它是最基本的歌詞格式 , 幾乎沒有支持其他歌詞格式而不支持這個歌詞格式的播放器 . LRC 歌詞格式的特性就是——簡單.
簡單分析一下
首先有一些記錄歌曲及歌詞信息的東東 , 我們將其稱作"ID 標簽" (ID Tags) , 它可以包含歌曲名 (ti) , 專集 (al) , 歌手 (ar) , 歌詞創(chuàng)建者 (by) , 歌詞延遲調(diào)整 (offset) 等信息.
下面是主體部分 , LRC 格式為每行歌詞指定起始時刻 , 格式為
以上說的是簡單的 LRC 格式 也是我們最常見的格式 . 事實上 , 還有一些對其進行了擴展和完善 , 比如有一種擴展的簡單格式和一種增強格式.
擴展的 LRC 格式在原來的基礎(chǔ)上支持 "男女合唱標記" . 語法是: 在歌詞正文前添加 "M:" (男) 、"F:" (女) 或 "D:" (合) . 下面就是一個示例 . 但是 , 這種格式并沒有被廣泛使用.
增強 LRC 格式支持在原格式基礎(chǔ)上加入了逐字精準支持 . 通過在每個字 (也可以是詞) 外添加額外的時刻標簽 分鐘:秒.百分秒 . 這種格式的設(shè)計者的主頁已經(jīng)掛掉了 , 恕我不能提供更多信息和具體的示例 . 維基百科給的示例如下:
TRC 格式是由天天動聽制定的一種歌詞格式 , 可以看作是對 LRC 格式的擴展-----為什么我這樣說呢 ? 請看下面我從一 TRC 文件中從頭摘取的文本.
因此 , 我們可以下結(jié)論 , TRC 格式在 LRC 格式基礎(chǔ)上 , 歌詞正文中每個字的前面增加了時間標記毫秒數(shù) , 每個字連續(xù)解析 , 支持了逐字精準 . (上文中"字"可理解為詞) , 這在遇到英文時尤其有用.
KRC 是酷狗公司推出的專利歌詞格式 , 主要是支持了逐字精準 , 解決了所謂“歌詞顯示不準確”的問題 . 酷狗在很久之前在用 LRC 歌詞做卡拉 OK 效果 , 但由于 LRC 的特性問題 , 在某一行中 , 每個字的持續(xù)時間只能是平均分配的 (直到現(xiàn)在,還有不少播放器是這樣做的) , 想必是后來實在看不下去了吧 . 這里值得說一點 , 酷狗的歌詞是經(jīng)過加密處理的 , 直接打開會看到全部都是亂碼 , 不過這種事還是難不倒萬能的天朝攻城獅 , 下面是解密后的歌詞片段:
通過觀察我們可以看出 , KRC 格式記錄了歌詞的制作者名稱、ID、個性簽名 , 歌曲的基本信息也有在列 , 還包括歌曲長度和歌曲 hash 值 . 歌曲的 hash 值是實現(xiàn)打開歌詞文件就抓取對應(yīng)歌曲要求的重要信息 . 而在正文中 , 語法為:
由此可見 , 酷狗的歌詞格式也是支持逐字同步的 , 只不過語法中最后那個 0 我是真不懂啥意思 - - , 可能是延遲偏移毫秒數(shù)或者是巴拉巴拉什么的.
QRC 是QQ音樂推出的專用歌詞格式 , 同樣支持逐字精準 , 先前 QRC 格式是一種比較友好和開放的格式 , 但是現(xiàn)在.....萬惡的加密 , 它現(xiàn)在變成了一種可以說比 KRC 還封閉的格式 . 現(xiàn)在我們既不能查看到其源碼 , 也無法制作這種格式的歌詞 . 下面是早年間存在于世的 QRC歌詞片段:
解析語法為 (方括號內(nèi)表示一行的 , 小括號表示每個字的) :
感覺和 KRC 很像有木有 ? 現(xiàn)在具體是什么樣 只有QQ音樂項目組知道了.
LRC 最簡單 , 最廣泛 , 但是沒有逐字精準 . TRC、KRC、QRC 支持逐字精準 , 但是其中 KRC 和 QRC 格式不開放 . 從這點上看 , TRC 是不錯的選擇 . 但是 KRC 歌詞的資源更多 (應(yīng)僅次于 LRC 的資源 ) , 既然都已經(jīng)出現(xiàn)了解析方法 , 利用下應(yīng)該也是可以的 (但 KRC 格式擁有專利 , 謹慎喲) , LRC 總歸來說,是只能滿足簡單需求的啦 , 如果你只是用于研究寫寫demo , TRC 和 LRC 就夠了.
最后提醒大家一下 , 如果你正在做一個音樂播放器類的APP , 那么你一定要注意解析歌詞時的容錯處理 , 千萬別因為歌詞數(shù)據(jù)有一點小錯誤而導(dǎo)致你整個APP蹦掉 , 血淋淋的教訓.
我們常常會在使用app的時候,邊聽音樂(網(wǎng)易云音樂,qq音樂等)邊使用軟件,如果我們在app中使用了聲音,例如“叮~”的一聲 提醒,就會導(dǎo)致音樂的停止播放。而像微信中的語音播放,會在播放完成后音樂恢復(fù)播放,這樣的體驗就很好,那么需要怎么做呢?其實很簡單,只需要一句話就可以。
當你的app中的聲音播放完畢后,加上這一句話,被打斷的音樂便會恢復(fù)播放了。
當然還可以設(shè)置讓app的聲音和其他音樂兼容(默認是不兼容的)
withOptions后面的屬性是一個枚舉,不同的類型會有不同的效果,自己試試吧!
一、簡單介紹
簡單來說,音頻可以分為2種
(1)音效
又稱“短音頻”,通常在程序中的播放時長為1~2秒
在應(yīng)用程序中起到點綴效果,提升整體用戶體驗
(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)
播放音效帶點震動
復(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
說明:點擊屏幕可以播放音效文件。
音樂的播放
一、簡單說明
音樂播放用到一個叫做AVAudioPlayer的`類,這個類可以用于播放手機本地的音樂文件。
注意:
(1)該類(AVAudioPlayer)只能用于播放本地音頻。
(2)時間比較短的(稱之為音效)使用AudioServicesCreateSystemSoundID來創(chuàng)建,而本地時間較長(稱之為音樂)使用AVAudioPlayer類。
二、代碼示例
AVAudioPlayer類依賴于AVFoundation框架,因此使用該類必須先導(dǎo)入AVFoundation框架,并包含其頭文件(包含主頭文件即可)。
導(dǎo)入必要的,需要播放的音頻文件到項目中。
代碼示例:
復(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
代碼說明:運行程序,點擊模擬器界面,卻并沒有能夠播放音頻文件,原因是代碼中創(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)說明
新建一個項目,在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 {
//停止
//注意:如果點擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會出現(xiàn)一些莫名其面的問題
[self.player stop];
}
@end
注意:如果點了“停止”,那么一定要播放器重新創(chuàng)建,不然的話會出現(xiàn)莫名其妙的問題。
點擊了stop之后,播放器實際上就不能再繼續(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 {
//停止
//注意:如果點擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會出現(xiàn)一些莫名其面的問題
[self.player stop];
self.player=Nil;
}
@end
四、播放多個文件
點擊,url,按住common建查看。
可以發(fā)現(xiàn),這個url是只讀的,因此只能通過initWithContentsOfUrl的方式進行設(shè)置,也就意味著一個播放器對象只能播放一個音頻文件。
那么如何實現(xiàn)播放多個音頻文件呢?
可以考慮封裝一個播放音樂的工具類,下一篇文章將會介紹具體怎么實現(xiàn)。