iOS 多媒體

1、音頻

在iOS開發中,主要使⽤用四種⽅式來播放音頻:php

  • System Sound Services (系統聲音服務)
  • AVAudioPlayer (高級音頻播放器) : 只能播放一個完整的音頻, 徹底下載好的
  • AVPlayer(負責視頻操做,例如播放,暫停,聲音大小,跳到指定時間)
  • Audio Queue Services (播放和錄製音頻服務)
  • OpenAL(跨平臺的開源的音頻處理接口)

1.1 System Sound Services(系統聲音服務)

System Sound Services是最底層也是最簡單的聲音播放服務, 經過調用AudioServicesPlaySystemSound 這個函數就能夠播放一些簡單的音頻文件緩存

使用場景 : 適合播放一些很小的提示或者警告音網絡

侷限性:session

一、聲音長度小於30秒框架

二、格式 : IMA4, WAVless

三、不能控制播放的進度iphone

四、調用方法後當即播放聲音ide

五、沒有循環播放和立體聲音播放函數

OpenAL : 跨平臺的開源音頻處理藉口ui

優點:

支持更多的格式

能夠播聽任意長度的音頻

支持循環播放

能夠同步播放多個音頻文件

控制播放進度以及從音頻的任意一點開始播放

- (void)playSystemAudio
{
    // 系統聲音ID列表http://iphonedevwiki.net/index.php/AudioServices
    // 直接播放系統指定ID的聲音
    // AudioServicesPlaySystemSound(1002);
    
      SystemSoundID soundID;

    //用NSBundle來返回音頻文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"];
    NSURL *url = [NSURL fileURLWithPath:path];

    //創建SystemSoundID對象,可是這裏要傳地址(加&符號)。 第一個參數須要一個CFURLRef類型的url參數,要新建一個NSString來作橋接轉換(bridge),而這個NSString的值,就是上面的音頻文件路徑
    // 將本地的聲音註冊爲系統聲音
    AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
    
    // 播放系統聲音
    // AudioServicesPlaySystemSound(soundID);
    
    // 播放提示音,帶震動
    AudioServicesPlayAlertSound(soundID);
    
}

1.2 AVAudioPlayer (高級音頻播放器)

使⽤用簡單方便,但只能播放本地音頻,不支持流媒體播放。⽀持的⾳頻格式有:

