版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、聲音和到目前為止,說上一章中的山峰圖像,但是編程的焦點主要集中在文本上。沒錯,只使用了最簡單的方式。顯示過UIImage,比如實際上能提供更豐富、更引人入勝的體驗。照相機、麥克風(fēng)、完善的庫和揚聲器是詳細(xì)介紹圖內(nèi)置在中的一些工具。本章這些特性作為多常規(guī)內(nèi)容來介紹。像,并簡要介紹更復(fù)雜介紹。對于更復(fù)雜的器以及在上聲音。超出了本書范疇。處理,圖像編輯的留到下一章介紹指引你去參考相關(guān)的大量Apple的庫時再做。18.1圖像介紹已經(jīng)幾次涉及圖像使用,最早出現(xiàn)在第12章中,在第一個SDK例子中包含了圖像。還總是在 erfaceBuilder中創(chuàng)建UIImageView,將其附加到文件名,且無需考慮細(xì)節(jié)?,F(xiàn)
2、在要考慮細(xì)節(jié)了。要來看Xcode中可用的一些選項,而不是依賴于 erface Builder的高度抽象。 深入到細(xì)節(jié)中,你會發(fā)現(xiàn)使用圖像的過程分為兩步。首先是將數(shù)據(jù)加載到UIImage中,然后通過一些方式使用UIImage。可通過兩種主要的方式來使用UIImage,如圖18-1所示。圖18-1 圖像可以顯示在UIImageView或UIView中本節(jié)來探討比較簡單的使用UIImageView來顯示圖像的方法,18.2節(jié)將探討更為復(fù)雜的將圖像繪制到UIView后層的方式。本章內(nèi)容和操作圖像使用照相機:圖像和聲音第 18章 18.1圖像介紹27318.1.1加載UIImageUIImage類提供7
3、種不同的方式創(chuàng)建圖像實例。其中的4個工廠方法可能最容易使用,參見表18-1。還有一些與之等同的init方法,你可以根據(jù)自己的喜好來使用。表18-1用于創(chuàng)建UIImage的工廠方法工廠方法概述imageNamed:imageWithCGImage: imageWithContentsOfFile:基于主包(main bundle)中的文件創(chuàng)建UIImage從Quartz 2D對象創(chuàng)建UIImage,這與initWithCGImage:相同從你指定的完整文件路徑創(chuàng)建UIImage,跟第16章中initWithContentsOfFile:相同從NSData創(chuàng)建UIImage,這與initWithD
4、ata:相同的一樣,這與imageWithData:圖像數(shù)據(jù)可以是幾種文件類型,包括BMP、CUR、GIF、JPEG、PNG和TIFF。本書中使用得最多的是JPEG(因為它們比較?。┖蚉NG(因為它們在硬件上好看,且被加速)。也可以從Quartz 2D對象創(chuàng)建UIImage,這是的基本圖形程序包,下一章將會介紹。創(chuàng)建UIImage時有一個隱含的限制:圖像不應(yīng)該大于10241024。只要將圖像導(dǎo)入程序中,就可以顯示了。如果只愿意使用UIKit的簡單方法,就會想要使用UIImageView類來顯示圖像。18.1.2繪制UIImageView在顯示時已經(jīng)在程序中使用過UIImageView?,F(xiàn)在要來
5、其工作的細(xì)節(jié)。有兩種方式初始化UIImageView。首先,可以使用initWithImage:方法,它允許你傳遞一個UIImage,如下所示:另外,也可以使用基本的initWithFrame:方法,并手動修改對象的屬性。表18-2展示了一些屬性和方法,你對UIImageView做表18-2工作時很可能會用到它們。18UIImageView的一些屬性和方法方法或?qū)傩灶愋透攀鯽nimationDuration animationImages animationRepeatCount imagestartAnimatingstopAnimating屬性屬性屬性屬性方法方法指定多長時間運行一次動畫循
6、環(huán)識別圖像的NSArray,以加載到UIImageView中指定運行多少次動畫循環(huán)識別單個圖像,以加載到UIImageView中開啟動畫停止動畫274第 18 章:圖像和聲音要加載普通圖像,可以使用image屬性,但是幾乎沒有理由使用它而不使用initWithImage:方法除非你在動態(tài)改變圖像。如果想要創(chuàng)建一組圖像作為動畫,那么有必要利用其他UIImage- View方法和屬性??梢詫⒁唤M圖像加載到UIImageView中,它們應(yīng)該多長時間完成一次動畫循環(huán)及運行的次數(shù),并在你覺得合適的時候開始和停止循環(huán)。代碼18-1中展示了一個簡單的例子。加載圖像創(chuàng)建UIView開啟動畫你可能想要手動加載圖
7、像,而不是通過 erface Builder進(jìn)行加載,其中一個主要原因是為了利用UIImageView的動畫功能。18.1.3在 UIKit 中修改圖像已經(jīng)介紹了如何以編程方式創(chuàng)建圖像并將它們加載到圖像視圖中。很顯然,接下來的事情就是開始修改圖像。不幸的是,在處理UIImageView時只有有限的能力修改圖像。可以基于視圖的一些簡單操作,做一些改變。例如,如果你調(diào)整UIImageView的大小,則它將自動調(diào)整其包含的的大小。同樣,通過設(shè)置UIImageView的框而不是整個屏幕,來決定在哪里繪制UIImageView。你甚至可以通過使用多個UIImageView來分層多個圖像。這一切很快就會變
8、得笨重,而且你不能做任何更有趣的事情,比如說通過混合或alpha透明選項來變換圖像或修改它們的堆放形式。要做這類工作(并開始堆放,而不只是堆放視代碼18-1 UIImageView允許動畫循環(huán)圖像18.2利用 Core Graphics 繪制簡單圖像275圖),需要了解Core Graphics。UIImage提供一些簡單的方式Core Graphics功能,無需去往Core Graphics框架(或者了解上下文或者其底層的其他復(fù)雜情況)。這里將簡要介紹這些內(nèi)容,但是Core Graphics基本上要等到下一章才介紹,那時主要介紹整個的Quartz 2D圖形引擎。18.2利用 Core Gra
9、phics 繪制簡單圖像盡管不能具有變換和其他復(fù)雜功能的整個Core Graphics庫,但是UIImage類卻包含5個簡單的方法,可以充分利用Core Graphics的工作方式。表18-3中描述了這些方法。表18-3用于繪制UIImage的實例方法方法概述drawAsPatternInRect:在矩形中繪制圖像,不縮放,但是在必要時平鋪drawAtPodrawAtPo:blendMode:alpha:利用CGPo作為左上角,繪制完整的不縮放的圖像drawAtPo:的一種更復(fù)雜的形式在CGRect中繪制完整的圖像,適當(dāng)?shù)乜s放drawInRect:的一種更復(fù)雜的形式drawInRect:dra
10、wInRect:blendMode:alpha:問題是,這些方法不能用作viewDidLoad:的一部分或者通常用來加載對象的任何其他方法的一部分。這是因為它們依賴于圖形上下文而工作。下一章更詳細(xì)地談?wù)撋舷挛模菆D形上下文其實就是你所繪制的東西要到達(dá)的目標(biāo),比如說窗口、PDF文件或者。在上,UIView自動創(chuàng)建圖形上下文作為其CALayer的一部分,CALayer是與每個UIView相關(guān)的Core Animation層??梢酝ㄟ^為UIView(或者更確切地說,為你已經(jīng)創(chuàng)建的新的子類)編寫drawRect:方法來Core Animation層。要做這種類型的工作,通常必須獲得一個特殊的上下文變
11、量,UIView方法替你去做這件事,這樣事情就變得簡單了。代碼18-2展示了如何使用該方法拼合一些。18注意,drawAtPo:方法讓你可以完成更復(fù)雜的事情,比如說混合(使用類似于Photoshop的選項,比如顏色減淡和強光)和讓變得有些透明。這里使用的是普通混合,但是只有50%的(因此使用drawAtPo:方法)。其余代碼很標(biāo)準(zhǔn)。使用這些單個繪圖命令代碼18-2 UIView的drawRect:允許你使用較低級別的繪圖命令276第 18 章:圖像和聲音非常簡單,比費力去創(chuàng)建多個UIImageView對象簡單多了(可能還更為高效)。的Core Graphics框架之前,在深入研究還有好多事情不
12、能做,但是現(xiàn)在已經(jīng)得到一些控件,已經(jīng)足夠滿足大多數(shù)常見的多下一章。需求了。如果需要的控件,請直接跳轉(zhuǎn)到談?wù)撨^很多有關(guān)圖像的話題,但是一直假設(shè)你是從項目的包加載圖像。而如果你想讓用戶來選擇呢?這就是下一節(jié)的。18.3可以使用SDK從的庫或相機卷。也可以允許用戶拍攝新。這都是用UIImagckerController完成的,它是另一個模式控制器,負(fù)責(zé)管理一個相當(dāng)復(fù)雜的圖形界面,無需你的干預(yù)。圖18-2顯示了它的樣子。圖18-2 圖像選取器是另一個供你使用的預(yù)編程的控制器18.3.1使用圖像選取器通過創(chuàng)建對象、設(shè)置一些變量并將它呈現(xiàn)為模式視圖控制器來加載UIImagckerController。默認(rèn)
13、情況下,圖像選取器控制器將允許用戶(以及有選擇性地編輯)他們的庫中的:一旦創(chuàng)建了圖像選取器控制器,你就需要有其委托來響應(yīng)以下兩個方法的委托響應(yīng):image-PickerController:didFinishPickingImage:editingInfo: 和imagckerController-18.3277DidCancel:。對于第一個方法,你應(yīng)該解散模式視圖控制器,并適當(dāng)?shù)仨憫?yīng)用戶的而對于第二個方法,則只需要解散控制器。選擇??傊?,圖像選取器控制器很容易使用,因為你主要是對被選中的了一個使用它的完整例子。做出反應(yīng)。下一節(jié)給出18.3.2拍照前面提到過,UIImagckerContro
14、ller具有三個可能的源,由以下常量表示:UIImagUIImagckerControllerSourceTypePhotoLibrary,庫中的一個。ckerControllerSourceTypeSavedPhotosAlbum,相機卷中的一個。UIImagckerControllerSourceTypeCamera,照相機拍攝的新。應(yīng)該總是確保,在啟動圖像選取器控制器之前,源是可用的,盡管這對于照相機來說最重要??梢杂胕sSourceTypeAvailable:類方法確定源的存在:一旦驗證了源的存在,你就可以告訴圖像選取器,結(jié)合sourceType屬性一起使用這個源。例如,要使用照相機,
15、可以這樣做:注意,一個程序中拍攝的必須將它們保存到那里(只在該程序中可用。如果你想要這些進(jìn)入相冊,那么程序馬上就會到)。在測試期間曾幾次讓它停下來。起碼這意味著,以的經(jīng)驗,照相機是很占用資源的你在使用照相機的時候需要考慮保存程序的狀態(tài),因為使用照相機會導(dǎo)致內(nèi)存不夠用。18.4節(jié)中的例子中就會用到照相機。18.3.3保存到相冊你可能希望將新保存到相冊,或者希望將程序創(chuàng)建的圖形存放到相冊。不管出于哪種情況,都使用UIImageWriteToSavedPhotosAlbum函數(shù)。該函數(shù)具有4個變量:第一個列出圖像,其他三個一個可選的異步通知函數(shù),以在完成保存時調(diào)用。通??梢韵裣旅孢@樣調(diào)用該函數(shù):18
16、如果你想要利用異步通知,請查閱UIKit函數(shù)參考,那里解釋了該函數(shù),或者也可以參考下一章的例子??梢允褂迷摵瘮?shù)將UIView的CALayer保存到相冊,例如,相冊允許你保存那些你以前直接寫到CALayer的繪圖命令。這也同樣依賴于圖形上下文,下一章么做這件事:會解釋,但是這里要展示怎278第 18 章:圖像和聲音為了該函數(shù)正確工作,你必須到Quartz Core框架?,F(xiàn)在已經(jīng)介紹了圖像的所有基本知識,可以將它們組合到本章的“大”例子中了,這個例子是一個程序,它拼合多個,首先是利用UIImagckerController選擇這些,然后利用UIImageView允許它們移動,最后將它們繪制到一個C
17、ALayer中以便保存。18.4拼合:一個圖像例子拼合(collage)程序依賴于三個對象。跟往常一樣,collageViewController完成大部分工作。它寫出到collageView對象,該對象主要作為一個CALayer存在。最后,你將有一個tempImageView對象,它是用戶在圖像被選中但是沒有放置之前臨時放置圖像的地方。18.4.1拼合視圖控制器拼合視圖控制器建立在一些 erface Builder對象之上,這些對象是:視圖控制器本身;一個叫做myTools的工具,它在編程過程中將被填充;collageView UIView類,它作為自己的類文件而存在,并作為self.vie
18、w 到程序中。你還需要向項目中添加Quartz Core框架,因為你將使用剛才的保存技巧。代碼18-3展示了完整的視圖控制器,這是整個程序中作用最大的文件。代碼18-3 視圖控制器負(fù)責(zé)大部分的拼合任務(wù)18.4拼合:一個圖像例子279設(shè)置對象激活圖像選取器18280第 18 章:圖像和聲音激活照相機響應(yīng)圖像選擇響應(yīng)選取器取消調(diào)整大小將添加到CALayer18.4拼合:一個圖像例子281保存拼合伸縮圖像代碼有點長,但是很容易理解。一開始是viewDidLoad:,它設(shè)置UIToolBar。早就贊美過 erface Builder,但是也,在創(chuàng)建更加動態(tài)的項目時,它可能會以勝任。這里就是這種情況。你
19、不能在 erface Builder中有效地填充UIToolBar,因為你將基于程序的狀態(tài)改變它。你要在sav上放置按鈕以調(diào)用三個方法:choosc:、takc:(當(dāng)照相機可用時)和c:。choosc:和takc:是類似的方法。它們都調(diào)用圖像選取器控制器,但是第一個方法庫,第二個方法讓用戶拍攝新。這些模式控制器的非凡之處在于,從你創(chuàng)建選取器18到用戶選擇當(dāng)用戶選擇或者取消,這期間無需你做任何事情。時,imagckerControl:didFinishPickingImage:editingInfo會被調(diào)用 ,將控制返回給程序。這里你要做以下4件事情。解散模式視圖控制器。查看交給你的,調(diào)整大小,
20、以填滿四分之一或更少的屏幕。將圖像實例化為一個tempImageView對象,該對象是UIImageView的子類。改變,以便有一個Done按鈕可用,還有一個滑塊。此時,用戶能夠做以下3件事情。使用UITouch移動圖像視圖(圖像視圖包括在tempImageView類中,因為這是觸摸發(fā)生的282第 18 章:圖像和聲音地方,就像使用滑塊改變在第14章中看到的一樣)。大小。單擊Done按鈕接受圖像大小和位置。產(chǎn)生的最終結(jié)果如圖18-3所示。注意,如果用戶取消了圖像選取器,那么你的imageP-ickerControllerDidCancel:方器 。正確地關(guān)閉模式控制UISlider 被掛接到r
21、escalc: 方法。它重新繪制 UIImageView的框,這將在自動調(diào)整大小。同時,Done按鈕激活finishPic:方法 。這會發(fā)送一個特殊的addPic: at:消息給collageView。CALayer繪制就是在collageView中完成的,馬上就會返回來介紹它。finishPic: 也解散UISlider和tempImageView,并重新設(shè)置置?;氐匠跏荚O(shè)還有一個還沒介紹的按鈕:Save。它激活初始savc:方法 ,該方法將CALayer保存到庫。注意,該是UIView的中。圖18-3 使用拼合程序同時顯示很多方法在執(zhí)行過程中會臨時隱藏。由于子視圖,如果不這樣做的話,它會被
22、包含在最后一個方法scaleImage: 是設(shè)置每個圖像以填充大約四分之一屏幕的工具。代碼中有兩個不確定的部分:tempImageView中的方法(它們允許用戶移動UIImageView)和collageView中的方法(它們稍后將圖像繪制到CALayer中)。18.4.2拼合臨時圖像視圖tempImageView類只有一個目的:截取UITouch。UITouch表示用戶想要將新圖像移動到拼合的不同部分。代碼很簡單,如代碼18-4所示。代碼18-4 臨時圖像可通過觸摸被移動18.4拼合:一個圖像例子283確定在視圖中的位置計算整置這類似于你在第14章中編寫的觸摸代碼,無需做的解釋?;叵胍幌?,l
23、ocationInView:應(yīng)用程序的全局坐標(biāo)系統(tǒng)。仿真器)上時,結(jié)果有時會超出邊界,給出視圖坐標(biāo)系統(tǒng)內(nèi)的一個CGPo在測試中發(fā)現(xiàn),當(dāng)運行在,需要轉(zhuǎn)換成(而不是所以你在移動臨時圖像視圖之前,需要仔細(xì)檢查坐標(biāo)。18.4.3拼合視圖最后,具有了collageView本身,它是背景UIView,需要響應(yīng)addPic:at:消息并用drawRect:繪制到CALayer上。代碼18-5展示了做這件事的代碼。保存到數(shù)組中18代碼18-5 一旦設(shè)置一個圖像,背景視圖就會管理低級別的繪制284第 18 章:圖像和聲音繪制到CALayer上該代碼分為兩部分。addPic:at:方法 將其信息保存到一個實例變量
24、中,將myPics詞典添加到NSMutableArray。注意,你必須將值轉(zhuǎn)換為NSNumber,以便可以將它們放置到詞典中。該方法然后在視圖上調(diào)用setNeedsDisplay。應(yīng)該從來不直接調(diào)用drawRect:。相反,當(dāng)想要它執(zhí)行時,可調(diào)用setNeedsDisplay方法,其他所有事情都不用你操心。drawRect:后來很快就被調(diào)用 。它到的技術(shù)將每個圖像繪制到CALayer上。整個NSMutableArray,將之分解,并用前面學(xué)習(xí)還沒有展示頭文件和未更改的應(yīng)用程序委托,但是這是編寫完整的拼合程序都需要的重要內(nèi)容。18.4.4擴展這個例子這是較長的例子之一,但是仍然需要進(jìn)行一些擴展,
25、才能變成功能全面的應(yīng)用程序。首先,它對內(nèi)存有點不友好。如果能文件名,而不是到處使用UIImage,那么可能會更好。此外,CALayer所來自的NSArray應(yīng)該保存到文件,以便在內(nèi)存不夠時不會丟失。但是程序只要存在就應(yīng)該工作得很好。程序應(yīng)該變得更加可用。裁剪的選項很好,但是可能需要Core Graphics函數(shù)。一個在鎖定之后移動的選項相對簡單:你可以在collageView中測試觸摸,并向后NSArray,以找到用戶正在觸摸哪個對象。將它重新實例化為UIImageView很簡單。不管怎樣,已經(jīng)展示了所有這些圖形基本要素如何一起工作,現(xiàn)在開始介紹多的另外兩種主要類型:音頻和。18.5使用 Me
26、dia Player 框架音頻和都比圖像更加復(fù)雜。幸運的是,有一個高級別框架Media Player允許你18.5使用 Media Player 框架285音頻和。如果你不需要音頻或緊密地集成到應(yīng)用程序的其余部分中,那么它是一個很好的選擇對于通常工作得很好,但是對于音頻是一個不太理想的選擇。Media Player框架包含兩個類:MPMoviePlayerController和MPVolumeView。它們管理整個頁面的音頻或要使用任何一個MediaPlayer h頭文件。器,無需你控制其如何工作,但是讓你很容易音頻或文件。器類,你都應(yīng)該向你的項目添加Media Player框架和MediaP
27、layer/器類器,你需要用將要調(diào)用的文件的URL字符串初始化一個MPMoviePlayer-18.5.1為了使用Controller對象。這可能是任何 mp3、.mp4、.mov或.3gp文件,或者是支持的任何其他東西。啟動器的方式有兩種,可以立即(這會導(dǎo)致后再啟動。的轉(zhuǎn)盤旋轉(zhuǎn)得快一點,當(dāng)它做好準(zhǔn)備時),或者等到接收了文件已加載有三個,表18-4中描述了它們。使用器時你需要注意表18-4 告訴你器正在做什么通知概述MPMoviePlayerContentPreloadDidFinishNotification文件已加載重放完成MPMoviePlaylaybackDidFinishNotifi
28、cation(續(xù))通知概述MPMoviePlayerScalingModeDidChangeNotification器的縮放模式改變1. 調(diào)用代碼器18-6顯示了器的一個簡單調(diào)用。該程序的構(gòu)造開始于erface Builder中,包括一個UITextField(用于URL的輸入)、一個UILabel(用于IndicatorView(在加載期間展示活動)。它依賴于通知來狀態(tài)和錯誤)和一個UIActivity-器是如何工作的。準(zhǔn)備文本字段18解散鍵盤代碼18-6器的一個簡單調(diào)用286第 18 章:圖像和聲音加載文件設(shè)置器啟動器請求通知安撫用戶在加載完成時開始在完成時刷新屏幕你的項目開始很簡單,就是
29、設(shè)置UITextField。這涉及設(shè)置Return鍵法textFieldShouldReturn: ,前面已經(jīng)這么做過好幾次了。和編寫它的主委托方項目是從文本字段真正開始的。當(dāng)文本數(shù)據(jù)被輸入時,chooseFile:方法被調(diào)用 ,就是該方法加載器。假設(shè)你被傳遞一個URL(因為它簡單,曾經(jīng)使用過,盡管馬上就會討論本地文件),將之轉(zhuǎn)換成NSURL,然后創(chuàng)建器 。有少量的屬性可以設(shè)置來指定器如何工作 ,這些屬性都列出在類參。你使用前面看到的過程到器中 。讓用戶知道你怎樣進(jìn)行處理是個不錯的主意,所以最后幾行代碼更新狀態(tài)信息并啟動一個活動指示器,表示正在進(jìn)行處理中 。一旦文件被加載,movieDidLo
30、ad:方法就會被通知 。它清除你的更新信息,然后器開始。跟面章節(jié)中看到的模式視圖控制器一樣,此時由器負(fù)責(zé),直到其額外回來之前無需你操心任何事情。在本例中,當(dāng)它完成之后 ,你做一些最后的清除。2. 從文件加載如果你愿意從文件而不是從互聯(lián)網(wǎng)加載,你就可以包含文件作為包的一部分。使用在第16章中方法創(chuàng)建NSURL:的方法,創(chuàng)建一個到這些本地文件的路徑,并且用fileURLWithPath:工廠18.5使用 Media Player 框架287在編寫本書時,加載文件比從互聯(lián)網(wǎng)加載更為可靠。從互聯(lián)網(wǎng)加載時,音樂文件偶爾會無緣由地被破壞,流似乎根本不能工作。期望這些問題很快得到糾正,可能就在本書之際。器還
31、支持另一個功能:你可以允許用戶在器之外設(shè)置音量。18.5.2音量視圖通過調(diào)用MPVolumeView條目,你可以允許用戶調(diào)整音量,調(diào)用方法如下:你不需要做任何工作,當(dāng)用戶更改音量控件時,系統(tǒng)音量將立即更改。如果你愿意使用另外的方法,有三個一般函數(shù)可用來調(diào)用音量警報。參見表18-5。表18-5用警報設(shè)置音量函數(shù)概述MPVolumeSettingsAlertShow MPVolumeSettingsAlertHideMPVolumeSettingsAlertIsVisible顯示音量警報隱藏音量警報返回一個布爾值,以顯示音量警報的狀態(tài)在一起,而一旦你加載了Media Player注意,這些是函數(shù),
32、不是方法。它們不與任何類框架,則這些函數(shù)通常是可用的。警告在編寫本書時,音量控制在仿真器中不起作用。18.5.3更好地集成器最大到程序中。器是,它調(diào)用一個單獨的屏幕。因此,很難用它將音樂或直接集成18對于音樂來說,這個問題目前還難以一下子就解決了。如圖18-4所示,當(dāng)音樂時,屏幕被一個大的QuickTime標(biāo)志占據(jù)著。希望,SDK的未來版本能夠給予你選項,來定義播放聲音時的背景(或者更好一點,允許你保持在普通視圖中,從而能夠真正集成音頻功能)。器的288第 18 章:圖像和聲音圖 18-4是控件,因為當(dāng)你將用作cut scene時,不希望用戶操作對于來說,最大它。通過將MPMoviePlaye
33、rController的movieControlMode屬性設(shè)置為 MPMovieControl-ModeVolumeOnly(這只允許使用音量控件)或者M(jìn)PMovieControlModeHidden(這不允許用戶任何控件),可以解決這個問題。有了這種隱藏控件的能力,器應(yīng)該成了你顯示所需要的工具,但是它還是不能使用音頻,迫使你去尋求另外的方法。不幸的是,還沒有高級別的框架用于音頻,所以你自己必須做不少的工作。大量具體的細(xì)節(jié)由于比較復(fù)雜,超出了本書范疇,但是器之外的處理音頻所用最簡單方法開始介紹。從18.6手動沒有用于是,Celestial是對外部的開發(fā)聲音音頻的高級別框架這種說法并不完全正確
34、。確實有,叫做Celestial。不幸的上的很多“私有框架”之一,這意味著它已在Apple,但是還沒有方法,因為私有框架可用。決定在本書中不用來私有框架的隨時可能改變,使用它們會讓程序很容易受到OS升級的影響。相反,供的框架。需要依靠Apple提有很多提供的框架!的Core Audio系統(tǒng)包含半打以上的框架,讓你可以在低級別音頻文件。這些框架包括Audio Queue Servi、Audio File Stream Servi、Audio FileServi&、OpenAL、Audio SesServi等。要深入了解這些框架,請參考Apple參考庫的“Audio”部分,從“Getting St
35、arted wiudio &” 和“Core Audio Overview”開始。這些框架都足夠老了,還沒有脫離Core Foundation,所以你必須依賴于從這些較老的編程風(fēng)格中學(xué)到的經(jīng)驗。只簡要介紹音頻。于更復(fù)雜的Audio Queue Servi提供一些關(guān)于如何簡單聲音和振動的例子,但是對,概述過程,并將你引向關(guān)于該的Apple擴展。簡單聲音18.6.1System Sound Servi是一個C接口,它讓你。它是Audio Toolbox簡單聲音和振動??蚣艿囊徊糠?,在AudioToolbox/AudioServi.h中18.6手動聲音289該接口只可以用來30秒以下的.aif、.c
36、af或.wav格式的短音頻文件。要使用System SoundServi,則從文件創(chuàng)建一個系統(tǒng)聲音ID,可選地為聲音完成時創(chuàng)建一個回調(diào),并啟動它。表18-6展示了主要的函數(shù)。表18-6System Sound Servi的主要函數(shù)函數(shù)參數(shù)概述AudioServiAudioServi AudioServiceCreateSystemSoundIDURL、&從URL創(chuàng)建聲音完成時刪除聲音DiseSystemSoundIDpletion、run loop、run loop mode、routine、data為聲音完成一個回調(diào)AudioServiAudioServiRePlaySystemSoundp
37、letion完成時刪除回調(diào)聲音有一些額外的函數(shù)處理系統(tǒng)聲音屬性,可以在System Sound Servi代碼18-7展示了如何使用最重要的函數(shù)。參找到這些函數(shù)。準(zhǔn)備URL創(chuàng)建聲音添加回調(diào)18聲音清除聲音器一樣,啟用System Sound Servi接口首先是構(gòu)建一個到文件的路徑(使用在跟第16章中學(xué)到的知識),然后將其轉(zhuǎn)換成一個URL。完成之后,就可以創(chuàng)建系統(tǒng)聲音了 ,這代碼18-7 Audio Toolbox支持簡短音頻的290第 18 章:圖像和聲音要求將NSURL *橋接到CFURLRef并傳遞一個指向系統(tǒng)聲音ID的指針。添加回調(diào)函數(shù)是可選的 ,但是如果你想要在聲音完成時發(fā)生一些事情
38、,則一定要這么做。一旦有了系統(tǒng)聲音ID,這里做的一樣。就很簡單了 ,但是你應(yīng)該檢查系統(tǒng)聲音ID創(chuàng)建得是否正確,跟跟平常一樣,完成之后應(yīng)該清空內(nèi)存。這就是本例中回調(diào)函數(shù)所做的事情 。18.6.2振動System Sound Servi接口中還隱含著一個很酷的小特性,你可以使用它來振動用戶的。這通過傳遞一個預(yù)先定義的系統(tǒng)聲音ID來實現(xiàn),如代碼18-8所示。對于有時難以使用的音頻系統(tǒng)來說,這是它本身的簡易之處。的音頻工作,不幸的是,就只有這些了?,F(xiàn)在已經(jīng)介紹了所有容易結(jié)束之前,下面要概述不滿足System Sound Servi接口要求的音頻文件(可能是太長了,也可能是文件類型不符)時的操作步驟。復(fù)
39、雜長于30秒18.6.3要,需要依賴于Audio Queue Servi支持的有限音頻類型之外其他類型。它將允許你較長,播放System Sound Servi,甚至聲音。Apple提供兩組極好的關(guān)于Audio Queue Servi的代碼,你可以過來自己使用,所以這里就不贅述了?!癆pple Queue ServiProgramming Guide”提供了一個全面的例子,介紹如何在過程化的面向C的環(huán)境中編寫器。“SpeakHere”示例代碼展示了如何使用最初面象的Objective-C代碼執(zhí)行類似的任務(wù)。器出現(xiàn)在AudioPlayer m文件中。為了闡述Apple的示例代碼,表18-7列出了
40、復(fù)雜聲音需要遵循的標(biāo)準(zhǔn)步驟。它依賴于如下這些。音頻文件ID類似于前面遇到過的系統(tǒng)聲音ID,它指向文件的音頻內(nèi)容。音頻隊列包含大量緩沖區(qū)通常至少包含3個。這些緩沖區(qū)被填充了音頻內(nèi)容(通常來自文件),一次填充一個,然后被分派給器(通常是揚聲器)。音頻隊列緩沖區(qū)是通過隊列傳遞的單個聲音單元。每個音頻隊列緩沖區(qū)具有用戶設(shè)置的大小。你在用數(shù)據(jù)填充這些緩沖區(qū)時會給它們編制隊列,然后它們會按隊列進(jìn)行。音頻隊列回調(diào)是一個特殊的函數(shù),被調(diào)用來處理音頻隊列?;卣{(diào)發(fā)生在數(shù)據(jù)被拖入音頻隊列時。它需要填充緩沖區(qū),然后將它們編制隊列。定制音頻結(jié)構(gòu)是一個用戶創(chuàng)建的結(jié)構(gòu),其中包含回調(diào)需要知道的所有關(guān)于音頻文件狀態(tài)代碼18-8 振需要一行代碼18.6手動聲音291和隊列狀態(tài)的數(shù)據(jù)。它作為函數(shù)調(diào)用的一部分被傳遞給回調(diào)。圖18-5以圖形方式描述了這些概念。音頻緩沖區(qū)隊列回調(diào)輸入輸出緩沖區(qū)緩沖區(qū)緩沖區(qū)圖18-5 音頻從輸入設(shè)備移動到輸出設(shè)備以便進(jìn)行重放的管道圖有了這些定義之后,應(yīng)該就能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)型A4彩色激光打印機2024采購協(xié)議明細(xì)版B版
- 初中英語賓語從句考點精講及練習(xí)(附答案)
- 2024年銷售策略研討會及市場拓展合同3篇
- 2025版智能機器人制造合伙人股權(quán)分配與產(chǎn)業(yè)鏈整合協(xié)議3篇
- 2024年環(huán)保型挖掘設(shè)備租賃合同規(guī)范3篇
- 2024藝術(shù)特長生培養(yǎng)協(xié)議書:家長與學(xué)生責(zé)任共擔(dān)3篇
- 應(yīng)急處突知識培訓(xùn)課件
- 飲食安全知識培訓(xùn)課件
- 2024年車輛貸款還款計劃表3篇
- 倉庫知識培訓(xùn)課件
- 2024年特厚板行業(yè)現(xiàn)狀分析:中國特厚板市場占總銷售量45.01%
- 2025年中國地質(zhì)調(diào)查局烏魯木齊自然資源綜合調(diào)查中心招聘19人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 中國兒童重癥監(jiān)護(hù)病房鎮(zhèn)痛和鎮(zhèn)靜治療專家共識2024解讀
- 音樂老師年度總結(jié)5篇
- 2024年專用:物業(yè)安全管理協(xié)議3篇
- 2024版商標(biāo)許可使用合同與商標(biāo)授權(quán)協(xié)議3篇
- 學(xué)生學(xué)情分析報告范文
- 《中國文化復(fù)興》課件
- 探索2024:財務(wù)報表分析專業(yè)培訓(xùn)資料
- 股權(quán)部分贈與協(xié)議書模板
- 網(wǎng)絡(luò)安全培訓(xùn)內(nèi)容課件
評論
0/150
提交評論