1. 程式人生 > >ios開發之音訊視訊開發

ios開發之音訊視訊開發

一、音訊播放方式

1.System Sound Services

2.AVAudioPlayer

3.Audio Queue Service

4.OpenAL

二、使用

1.System Sound Services的使用

SystemSoundID soundId;   

 //後面將使用soundId引用音訊檔案

NSString *soundFile = [[NSBundle mainBundle]pathForResource:@"XXX" ofType:@"wav"];  

 //通過NSBundle的mainBundle方法返回一個NSBundle物件,該物件對應當前應用程式可執行二進位制檔案所屬目錄。pathForResource方法回去aaa.wav的真實路徑

AudioServicesCreateSystemSoundID( (__bridge CFURLRef ) [ NSURL fileURLWithPath:soundFile ] .&soundId ) ;

//建立soundFile的SystemSoundID,

// (__bridge CFURLRef ) 是強制轉換成CFURLRef物件,因為此處理講一個C語言結構轉換我一個OC物件,所以必須加上__bridge 

AudioServicesPlaySystemSound(soundId);

//播放音訊 System Sound Services  不能播放超過30s的聲音,並且支援wav

2.AVAudioPlayer的使用

(1)AVAudioPlayer類的一個例項,被稱為一個音訊播放器,從檔案或者記憶體中提供音訊播放資料

(2)Apple 推薦使用這個類來實現音訊播放,除非你播放網路音訊流或者要求費城地的I/O延遲

(3)AVAudioPlayer 的功能

A.播放任意時間的音訊

B.播放聲音檔案或記憶體快取區

C.迴圈播放

D.播放多個聲音,一個播放器一個聲音,精確同步

E.控制每一個正在播放聲音的playback level,stereo positioning,and playback rate;

F.搜尋音訊檔案的特定性,支援快進快退功能

G.使用播放計量來獲取資料

(4)AVAudioPlayer的事件處理

A. Responding to Sound Playback Completion

- audioPlayerDidFinishPlaying:successfully;

B.Responding to an Audio Decoding Error

- audioPlayerDecodeErrorDidOccur:error;

C.Handling Audio Interruptions

- audioPlayerBeginInterruption;

- audioPlayerEndInterruption:withOptions;

- audioPlayerEndInterruption: (Deprecated in iOS 6.0)

- audioPlayerEndInterruption:withFlags:(Deprecated in iOS 6.0)

    (5)  AVAudioPlayer 的使用

NSError *error;

AVAudioPlayer _backgroundMusicPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:backgroundMusicURL error:&error];

[_backgroundMusicPlayer prepareToPlay];

[_backgroundMusicPlayer play];

(6)AVAudioPlayer 的屬性特徵

A. playing: 一個Bool值,表示是否是一個正在播放的播放器

B. volume:音訊播放器增益,數值從0.0 ~ 1.0

C. pan: 音訊播放器的立體聲位置(左右聲道),數值-1.0 ~ 1.0

D. rate: 音訊播放的播放率,預設數值為1.0

E. enableRate:一個Bool值,制定是否啟用音訊播放器的播放速度調整

F. numberOfLoops:音訊重複播放次數

3.Audio Queue Service的使用

(1)音訊佇列是一個用於音訊錄製或者播放的軟體物件,一個音訊佇列做的工作:

A.連結到音訊硬體

B.管理記憶體

C.如需要時使用編解碼器來壓縮音訊格式

D.調停播放或錄音

(2)基本工作原理

A. 音訊佇列的架構

所有音訊佇列具有相同的結構,由這些部分組成:

a. 一組音訊佇列快取區,每一個是這些音訊資料的臨時儲存區

b. 快取區佇列,有序列表的音訊佇列快取區

c. 音訊佇列的回撥函式

B.記錄程序:

a. 將視訊填入第一個緩衝器中

b. 當佇列中的第一個緩衝器填滿時,會自動填充下一個緩衝器,此時,會觸發回撥

c. 在回撥函式中需要將音訊資料流寫入磁碟

d. 然後,需要在回撥函式中將該緩衝器中重新放入緩衝佇列,以便重複使用該緩衝器,重複步驟2

播放程序:

a. 將音訊讀入到快取器中,一旦填充滿一個快取器,就會進入快取佇列,此時處於待命狀態

b. 應用程式命令發出指令,要求音訊佇列開始播放

c. 音訊蛔蟲第一個快取其中讀取資料,並開始播放

d. 一旦播放完成,就會觸發回撥,並開始播放下一個快取器中的內容

e. 回撥中需要給該快取器讀取後面的音訊資料,然後重新放入快取佇列中,重複步驟3

4. OpenAL的使用

(1)OpenAL是一個跨平臺(包括iphone OS)的音訊API,被推薦用於音訊遊戲中,並且也非常適合許多其他型別的應用程式

(2)OpenAL主要由3個實體構成:聽眾Listener ,聲援Source,以及快取Buffer

A. 聽眾Listener:就是你,Listener的位置是可以移動的。

B. 聲援Source:類似一個話筒,他發出聲音給聽眾聽,和Listener一樣,聲源的位置是可以移動的,

C. 快取Buffer:存著原始聲音資料,就是你需要播放的聲音。

還有2個重要的物件,裝置device 和環境context

