控制回放音量
音頻隊(duì)列對(duì)象為您提供兩種控制回放音量的方法。
您可以通過(guò)調(diào)用AudioQueueSetParameter 函數(shù)并傳入kAudioQueueParam_Volume 參數(shù)來(lái)直接設(shè)置回放的音量,如程序清單7-8所示,音量的變化會(huì)立即生效。
程序清單7-8 直接設(shè)置回放的音量
Float32 volume = 1; // linear scale, range from 0.0 through 1.0
|
AudioQueueSetParameter (
|
myAQstruct.audioQueueObject,
|
kAudioQueueParam_Volume,
|
volume
|
);
|
您還可以通過(guò)AudioQueueEnqueueBufferWithParameters 函數(shù)來(lái)設(shè)置音頻隊(duì)列緩沖區(qū)的回放音量。這個(gè)函數(shù)可以指定音頻隊(duì)列緩沖區(qū)進(jìn)入隊(duì)列時(shí)攜帶的音頻隊(duì)列設(shè)置。通過(guò)這個(gè)函數(shù)做出的改變?cè)谝纛l隊(duì)列緩沖區(qū)開始播放的時(shí)候生效。
在上述的兩種情況下,對(duì)音頻隊(duì)列的音量所做的修改都會(huì)一直保持下來(lái),直到再次被改變。
指示回放音量
您可以通過(guò)下面的方式得到音頻隊(duì)列對(duì)象的當(dāng)前回放音量:
-
啟用音頻隊(duì)列對(duì)象的音量計(jì),具體方法是將其kAudioQueueProperty_EnableLevelMetering 屬性設(shè)置為true 。
-
查詢音頻隊(duì)列對(duì)象的kAudioQueueProperty_CurrentLevelMeter 屬性。
這個(gè)屬性的值是一個(gè)AudioQueueLevelMeterState 結(jié)構(gòu)的數(shù)組,每個(gè)聲道都有一個(gè)相對(duì)應(yīng)的結(jié)構(gòu)。程序清單7-9顯示了這個(gè)結(jié)構(gòu)的內(nèi)容:
程序清單7-9 AudioQueueLevelMeterState 結(jié)構(gòu)
typedef struct AudioQueueLevelMeterState {
|
Float32 mAveragePower;
|
Float32 mPeakPower;
|
}; AudioQueueLevelMeterState;
|
同時(shí)播放多路聲音
為了同時(shí)播放多路聲音,需要為每路聲音創(chuàng)建一個(gè)回放音頻隊(duì)列對(duì)象,并對(duì)每個(gè)音頻隊(duì)列調(diào)用 AudioQueueEnqueueBufferWithParameters 函數(shù),將第一個(gè)音頻緩沖區(qū)排入隊(duì)列,使之開始播放。
在基于iPhone OS的設(shè)備中同時(shí)播放聲音時(shí),音頻格式是很關(guān)鍵的。如果要同時(shí)播放,您需要使用線性PCM (無(wú)壓縮) 音頻格式或特定的有壓縮音頻格式,具體描述請(qǐng)參見“音頻回放和錄制格式”部分。
使用OpenAL播放和定位聲音
開源的OpenAL音頻API位于iPhone OS系統(tǒng)的OpenAL框架中,它提供了一個(gè)優(yōu)化接口,用于定位正在回放的立體聲場(chǎng)中的聲音。使用OpenAL進(jìn)行聲音的播放、定位、和移動(dòng)是很簡(jiǎn)單的—其工作方式和其它平臺(tái)一樣。此外,OpenAL還可以進(jìn)行混音。OpenAL使用Core
Audio的I/O單元進(jìn)行回放,從而使延遲最低。
由于所有的這些原因,OpenAL是iPhone OS設(shè)備中游戲程序的最好選擇。當(dāng)然,OpenAL也是一般的iPhone OS應(yīng)用程序進(jìn)行音頻播放的良好選擇。
iPhone OS對(duì)OpenAL 1.1的支持是構(gòu)建在Core Audio之上的。更多的信息請(qǐng)參見iPhone OS系統(tǒng)的OpenAL FAQ。如果需要有關(guān)OpenAL的文檔,請(qǐng)參見http://的OpenAL網(wǎng)站;如果需要演示如何播放OpenAL音頻的示例程序,請(qǐng)參見oalTouch。
錄制音頻
在iPhone OS系統(tǒng)上,可以通過(guò)AVAudioRecorder 類和音頻隊(duì)列服務(wù)來(lái)進(jìn)行音頻錄制,而Core
Audio則為其提供底層的支持。這些接口所做的工作包括連接音頻硬件、管理內(nèi)存、以及在需要時(shí)使用編解碼器。您可以錄制“音頻的回放和錄制格式”部分列出的所有格式的音頻。
本部分將介紹如何通過(guò)AVAudioRecorder 類和音頻隊(duì)列服務(wù)在iPhone OS系統(tǒng)上錄制音頻。
通過(guò)AVAudioRecorder類進(jìn)行錄制
iPhone OS上最簡(jiǎn)單的錄音方法是使用AVAudioRecorder 類,類的具體描述請(qǐng)參見AVAudioRecorder類參考。該類提供了一個(gè)高度精簡(jiǎn)的Objective-C接口。通過(guò)這個(gè)接口,您可以輕松實(shí)現(xiàn)諸如暫停/重啟錄音這樣的功能,以及處理音頻中斷。同時(shí),您還可以對(duì)錄制格式保持完全的控制。
進(jìn)行錄制時(shí),您需要提供一個(gè)聲音文件的URL、建立音頻會(huì)話、以及配置錄音對(duì)象。進(jìn)行這些準(zhǔn)備工作的一個(gè)良好時(shí)機(jī)就是應(yīng)用程序啟動(dòng)的時(shí)候,如程序清單7-10所示。諸如soundFileURL 和recording 這樣的變量都在類接口文件中進(jìn)行聲明。
程序清單7-10 建立音頻會(huì)話和聲音文件的URL
- (void) viewDidLoad {
|
|
[super viewDidLoad];
|
|
NSString *tempDir = NSTemporaryDirectory ();
|
NSString *soundFilePath = [tempDir stringByAppendingString: @"sound.caf"];
|
|
NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
|
self.soundFileURL = newURL;
|
[newURL release];
|
|
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
audioSession.delegate = self;
|
[audioSession setActive: YES error: nil];
|
|
recording = NO;
|
playing = NO;
|
}
|
您需要在接口聲明中加入AVAudioSessionDelegate 、AVAudioRecorderDelegate 、AVAudioPlayerDelegate (如果同時(shí)支持聲音回放的話)協(xié)議。
然后,就可以實(shí)現(xiàn)如程序清單7-11所示的錄制方法。
程序清單7-11 一個(gè)基于AVAudioRecorder類的錄制/停止方法
-(IBAction) recordOrStop: (id) sender {
|
|
if (recording) {
|
|
[soundRecorder stop];
|
recording = NO;
|
self.soundRecorder = nil;
|
|
[recordOrStopButton setTitle: @"Record" forState: UIControlStateNormal];
|
[recordOrStopButton setTitle: @"Record" forState: UIControlStateHighlighted];
|
|
[[AVAudioSession sharedInstance] setActive: NO error: nil];
|
|
} else {
|
|
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil];
|
|
NSDictionary *recordSettings =
|
[[NSDictionary alloc] initWithObjectsAndKeys:
|
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
|
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
|
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
|
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
|
nil];
|
|
AVAudioRecorder *newRecorder = [[AVAudioRecorder alloc] initWithURL: soundFileURL
|
settings: recordSettings
|
error: nil];
|
[recordSettings release];
|
self.soundRecorder = newRecorder;
|
[newRecorder release];
|
|
soundRecorder.delegate = self;
|
[soundRecorder prepareToRecord];
|
[soundRecorder record];
|
[recordOrStopButton setTitle: @"Stop" forState: UIControlStateNormal];
|
[recordOrStopButton setTitle: @"Stop" forState: UIControlStateHighlighted];
|
|
recording = YES;
|
}
|
}
|
有關(guān)AVAudioRecorder 類的更多信息,請(qǐng)參見AVAudioRecorder類參考。
用音頻隊(duì)列服務(wù)進(jìn)行錄制
用音頻隊(duì)列服務(wù)進(jìn)行錄制時(shí),您的應(yīng)用程序需要配置音頻會(huì)話、實(shí)例化一個(gè)錄音音頻隊(duì)列對(duì)象,并為其提供一個(gè)回調(diào)函數(shù)。回調(diào)函數(shù)負(fù)責(zé)將音頻數(shù)據(jù)存入內(nèi)存以備隨時(shí)使用,或者寫入文件進(jìn)行長(zhǎng)期存儲(chǔ)。
聲音的錄制發(fā)生在iPhone OS的系統(tǒng)定義級(jí)別(system-defined level)。系統(tǒng)會(huì)從用戶選擇的音頻源取得輸入—比如內(nèi)置的麥克風(fēng)、耳機(jī)麥克風(fēng)(如果連接到iPhone上的話)、或者其它輸入源。
和聲音的回放一樣,您可以通過(guò)查詢音頻隊(duì)列對(duì)象的kAudioQueueProperty_CurrentLevelMeter 屬性來(lái)取得當(dāng)前的錄制音量,具體描述請(qǐng)見“指示回放音量”部分。
有關(guān)如何通過(guò)音頻隊(duì)列服務(wù)錄制音頻的詳細(xì)實(shí)例,請(qǐng)參見音頻隊(duì)列服務(wù)編程指南的錄制音頻部分,實(shí)例代碼則請(qǐng)見iPhone
Dev Center網(wǎng)站上的SpeakHere。
解析音頻流
為了播放音頻流內(nèi)容,比如來(lái)自網(wǎng)絡(luò)連接的音頻流,可以結(jié)合使用音頻文件流服務(wù)和音頻隊(duì)列服務(wù)。音頻文件流服務(wù)負(fù)責(zé)從常見的、采用網(wǎng)絡(luò)位流格式的音頻文件容器中解析出音頻數(shù)據(jù)和元數(shù)據(jù)。您也可以用它來(lái)解析磁盤文件中的數(shù)據(jù)包和元數(shù)據(jù)。
iPhone OS可以解析的音頻文件和位流格式和Mac OS X相同,具體如下:
-
MPEG-1 Audio Layer 3,用于.mp3文件
-
MPEG-2 ADTS,用于.aac音頻數(shù)據(jù)格式
-
AIFC
-
AIFF
-
CAF
-
MPEG-4,用于.m4a、.mp4、和.3gp文件
-
NeXT
-
WAVE
在取得音頻數(shù)據(jù)包之后,您就可以以任何iPhone OS系統(tǒng)支持的格式進(jìn)行播放,這些格式在“音頻回放和錄制格式”部分中列出。
為了獲得最好的性能,處理網(wǎng)絡(luò)音頻流的應(yīng)用程序應(yīng)該僅使用來(lái)自Wi-Fi連接的數(shù)據(jù)。您可以通過(guò)iPhone OS提供的System Configuration框架及其SCNetworkReachability.h 頭文件定義的接口來(lái)確定什么網(wǎng)絡(luò)是可到達(dá)和可用的。如果需要實(shí)例代碼,請(qǐng)參見iPhone
Dev Center網(wǎng)站的Reachability工程。
為了連接網(wǎng)絡(luò)音頻流,可以使用iPhone OS系統(tǒng)中的Core Foundation框架中的接口,比如CFHTTPMesaage 接口,具體描述請(qǐng)見CFHTTPMessage參考。通過(guò)音頻文件流服務(wù)解析網(wǎng)絡(luò)數(shù)據(jù)包,將它恢復(fù)為音頻數(shù)據(jù)包,然后放入緩沖區(qū),發(fā)送給負(fù)責(zé)回放的音頻隊(duì)列對(duì)象。
音頻文件流服務(wù)依賴于音頻文件服務(wù)定義的接口,比如AudioFramePacketTranslation 結(jié)構(gòu)和AudioFilePacketTableInfo 結(jié)構(gòu),具體描述請(qǐng)見音頻文件服務(wù)參考。
有關(guān)如何使用流的更多信息,請(qǐng)參見音頻文件流服務(wù)參考。實(shí)例代碼則請(qǐng)參見位于<Xcode>/Examples/CoreAudio/Services/ 目錄下的AudioFileStream例子工程,其中<Xcode>是開發(fā)工具所在的目錄。
iPhone OS系統(tǒng)上的音頻單元支持
iPhone OS提供一組音頻插件,稱為音頻單元,可以用于所有的應(yīng)用程序。您可以通過(guò)Audio Unit框架提供的接口來(lái)打開、連接、和使用音頻單元;還可以定義定制的音頻單元,在自己的應(yīng)用程序內(nèi)部使用。由于應(yīng)用程序必須靜態(tài)連接定制的音頻單元,所以iPhone
OS系統(tǒng)上的其它應(yīng)用程序不能使用您開發(fā)的音頻單元。
表7-3列出了iPhone OS提供的音頻單元。
表7-3 系統(tǒng)提供的音頻單元
音頻單元
|
描述
|
轉(zhuǎn)換器單元
|
轉(zhuǎn)換器單元,類型為kAudioUnitSubType_AUConverter ,用于音頻數(shù)據(jù)的格式轉(zhuǎn)換。
|
iPod均衡器單元
|
iPod EQ單元,類型為kAudioUnitSubType_AUiPodEQ ,提供一個(gè)簡(jiǎn)單的、基于預(yù)設(shè)的均衡器,可以在應(yīng)用程序中使用。
|
3D混音器單元
|
3D混音器單元,類型為kAudioUnitSubType_AU3DMixerEmbedded ,用于混合多個(gè)音頻流,指定立體聲輸出移動(dòng),操作采樣率,等等。
|
多通道混音器單元
|
多通道混音器單元,類型為kAudioUnitSubType_MultiChannelMixer ,用于將多個(gè)音頻流混合成為單一的音頻流。
|
一般輸出單元
|
一般輸出單元,類型為kAudioUnitSubType_GenericOutput ,支持和線性PCM格式互相轉(zhuǎn)換,可以用于開始或結(jié)束一個(gè)音頻單元圖。
|
I/O單元
|
I/O單元,類型為kAudioUnitSubType_RemoteIO ,用于連接音頻輸入和輸入硬件,支持實(shí)時(shí)I/O。如何使用音頻單元的實(shí)例代碼請(qǐng)見aurioTouch工程。
|
語(yǔ)音處理I/O單元
|
語(yǔ)音處理I/O單元,類型為kAudioUnitSubType_VoiceProcessingIO ,具有I/O單元的特征,同時(shí)為了支持雙向交流,加入了回響抑制功能。
|
有關(guān)系統(tǒng)音頻單元的更多信息,請(qǐng)參見系統(tǒng)音頻單元訪問(wèn)指南。
iPhone音頻的最佳實(shí)踐
操作音頻的貼士
在操作iPhone OS系統(tǒng)上的音頻內(nèi)容時(shí),您需要記住表7-4列出的基本貼士。
表7-4 音頻貼士
貼士
|
動(dòng)作
|
正確地使用壓縮音頻
|
對(duì)于AAC、MP3、和ALAC (Apple Lossless) 音頻,解碼過(guò)程是由硬件來(lái)完成的,雖然比較有效,但同時(shí)只能解碼一個(gè)音頻流。如果您需要同時(shí)播放多路聲音,請(qǐng)使用IMA4 (壓縮) 或者線性PCM (無(wú)壓縮) 格式來(lái)存儲(chǔ)那些文件。
|
將音頻轉(zhuǎn)換為您需要的數(shù)據(jù)格式和文件格式
|
Mac OS X的afconvert 工具可以進(jìn)行很多數(shù)據(jù)格式和文件類型的轉(zhuǎn)換。請(qǐng)參見“iPhone
OS偏好的音頻格式” 部分和afconvert 工具的手冊(cè)頁(yè)面。
|
評(píng)價(jià)音頻的內(nèi)存使用問(wèn)題
|
當(dāng)您使用音頻隊(duì)列服務(wù)播放音頻時(shí),需要編寫一個(gè)回調(diào)函數(shù),負(fù)責(zé)將較短的音頻數(shù)據(jù)片斷發(fā)送到音頻隊(duì)列的緩沖區(qū)。在某些情況下,將整個(gè)音頻文件載入內(nèi)存是最佳 的選擇,這樣可以使播放時(shí)的磁盤訪問(wèn)盡最少;而在另外一些情況下,最好的方法則是每次只載入足夠填滿緩沖區(qū)的數(shù)據(jù)。請(qǐng)測(cè)試和評(píng)價(jià)哪種策略對(duì)您的應(yīng)用程序最 好。
|
限制音頻的采樣率和位深度,減少音頻文件的尺寸
|
采樣率和每個(gè)樣本的位深度對(duì)無(wú)壓縮音頻的尺寸有直接的影響。如果您需要播放很多這樣的聲音,則應(yīng)該考慮降低這些指標(biāo),以減少音頻數(shù)據(jù)的內(nèi)存開銷。舉例來(lái) 說(shuō),相對(duì)于使用采樣率為44.1 kHz的音頻作為聲音效果, 您可以使用采樣率為32 kHz(或可能更低)的音頻,仍然可以得到很合理的品質(zhì)。
|
選擇恰當(dāng)?shù)募夹g(shù)
|
使用Core Audio的系統(tǒng)聲音服務(wù)來(lái)播放警告和用戶界面聲音效果。當(dāng)您希望使用便利的高級(jí)接口來(lái)定位立體聲場(chǎng)中的聲音,或者要求很低的回放延遲時(shí),則應(yīng)該使用 OpenAL。如果需要從文件或網(wǎng)絡(luò)數(shù)據(jù)流中解析出音頻數(shù)據(jù),可以使用音頻文件服務(wù)接口。如果只是簡(jiǎn)單回放一路或多路聲音,則應(yīng)該使用AVAudioPlayer 類。對(duì)于具有其它音頻功能的應(yīng)用程序,包括音頻流的回放和音頻錄制,可以使用音頻隊(duì)列服務(wù)。
|
低延遲編碼
|
如果需要盡可能低的回放延遲,可以使用OpenAL,或者直接使用I/O單元。
|
iPhone OS偏好的音頻格式
對(duì)于無(wú)壓縮(最高品質(zhì))音頻,請(qǐng)使用封裝在CAF文件中的、16位、低位在前(little endian)的線性PCM音頻數(shù)據(jù)。您可以用Mac OS X的afconvert 命令行工具來(lái)將音頻文件轉(zhuǎn)換為上述格式:
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}
|
afconvert 工具可以進(jìn)行廣泛的音頻數(shù)據(jù)格式和文件類型轉(zhuǎn)換。您可以通過(guò)afconvert 的手冊(cè)頁(yè)面,以及在shell提示符下鍵入afconvert
-h 命令獲取更多信息。
對(duì)于壓縮音頻,當(dāng)每次只需播放一個(gè)聲音,或者當(dāng)不需要和iPod同時(shí)播放音頻時(shí),適合使用AAC格式的CAF或m4a文件。
當(dāng)您需要在同時(shí)播放多路聲音時(shí)減少內(nèi)存開銷時(shí),請(qǐng)使用IMA4 (IMA/ADPCM) 壓縮格式,這樣可以減少文件尺寸,同時(shí)在解壓縮過(guò)程中對(duì)CPU的影響又最小。和線性PCM數(shù)據(jù)一樣,請(qǐng)將IMA4數(shù)據(jù)封裝在CAF文件中。
在iPhone OS使用視頻
錄制視頻
從iPhone OS 3.0開始,您可以在具有錄制支持的設(shè)備上錄制視頻,包括當(dāng)時(shí)的音頻。顯示視頻錄制界面的方法是創(chuàng)建和推出一個(gè)UIImagePickerController 對(duì)象,和顯示靜態(tài)圖片照相機(jī)界面完全一樣。
在錄制視頻時(shí),您必須首先檢查是否存在照相機(jī)源類型 (UIImagePickerControllerSourceTypeCamera )
,以及照相機(jī)是否支持電影媒體類型 (kUTTypeMovie ) 。根據(jù)您為mediaTypes 屬性分配的媒體類型的不同,選擇器對(duì)象可以直接顯示靜態(tài)圖像照相機(jī),或者視頻攝像機(jī),還可以顯示一個(gè)選擇界面,讓用戶選擇。
使用UIImagePickerControllerDelegate 協(xié)議,注冊(cè)為圖像選擇器的委托。在視頻錄制完成時(shí),您的委托對(duì)象的 imagePickerController:didFinishPickingMediaWithInfo: 方法會(huì)備調(diào)用。
對(duì)于支持錄制的設(shè)備,您也可以從用戶照片庫(kù)中選擇之前錄制的視頻。
有關(guān)如何使用圖像選擇器的更多信息,請(qǐng)參見UIImagePickerController類參考。
播放視頻文件
在iPhone OS系統(tǒng)上,應(yīng)用程序可以通過(guò)Media Player框架(MediaPlayer.framework ) 來(lái)播放視頻文件。視頻的回放只支持全屏模式,需要播放場(chǎng)景切換動(dòng)畫的游戲開發(fā)者或需要播放媒體文件的其它開發(fā)者可以使用。當(dāng)應(yīng)用程序開始播放視頻時(shí),媒體 播放器界面就會(huì)接管,將屏幕漸變?yōu)楹谏缓鬂u漸顯示視頻內(nèi)容。視頻播放界面上可以顯示或者不顯示調(diào)整回放的用戶控件。您可以通過(guò)部分或全部激活這些控件
(如圖7-2所示),使用戶可以改變音量、改變回放點(diǎn)、開始或停止視頻的播放。如果禁用所有的控件,視頻會(huì)一直播放,直到結(jié)束。
圖7-2 帶有播放控制的媒體播放器界面

