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];

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值