該框架框架包含視頻相關(guān)的APIs和音頻相關(guān)的APIs。
創(chuàng)新互聯(lián)客戶idc服務(wù)中心,提供眉山聯(lián)通機(jī)房、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過(guò)各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開(kāi)放、透明、穩(wěn)定、高性價(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。
針對(duì)音頻及視頻,其主要提供的功能可以歸納為4各方面:
1)、Capture
音頻、視頻、圖像媒體的捕捉,并輸出我們可用的數(shù)據(jù)對(duì)象的過(guò)程。
2)、Edit
針對(duì)現(xiàn)有的媒體片段(音頻片段或視頻片段),重新創(chuàng)建Assets,重新加工、生成新的媒體片段。例如,Reading, Writing, Reencoding Assets, Thumbnails
3)、Export
提供導(dǎo)出音視頻的API。例如,修改文件格式、消減時(shí)長(zhǎng)等。
4)、Presentation
例如,播放、音視頻的預(yù)覽
設(shè)備的輸入源主要包括:麥克風(fēng)(Microphone),攝像頭(Camera),屏幕等
輸入源一般包括:AVCaptureVideoPreviewLayer,AVCaptureAudioPreviewOutput,文件、Raw Buffer等。
從一個(gè)設(shè)備,例如照相機(jī)或者麥克風(fēng)管理捕獲,組合對(duì)象來(lái)表示輸入和輸出,并使用 AVCaptureSession 的實(shí)例來(lái)協(xié)調(diào)它們之間的數(shù)據(jù)流。
一個(gè)簡(jiǎn)單的會(huì)話協(xié)調(diào):
AVCapture Session作為整個(gè)Capture的核心,不斷從輸入源獲取數(shù)據(jù),然后分發(fā)給各個(gè)輸出源,從而完成一次簡(jiǎn)單的會(huì)話。
AVCaptureSession參數(shù)配置
開(kāi)始會(huì)話
結(jié)束會(huì)話
然而,很多情況下,需要考慮多個(gè)輸入源是如何被表示以及如何連接到輸出。
輸入源有自己的硬件參數(shù)可以設(shè)置流控,輸出源作為一個(gè)被動(dòng)接受對(duì)象,它并沒(méi)有太多流控設(shè)置,所以蘋(píng)果巧妙的引入AVCaptureConnections。每個(gè)Output與Session建立連接后,都會(huì)分配一個(gè)默認(rèn)的AVCpatureConnection。
AVCaptureConnections就是Session和Output中間的控制節(jié)點(diǎn)。很多實(shí)時(shí)數(shù)據(jù),也都是從connection得到的。
輸入設(shè)備的配置
輸出的配置
接收輸出資源
1)、視頻
2)、照片輸出
注冊(cè) AVAudioSession.interruptionNotification 的通知,可以收到播放打斷通知。 系統(tǒng)將此通知發(fā)布到主線程。
其中userinfo有如下字段:
分began與end,用來(lái)表示打斷開(kāi)始與打斷結(jié)束。
只在打斷結(jié)束時(shí)返回。選項(xiàng)用 shouldResume 來(lái)指示:另一個(gè)音頻會(huì)話的中斷已結(jié)束,應(yīng)用程序可以恢復(fù)其音頻會(huì)話。
該屬性只在打斷開(kāi)始時(shí)返回。存在于版本iOS 10.3-14.5。
用于確定這次中斷是否由于系統(tǒng)掛起App所致。
獲取到的是一個(gè)NSNumber表示的Bool。為true表示中斷是由于系統(tǒng)掛起,false是被另一音頻打斷。
該屬性只在打斷開(kāi)始時(shí)返回。存在于版本iOS 14.5以后,用來(lái)代替 AVAudioSessionInterruptionWasSuspendedKey 。
default :因?yàn)榱硪粋€(gè)音頻會(huì)話被激活,音頻中斷。(例如后臺(tái)播著音頻,此時(shí)播放微信語(yǔ)音)
appWasSuspended :由于APP被系統(tǒng)掛起,音頻中斷
builtInMicMuted :音頻因內(nèi)置麥克風(fēng)靜音而中斷(例如iPad智能關(guān)閉套【iPad's Smart Folio】合上)
一、簡(jiǎn)單介紹
簡(jiǎn)單來(lái)說(shuō),音頻可以分為2種
(1)音效
又稱“短音頻”,通常在程序中的播放時(shí)長(zhǎng)為1~2秒
在應(yīng)用程序中起到點(diǎn)綴效果,提升整體用戶體驗(yàn)
(2)音樂(lè)
比如游戲中的“背景音樂(lè)”,一般播放時(shí)間較長(zhǎng)
框架:播放音頻需要用到AVFoundation.framework框架
二、音效的播放
1.獲得音效文件的路徑
復(fù)制代碼 代碼如下:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
2.加載音效文件,得到對(duì)應(yīng)的音效ID
復(fù)制代碼 代碼如下:
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), soundID);
3.播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(soundID);
注意:音效文件只需要加載1次
4.音效播放常見(jiàn)函數(shù)總結(jié)
加載音效文件
復(fù)制代碼 代碼如下:
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
釋放音效資源
復(fù)制代碼 代碼如下:
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效帶點(diǎn)震動(dòng)
復(fù)制代碼 代碼如下:
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、程序示例
先導(dǎo)入需要依賴的框架
導(dǎo)入需要播放的音效文件素材
說(shuō)明: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,一個(gè)ID對(duì)應(yīng)一個(gè)音效文件)
SystemSoundID soundID=0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, soundID);
//把需要銷(xiāo)毀的音效文件的ID傳遞給它既可銷(xiāo)毀
//AudioServicesDisposeSystemSoundID(soundID);
//3.播放音效文件
//下面的兩個(gè)函數(shù)都可以用來(lái)播放音效文件,第一個(gè)函數(shù)伴隨有震動(dòng)效果
AudioServicesPlayAlertSound(soundID);
//AudioServicesPlaySystemSound(#systemsoundid)
}
@end
說(shuō)明:點(diǎn)擊屏幕可以播放音效文件。
音樂(lè)的播放
一、簡(jiǎn)單說(shuō)明
音樂(lè)播放用到一個(gè)叫做AVAudioPlayer的`類,這個(gè)類可以用于播放手機(jī)本地的音樂(lè)文件。
注意:
(1)該類(AVAudioPlayer)只能用于播放本地音頻。
(2)時(shí)間比較短的(稱之為音效)使用AudioServicesCreateSystemSoundID來(lái)創(chuàng)建,而本地時(shí)間較長(zhǎng)(稱之為音樂(lè))使用AVAudioPlayer類。
二、代碼示例
AVAudioPlayer類依賴于AVFoundation框架,因此使用該類必須先導(dǎo)入AVFoundation框架,并包含其頭文件(包含主頭文件即可)。
導(dǎo)入必要的,需要播放的音頻文件到項(xiàng)目中。
代碼示例:
復(fù)制代碼 代碼如下:
//
// YYViewController.m
// 15-播放音樂(lè)
//
#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)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[audioPlayer prepareToPlay];
//4.播放
[audioPlayer play];
}
@end
代碼說(shuō)明:運(yùn)行程序,點(diǎn)擊模擬器界面,卻并沒(méi)有能夠播放音頻文件,原因是代碼中創(chuàng)建的AVAudioPlayer播放器是一個(gè)局部變量,應(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)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.audioplayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.audioplayer prepareToPlay];
//4.播放
[self.audioplayer play];
}
@end
注意:一個(gè)AVAudioPlayer只能播放一個(gè)url,如果想要播放多個(gè)文件,那么就得創(chuàng)建多個(gè)播放器。
三、相關(guān)說(shuō)明
新建一個(gè)項(xiàng)目,在storyboard中放三個(gè)按鈕,分別用來(lái)控制音樂(lè)的播放、暫停和停止。
程序代碼如下:
復(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)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
- (IBAction)play {
//開(kāi)始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會(huì)出現(xiàn)一些莫名其面的問(wèn)題
[self.player stop];
}
@end
注意:如果點(diǎn)了“停止”,那么一定要播放器重新創(chuàng)建,不然的話會(huì)出現(xiàn)莫名其妙的問(wèn)題。
點(diǎn)擊了stop之后,播放器實(shí)際上就不能再繼續(xù)使用了,如果還繼續(xù)使用,那么后續(xù)的一些東西會(huì)無(wú)法控制。
推薦代碼:
復(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)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
return _player;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)play {
//開(kāi)始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會(huì)出現(xiàn)一些莫名其面的問(wèn)題
[self.player stop];
self.player=Nil;
}
@end
四、播放多個(gè)文件
點(diǎn)擊,url,按住common建查看。
可以發(fā)現(xiàn),這個(gè)url是只讀的,因此只能通過(guò)initWithContentsOfUrl的方式進(jìn)行設(shè)置,也就意味著一個(gè)播放器對(duì)象只能播放一個(gè)音頻文件。
那么如何實(shí)現(xiàn)播放多個(gè)音頻文件呢?
可以考慮封裝一個(gè)播放音樂(lè)的工具類,下一篇文章將會(huì)介紹具體怎么實(shí)現(xiàn)。
iOS音視頻開(kāi)發(fā)涉及的方面比較廣泛,一般分為采集、音視頻的封裝、編碼、推流、拉流、解封裝、解碼、播放等階段。其中音視頻的編碼和解碼階段是非常重要的步驟。其中編碼分為硬編碼和軟編碼,對(duì)應(yīng)解碼分為硬解碼和軟解碼。
硬編碼是指使用非CPU進(jìn)行編碼,如顯卡GPU、專用的DSP、FPGA、ASIC芯片等。
硬編碼一般性能高,對(duì)CPU沒(méi)有壓力,但是對(duì)其他硬件要求較高(如GPU等)。
軟編碼是指使用CPU進(jìn)行編碼,軟編碼通常使用:ffmpeg+x264。
軟編碼實(shí)現(xiàn)直接、簡(jiǎn)單,參數(shù)調(diào)整方便,升級(jí)易,但CPU負(fù)載重,性能較硬編碼低。
常見(jiàn)的直播服務(wù)普遍采用了RTMP作為流媒體協(xié)議,F(xiàn)LV作為封裝格式,H.264作為視頻編碼格式,AAC作為音頻編碼格式。
iOS中編碼方式:
在iOS8之前,蘋(píng)果并沒(méi)有開(kāi)放硬編碼的接口,所以只能采用ffmpeg+x624進(jìn)行軟編碼
在iOS8之后,蘋(píng)果開(kāi)放了接口,并且封裝了VideoToolBoxAudioToolbox兩個(gè)框架,分別用于對(duì)視頻音頻進(jìn)行硬編碼