A. 裝置是播放聲音的硬體

B. 環境是聲源和聽眾所在的空間

(3)OpenAL的使用

讓OpenAL工作所需的最少步驟是:

A. 得到裝置資訊

B. 將環境與裝置關聯

C. 在快取中加入聲音資料

D. 在聲源中加入快取資料

E. 播放聲源

三、視訊開發

iOS有數種技術可用於播放應用程式包的電影檔案以及來自網路的資料流內容,如果瑟唄具有合適的視訊硬體,這些技術也可用於捕捉視訊,並可將捕獲到的視訊整合到應用程式

系統也提供多種方法用於播放或者錄製視訊內容,你可以根據需要選擇,選擇視訊技術的時候,請儘可能選擇高階框架,因為高階框架可以簡化為提供對某種功能的支援所需的工作,下面列出的框架由高階到低階排列。其中,媒體播放器框架提供最高階的介面

A. UIKit 中的UIImagePickerController類提供了一個口在能支援camera的裝置上記錄音訊的標準介面

B. The Media Player framework 提供了一組易用於使用的藉口,用於播放application中全屏或者部分螢幕視訊

C. The AV Foundation framework 提供了一組Objective-C介面,可以管理視訊的錄製與播放

D. Core Media 對較高的框架使用的底層型別進行描述,同時提供對media操縱的底層介面

iOS視訊技術支援播放的視訊檔案應具有。mov,.mp4,.m4v以及.3gp副檔名,而且檔案應使用下屬壓縮標準:

H.264視訊,多達1.5Mbps,640*480畫素,每秒30幀。H.264Baseline Profile 的Low-Complexity版本支援AAC-LC音訊(.m4v,.買mp4以及.mov檔案格式中高達160Kbps,48KHz的立體音訊)

H.264視訊,高達68Kbps,320*240畫素,每秒30幀,達到Level1.3的BaseLine Profile支援AAC-1_C音訊(.m4v、.mp4以及.mov)

MPEG-4視訊,高達2.5Mbps,640*480畫素,每秒30幀,Simple Profile支援ACC-LC音訊(.m4v、.mp4以及.mov檔案格式中高達160Kbps,48KHz的立體音訊)

各種音訊格式,包括“音訊技術”列出的清單

1.Media Player framework

Media Player framework提供了用於播放視訊、陰影、部落格和音訊書檔案的工具

此框架的MPMoviePlayerController和MPTimedMetadata類讓你播放流媒體視訊內容和包含在流的響應時間的元資料

(1) MPMoviePlayerController

一個電影播放器(MPMoviePlayerController型別)管理從檔案或網路流播放的電影,發生電影播放器和擁有播放器檢視無論是全屏或內聯播放。你可以在你的app所擁有的檢視層次結構中加入電影播放器,或者使用MPMoviePlayerViewController物件管理

當加入一個播放器到你的app中時,應該是這樣的

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:myURL];

[player prepareToPlay];

[player.view setFrame:myView.bounds]; //player's frame must match parent's

[myView addSubview:player.view];

// something to do ...

[player play];

Movie Notifications:

A. MPMovieDurationAvailableNotification: 當電影時間已經確定時post

B. MPMovieMediaTypesAvailableNotification: 當media型別確定時post

C. MPMoviePlayerContentPreloadDidFinishNotification:當movie在記憶體中準備播放時post

D. MPMoviePlayerWillEnterFullscreenNotification:將進入全屏模式post

E. MPMoviePlayerDidEnterFullscreenNotification:進入全屏模式時post

F. MPMoviePlayerWillExitFullscreenNotification:將退出全屏模式時post

G. MPMoviePlayerDidExitFullscreenNotification:退出全屏模式時post

H. MPMoviePlayerLoadStateDidChangeNotification:當播放器忘了快取status改變時post

I. MPMoviePlayerNowPlayingMovieDidChangeNotification:切換視訊時post

J. MPMoviePlayerPlaybackDidFinishNotification:視訊播放完成時post

K. MPMoviePlayerPlaybackStateDidChangeNotification:視訊播放狀態改變時post

L. MPMoviePlayerReadyForDisplayDidChangeNotification:視訊準備播放狀態改變post

(2)AV Foundation framework

A. AV Foundation 提供了一個基於時間試聽資料水平的Objective-C介面,具有播放、錄製、編輯、轉換、捕捉等功能

B. AV Foundation 使用AVAsset 代表一個抽象的媒體,包含標題檔案大小等,不關聯任何格式

a. 對要合成和編輯媒體就會開啟多個音訊和視訊檔案,為每個開啟的音訊和視訊取個抽象名叫軌道track

b. 請注意,建立了AVASset不意味著他就可以使用了,他要進行一些計算,會阻塞當前執行緒,為了避免足協要求童工多執行緒呼叫block來處理

C. AVFoundation 容許你管理多個playback,為了支援這一點,它把一組表述狀態從 asset 中分離出來,這樣你就可以同時播放幾個內容,為了管理多個播放提供了一個play item 物件,對應軌道提供有player item trak 物件,要播放play item同player物件

D. player item 用來管理AVAsset的播放,play item track 用來管理track的播放

(3)Core Media

CoreMedia框架提供了一個底層的介面,管理和播放試聽媒體在你的application中