ios:音频和视频(未完)

前提条件:需要引入AVFoundation.frame-workMediaPlayer.framework、CoreAudio.framework(录制音频时会用到)

AV 框架(Audio 和Video 框架)里的 AVAudioPlayer类播放 iOS支持的所有音频格式。AVAudioPlayer 实例的 delegate属性允许我们通过事件获得通知,例如当音频播放被打断或者播放音频文件出错时。

新建一个类,类中包含一个播放器的属性。而且该类遵守 AVAudioPlayerDelegate协议

@interface AVTest : UIViewController<AVAudioPlayerDelegate>

@property (nonatomic,retain) AVAudioPlayer *myPlayer;

在.m文件中实现:


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    //添加按钮,点击按钮播放音乐
    UIButton *play = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    play.frame = CGRectMake(100, 250, 120, 40);
    [play addTarget:self action:@selector(playMusic) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:play];
}
- (void)playMusic
{
    dispatch_queue_t playDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(playDispatchQueue, ^{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"aaa" ofType:@"mp3"];
    //文件中的数据首先被加载到一个 NSData 实例,然后被传递到 AVAudioPlayer 类的 initWithData:error:方法。
    NSData *mp3Data = [NSData dataWithContentsOfFile:filePath];
    myPlayer = [[AVAudioPlayer alloc] initWithData:mp3Data error:nil];
    if (self.myPlayer != nil)
    {
        //设置播放器代理,并播放
        self.myPlayer.delegate = self;
        [self.myPlayer play];
    }
    });
}

处理播放音频时的中断

AVAudioPlayerDelegate中有处理中断的方法:

//当中断发生时调用这个方法
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
    //do something
    NSLog(@"%s,%d",__FUNCTION__,__LINE__);
    NSLog(@"Here is a interruption!");
}

//当中断结束时调用这个方法
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withFlags:(NSUInteger)flags
{
    if (flags == AVAudioSessionInterruptionFlags_ShouldResume&&self.myPlayer != nil) 
    {
        [self.myPlayer play];
    }
}

(遵守AVAudioRecorderDelegate协议)录制音频:

增加一个AVAudioRecorder属性:

@property (nonatomic,retain) AVAudioRecorder *audioRecorder;
初始化AVAudioRecorder的方法 initWithURL:settings:error: setting 参数,很多值都可以保存在这个 setting 字典里:

  • AVFormatIDKey录音的格式,可以是:kAudioFormatLinearPCMkAudioFormatAppleLossless

  • AVSampleRateKey录制音频的采样率

  • AVNumberOfChannelsKey录制音频的频道编号

  • AVEncoderAudioQualityKey录制音频的质量,可以是:AVAudioQualityMinAVAudioQualityLowAVAudioQualityMediumAVAudioQualityHighAVAudioQualityMax

初始化 AVAudioRecorder时,我们使用了一个 dictionary作为音频录制器的初始化方法中的 setting参数。这个 dictionaryaudioRecordingSettings方法创建。实现如下:

- (NSDictionary *) audioRecordingSettings{
NSDictionary *result = nil;
/* 我们在 dictionary 中初始化录制音频的选项。稍后我们会用这个 dictionary 音频录制器*/
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
[settings
setValue:[NSNumber numberWithInteger:kAudioFormatAppleLossless] forKey:AVFormatIDKey];
[settings
setValue:[NSNumber numberWithFloat:44100.0f] forKey:AVSampleRateKey];
[settings
setValue:[NSNumber numberWithInteger:1] forKey:AVNumberOfChannelsKey];
[settings
setValue:[NSNumber numberWithInteger:AVAudioQualityLow] forKey:AVEncoderAudioQualityKey];
result = [NSDictionary dictionaryWithDictionary:settings];
return result; }

添加一个录音按钮:

//添加录音按钮
    UIButton *record = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    record.frame = CGRectMake(100, 300, 120, 40);
    [record addTarget:self action:@selector(recordAudio) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:record];

录音存放路径:

- (NSString *) audioRecordingPath
{ 
    //返回录音存放路径
    NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsFolder = [folders objectAtIndex:0];
    NSString *result = [documentsFolder stringByAppendingPathComponent:@"Recording.m4a"];
    return result;
}

录音以及结束录音方法:

- (void)recordAudio
{
    NSString *recordPath = [self audioRecordingPath];
    NSURL *recordURL = [NSURL fileURLWithPath:recordPath];
    audioRecorder = [[AVAudioRecorder alloc] initWithURL:recordURL settings:[self audioRecordingSettings] error:nil];
    if (self.audioRecorder != nil) 
    {
        self.audioRecorder.delegate = self;
        if ([self.audioRecorder prepareToRecord] && [self.audioRecorder record]) 
        {
            NSLog(@"Successfully started to record!");
            /* 5 秒后,我们终止录制过程 ,具体录制时间可以再写一个接口*/
            [self performSelector:@selector(stopRecordingOnAudioRecorder:)
                       withObject:self.audioRecorder afterDelay:5.0f];
        }
    }
}
- (void)stopRecordingOnAudioRecorder :(AVAudioRecorder *)paramRecorder
{
    //停止录音
    [self.audioRecorder stop];
}

AVAudioRecorderDelegate协议中也存在像AVAudioPlayerDelegate中断与结束的方法:

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

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder;

/* Currently the only flag is AVAudioSessionInterruptionFlags_ShouldResume. */
- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withFlags:(NSUInteger)flags NS_AVAILABLE_IOS(4_0);





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值