iOS開發之 音頻總結

一、音效播放

1、音效播放:是播放一些短音頻 常作爲點綴音頻 使用AudioToolbox.framework(系統聲音服務)

2、特點:

1>音頻播放的時間不能超過30s

2>數據必須是PCM或者IMA4格式

3>音頻文件必須打包成.caf、.aif、.wav的一種

3、使用System Sound Service 播放音效的步驟如下

1>註冊ID

2>播放


使用方法如下:

1>讀取音頻路徑

 NSString *path = [[NSBundle mainBundle] pathForResource:@"背景音樂.caf" ofType:nil];

2>註冊系統聲音的ID

SystemSoundID ID = 1;

AudioServiceCreateSystemSoundID((_bridge CFURLRef) ([NSURL fileURLWithPath:path]), &ID);

3>播放

AudioServicesPlaySystemSound(ID);(播放音效)

AudioServicesPlayAlertSound(ID);(震動)

二、音樂播放

1、音樂播放:播放一些較長的音頻 對於這些音頻的播放通常需要進行精確的控制 使用AVFoundation.framework。使用AVFoundation(audio vidio) 處理 音視頻的操作

2、使用音樂播放功能 需要導入AVFoundation框架

3、使用AVAudioPlayer 播放音頻

1>設置音頻的音量(volume)、播放速率(rate)、音頻播放的位置、獲得播放的總時長、監測音頻是否播放完畢、音樂播放的循環次數

4、初始化音頻播放器

1> 獲取音樂路徑

NSString *path = [[NSBundle mainBundle] pathForResource:@"李榮浩 - 老街.mp3" ofType:nil];

2>初始化音視頻

 NSError *error;

[AVAudioPlayer *player =[AVAudioPlayer alloc] initWithContentsOfURL:[URLWithPath:path] error:&error];

3>屬性

(1)音量

player.volume = 1;

(2)速率(如果想設置播放速率 必須得先開啓允許設置)

player.enableRate = YES;

player.rate = 2;(正常速度的兩倍播放)

(3)聲道(-1.0 左聲道 0.0 立體聲 1.0 右聲道)

player.pan = -1.0;

(4)預播放(把音樂文件的數據加載到內存)

[player prepareToPlay];

//播放

[player play];

[player pause];

[player stop];

(5)循環次數 0播放一次 負數無限循環 整數播放次數+1

player.numerOfLoops = -1;

(6)設置音樂播放器 當前播放的時間(設置從哪裏開始播放)

player.currentTime = 100;

(7)當前音樂的總時長(只讀)

NSLog(@“音樂的總時長:%f”, player.duration);

(8)通道的數量

 NSLog(@"通道的數量:%lu", (unsigned long)player.numberOfChannels);

(9)獲取設備的當前時間

NSLog(@“設備的當前時間%f”, player.dexiceCurrentTime);


三、錄音

1、要想使用錄音,需要導入<AVFoundation/AVFoundation.h>框架

2、錄音的類是:AVAudioRecorder 

3、使用AVAudioRecorder的步驟

1>創建一個存儲錄音的路徑

NSString*path=[NSTemporaryDirectory()stringByAppendingPathComponent:@"rec.caf"];

2>設置錄音的相關參數(  settings 錄音的 音頻設置 採樣率 通道 質量…)

(1)  AVSampleRateKey 採樣率

      AVEncoderBitRateKey  比特率

      AVNumberOfChannelsKey 錄音通道

     AVEncoderAudioQualityKey 錄音質量

    

(2)  比特率 音頻的傳輸速度

         有 8 16 32 64 值越大 傳輸速度越快 音質越高

NSDictionary *settings = @{AVNumberOfChannelsKey:@(2), AVEncoderAudioQualityKey:@(AVAudioQualityMax), AVEncoderBitRateKey:@(32), AVSampleRateKey:@(44100)};

    audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:path] settings:settings error:nil];

(1)掛上代理(代理名字:AVAudioRecorderDelegate)

audioRecorder.delegate = self;

3>屬性

(1)預錄製

[audioRecorder prepareToRecord];

(2)錄製

[audioRecorder record];

[audioRecorder stop];//停止

(3)錄音的當前時間

NSLog(@“%f”, audioRecorder.currenTime);

4>實現錄音結束的代理方法

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{

    NSLog(@"%@  %d", recorder, flag);

}

四、文件管理類(NSFileManager)

1、1>管理文件 創建文件 移動 複製 刪除

       2>判斷文件(目錄)是否存在

        3>是否可以讀取 寫入

2、subpathsAtPath 得到指定目錄下的 子文件

3、初始化 文件管理類

NSFileManager *manager = [NSFileManager defaultManager];

4、創建文件與存儲路徑

 NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@“錄音文件"];

//創建文件

//    createFileAtPath 指定創建文件的目錄

//    contents 指定創建文件的內容

//    attributes 文件的屬性

[manager createFileAtPath:path contents:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"begin.png" ofType:nil]] attributes:nil];

5、移動文件

1>源文件和目標文件

(1)目標目錄

NSString *newPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"目標文件"];

  NSError *error;

    BOOL s = [manager moveItemAtPath:path toPath:newPath error:&error];

    if (s) {

        NSLog(@"%@", newPath);

    }else{

        NSLog(@"%@", error);

    }

6、複製文件

1> 複製 新舊文件 都存在

    [manager copyItemAtPath:path toPath:newPath error:nil];