在開始播放前,您必須知道希望播放的URL。對(duì)于應(yīng)用程序提供的文件,這個(gè)URL通常是指向應(yīng)用程序包中某個(gè)文件的指針;但是,它也可以是指向遠(yuǎn)程服務(wù)器文件的指針。您可以用這個(gè)URL來(lái)實(shí)例化一個(gè)新的MPMoviePlayerController 類的實(shí)例。這個(gè)類負(fù)責(zé)視頻文件的回放和管理用戶交互,比如響應(yīng)用戶對(duì)播放控制(如果顯示的話)的觸擊動(dòng)作。簡(jiǎn)單調(diào)用控制器的play 方法,就可以開始播放了。
程序清單7-12顯示一個(gè)實(shí)例方法,功能是播放位于指定URL的視頻。play方法是異步的調(diào)用,在電影播放時(shí)會(huì)將控制權(quán)返回給調(diào)用者。電影控制器負(fù)責(zé)將電影載入一個(gè)全屏的視圖,并通過(guò)動(dòng)畫效果將電影放到應(yīng)用程序現(xiàn)有內(nèi)容的上方。在視頻回放完成后,電影控制器會(huì)向委托對(duì)象發(fā)出一個(gè)通告,該委托對(duì)象負(fù)責(zé)在不再需要時(shí)釋放電影控制器。
程序清單7-12 播放全屏電影
-(void)playMovieAtURL:(NSURL*)theURL
|
{
|
MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc] initWithContentURL:theURL];
|
|
theMovie.scalingMode = MPMovieScalingModeAspectFill;
|
theMovie.movieControlMode = MPMovieControlModeHidden;
|
|
// Register for the playback finished notification.
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
selector:@selector(myMovieFinishedCallback:)
|
name:MPMoviePlayerPlaybackDidFinishNotification
|
object:theMovie];
|
|
// Movie playback is asynchronous, so this method returns immediately.
|
[theMovie play];
|
}
|
|
// When the movie is done, release the controller.
|
-(void)myMovieFinishedCallback:(NSNotification*)aNotification
|
{
|
MPMoviePlayerController* theMovie = [aNotification object];
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self
|
name:MPMoviePlayerPlaybackDidFinishNotification
|
object:theMovie];
|
|
// Release the movie instance created in playMovieAtURL:
|
[theMovie release];
|
}
|
有關(guān)Media Player框架的各個(gè)類的更多信息,請(qǐng)參見Media
Player框架參考。有關(guān)它支持的視頻格式列表,請(qǐng)參見iPhone
OS技術(shù)概覽。
|