AAC
AMR(AdaptiveMulti-Rate, aformatforspeech) ALAC(AppleLossless)
iLBC(internetLowBitrateCodec, anotherformatforspeech) IMA4(IMA/ADPCM)
linearPCM(uncompressed)
μ-lawanda-law
MP3(MPEG-1audiolayer3

AVAudioPlayer不能夠播放網絡URL,可是能夠播放NSData,因此咱們能夠經過網絡URL去建立NSData,而後在經過AVAudioPlayer來播放NSData,但此法並不可取,由於AVAudioPlayer只能播放一個完整的文件,並不支持流式播放,因此必須是緩衝完才能播放,因此若是網絡文件過大抑或是網速不夠豈不是要等好久?因此播放網絡音頻咱們通常用音頻隊列。

步驟一:AVAudioPlayer 包含在 AVFoundation 框架中,因此開發的時候首先導入音頻的框架 AVFoundation.framework

引入頭文件

#import <AVFoundation/AVFoundation.h>

步驟二:

建立一個AVAudioPlayer之後你就能夠對它的各類屬性進行訪問或設置了 。 

- (AVAudioPlayer *)audioPlayer
{
    if (!_audioPlayer) {
        
        // 設置後臺播放,先要在info.plist 文件中添加 Required background modes項而且添加item: App plays audio or streams audio/video using AirPlay
        AVAudioSession *session = [[AVAudioSession alloc] init];
        [session setActive:YES error:nil];
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        //從budle路徑下讀取音頻文件
        NSString *path = [[NSBundle mainBundle] pathForResource:@"貳佰-狗日的青春" ofType:@"mp3"];
        //把音頻文件轉換成url格式
        NSURL *url = [NSURL fileURLWithPath:path];
        _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        //設置代理
        _audioPlayer.delegate = self;
        //設置最大音量
        self.progressView.maximumValue = _audioPlayer.duration;
         //音量  0.0 ~ 1.0 之間
        _audioPlayer.volume = 0.5;
        //預播放
        [_audioPlayer prepareToPlay];
        
        [self showAudioInfo];
    }
    
    return _audioPlayer;
}

 

1.3 AVPlayer

iOS4.0之後,可使用AVPlayer播放本地音頻和支持流媒體播放,但提供接口較

少,處理音頻不夠靈活

- (void)palyerCurrentTime:(NSTimer *)timer
{
    // 獲取播放的時間進度:currentTime
    float timeValue = (float)self.player.currentItem.currentTime.value / self.player.currentItem.currentTime.timescale;
    
    NSLog(@"當前時間:%f",timeValue);

    
    // 獲取在線播放的媒體加載好的時間: loadedTimeRanges
    NSValue *loadTimeValue = [self.player.currentItem.loadedTimeRanges lastObject];
    CMTimeRange timeRange;
    [loadTimeValue getValue:&timeRange];
    NSLog(@"loadTime:%f",(float)timeRange.duration.value/timeRange.duration.timescale);

}

 

1.4 Audio Queue Services (播放和錄製音頻服務)

音頻隊列主要處理流媒體播放,提供了強⼤且靈活的API接口(C函數的接口), 但處理起來也較爲複雜

1.5 OpenAL(跨平臺的開源的音頻處理接口)

最適合開發遊戲的音頻

OpenAL 包含三個 實體:Listener(聽者)、Source(音源)、 Buffer(緩存)

Audio Queue Services 主要用來實現錄製音頻,爲了簡化音頻文件的處理,一般還須要使用到AudioFileServices

② 開發步驟

1.獲取device

2.將context關聯到device

3.將數據放入buffer

4.將buffer連接到一個source

5.播放source

功能說明:
簡單的實現了播放流式PCM數據的功能

使用方法: (.h文件內也有詳細說明)
1. 導入OpenAL.framework
2. alloc/init方法建立對象
3. 調用initOpenAL方法初始化OpenAL
4. 使用insertPCMDataToQueue:size:方法將PCM數據加載到緩衝隊列裏, 會自動播放
5. 不用的時候, 先調用clean方法關閉OpenAL而後再銷燬對象. (不clean的話, 下次初始化會有問題)

2、視頻

iOS裏面視頻播放用的是AVPlayer (包含在AVFoundation框架內) 與AVAudioPlayer有點相似, 可是AVPlayer的功能更增強大, 它能夠用來播放音頻也能夠用來播放視頻. 並且在播放音頻方面AVPlayer能夠直接播放網絡音頻.

MPMoviePlayerController 與AVAudioPlayer有點相似,前者播放視頻,後者播放音頻,不過也有很大不一樣,MPMoviePlayerController 能夠直接經過遠程URL初始化,而AVAudioPlayer則不能夠。

2、屬性設置 

1.控制器樣式  

可使用下列樣式:  
MPMovieControlModeDefault            顯示播放/暫停、音量和時間控制  
MPMovieControlModeVolumeOnly         只顯示音量控制  
MPMovieControlModeHidden             沒有控制器  
2.屏幕寬高比例  

你可使用下列寬高比值:  
MPMovieScallingModeNone            不作任何縮放  
MPMovieScallingModeAspectFit       適應屏幕大小,保持寬高比  
MPMovieScallingModeAspectFill      適應屏幕大小,保持寬高比,可裁剪  
MPMovieScallingModeFill            充滿屏幕,不保持寬高比 

 

 

AVPlayerLayer(負責視頻的可視區域,視頻的播放模式,注意是CALayer,不能接受觸摸)

AVPlayerItem(表示AVPlayer播放的資源對象,能夠監聽其狀態)

3、相機、相冊

//使用相機前先斷定設備是否能夠
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        
        self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

相機拍照設置

// 是否能夠編輯
        self.imagePicker.allowsEditing = YES;
        
        // 修改相機呈現視圖的transform
        self.imagePicker.cameraViewTransform  = CGAffineTransformMakeRotation(M_PI_2);
        
        /* 設置攝像頭的模式
         UIImagePickerControllerCameraDeviceRear, 後置
         UIImagePickerControllerCameraDeviceFront 前置
         */
        self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
        
        // 設置閃光燈,默認自動
        self.imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;

攝影設置

// 媒體類型
        self.imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie];
        // 相機模式爲 video
        self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
        // 視頻的質量
        self.imagePicker.videoQuality = UIImagePickerControllerQualityType640x480;
        
        [self presentViewController:self.imagePicker animated:YES completion:NULL];
    } else {
        
        NSLog(@"相機不可用!");
    }
相關文章
相關標籤/搜索