7、 刪除文件

    [manager removeItemAtPath:newPath error:nil];

8、 判斷文件是否存在

    if ([manager fileExistsAtPath:newPath] == YES) {

        NSLog(@"文件 已存在");

    }

9、  獲得目錄裏面的子文件

//    返回值是一個數組 裏面存的 所有子文件的名字

   NSArray *allSubFile = [manager subpathsAtPath:newPath];

    NSLog(@"%@", allSubFile);

}




五、視頻

1、播放視頻(本地視頻、網絡視頻)需要導入<MediaPlayer/MediaPlayer.h>系統框架

2、播放視頻的類  MPMoviePlayerController

3、iOS支持的視頻格式

.mp4、.mov、.m4v、.m2v、.3gp、.3g2

*****

4、1>要想能夠成功的播放視頻需要在播放視圖的view給它一個座標

2>需要添加在某個視圖上

//播放視頻步驟

5、1>加載視頻路徑

 NSString *path = [[NSBundle mainBundle] pathForResource:@"05-圖片瀏覽器02-數組和字典的使用.mp4" ofType:nil];

2>初始化視頻類

MPMoviePlayerController *moviePlayer = [MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:path]];

3>設置moviePlayer.view的frame和添加在需要播放的視圖上

 (1)moviePlayer.view.frame = self.view.frame;

(2)[self.view addSubview:moviePlayer.view];

6、MPMoviePlayerController的屬性

1>設置視頻顯示的控制樣式

moviePlayer.controlStyle =  MPMovieControlStyleEmbedded;

2>設置視頻是否循環播放

//    MPMovieRepeatModeNone 不循環

//    MPMovieRepeatModeOne 循環

moviePlayer.repeatMode =  MPMovieRepeatModeNone;

3>是否允許分享到airPlay

moviePlayer.allowsAirPlay = YES;

NSLog(@"是否使用了 AirPlay %d", moviePlayer.airPlayVideoActive);

4>是否播放的是網絡視頻 是否需要 自動繼續播放

moviePlayer.shouldAutoplay = YES;

5>設置視頻全屏

moviePlayer.fullscreen = YES;

[moviePlayer setFullscreen:YES animated:YES];

6>視頻播放停止

[moviePlayer play];

[moviePlayer stop];

7>當前播放時間currentPlaybackTime

NSLog(@"當前播放時間:%f", moviePlayer.currentPlaybackTime);

7>獲得視頻加載狀態

  //MPMovieLoadStateUnknown        = 0, 未知的狀態

  // MPMovieLoadStatePlayable       = 1 << 0, 可以播放的狀態

  //MPMovieLoadStatePlaythroughOK  = 1 << 1,

  // Playback will be automatically started in this state when shouldAutoplay is YES 如果使用了 shouldAutoplay = YES 又可以播放的 自動播放

  // MPMovieLoadStateStalled        = 1 << 2, 沒有網絡數據 可以播放的時候

moviePlayer.loadState

NSLog(@"視頻加載狀態:%lu", (unsigned long)moviePlayer.loadState);

6、可以通過通知來監測視頻播放的狀態

通知名字:MPMoviePlayerPlaybackStateDidChangeNotification

1> [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeState:)name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

2>可以獲得 整個視頻播放的對象

    MPMoviePlayerController *mp = not.object;

3>playbackState 只讀屬性 可以通過它 來獲取播放的狀態

//    MPMoviePlaybackStateStopped,  停止

//    MPMoviePlaybackStatePlaying,   播放

//    MPMoviePlaybackStatePaused,   暫停

//    MPMoviePlaybackStateInterrupted,  中斷

//    MPMoviePlaybackStateSeekingForward, 快進

//    MPMoviePlaybackStateSeekingBackward 快退

7、截取視屏

方法一:

1>通過MPMoviePlayerController 獲得截圖的方法

(1) MPMovieTimeOptionNearestKeyFrame, 獲得相對時間截圖

(2)MPMovieTimeOptionExact 獲得絕對時間的截圖

2>截圖方法

[moviePlayer requestThumbnailImagesAtTimes:@[@(1), @(5)] timeOption:MPMovieTimeOptionNearestKeyFrame];

方法二

1>使用AVAssetImageGenerator 獲得截圖

(1)需要導入<AVFoundation/AVFoundation.h>系統框架

(2)AVAsset 通過URL獲得視頻的資源

(3)AVAssetImageGenerator可以得到視頻裏面的圖片

(4)檢測截圖成功的通知名字

 MPMoviePlayerThumbnailImageRequestDidFinishNotification

(5)可以獲得通知傳過來的圖片的key

MPMoviePlayerThumbnailImageKey

2>使用步驟

(1)通過URL獲得視頻的資源

AVAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];

或通過AVURLAsset來獲得視頻資源

(2)初始化視頻資源圖片的持有者 

 AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];

(3)開始截圖

//(CMTime)包含了時間的值

//copyCGImageAtTime 拷貝哪個時間段的圖片

//CGImageRef 是圖片的數據 參數

CGImageRef ref = [generator copyCGImageAtTime:CMTimeMake(1,2) actualTime:nil error:nil];

//CGImageRef 轉換成UIImage

UIImage *image = [UIImage imageWithCGImage:ref];

self.view.backgroundColor = [UIColor colorWithPatternImage:image];

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章