一、音效播放

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> 复制 新旧文件 都存在
  
7、 删除文件
 
8、 判断文件是否存在
   
        NSLog(@"文件 已存在");
    }
9、  获得目录里面的子文件
//    返回值是一个数组 里面存的 所有子文件的名字
  
    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>
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
(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];