iOS 多媒体

一、音频

在iOS开发中,主要使⽤用四种⽅式来播放音频:

  • System Sound Services (系统声音服务)
  • AVAudioPlayer (高级音频播放器) : 只能播放一个完整的音频, 完全下载好的
  • AVPlayer(负责视频操作,例如播放,暂停,声音大小,跳到指定时间)
  • Audio Queue Services (播放和录制音频服务)
  • OpenAL(跨平台的开源的音频处理接口)

1.1 System Sound Services(系统声音服务)

System Sound Services是最底层也是最简单的声音播放服务, 通过调用AudioServicesPlaySystemSound 这个函数就可以播放一些简单的音频文件

使用场景 : 适合播放一些很小的提示或者警告音

局限性:

1、声音长度小于30秒

2、格式 : IMA4, WAV

3、不能控制播放的进度

4、调用方法后立即播放声音

5、没有循环播放和立体声音播放

OpenAL : 跨平台的开源音频处理借口

优势:

支持更多的格式

可以播放任意长度的音频

支持循环播放

可以同步播放多个音频文件

控制播放进度以及从音频的任意一点开始播放

- (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的话, 下次初始化会有问题)

二、视频

iOS里面视频播放用的是AVPlayer (包含在AVFoundation框架内) 与AVAudioPlayer有点类似, 但是AVPlayer的功能更加强大, 它可以用来播放音频也可以用来播放视频. 而且在播放音频方面AVPlayer可以直接播放网络音频.

MPMoviePlayerController 与AVAudioPlayer有点类似,前者播放视频,后者播放音频,不过也有很大不同,MPMoviePlayerController 可以直接通过远程URL初始化,而AVAudioPlayer则不可以。

二、属性设置 

1.控制器样式  

可以使用下列样式:  
MPMovieControlModeDefault            显示播放/暂停、音量和时间控制  
MPMovieControlModeVolumeOnly         只显示音量控制  
MPMovieControlModeHidden             没有控制器  
2.屏幕宽高比例  

你可以使用下列宽高比值:  
MPMovieScallingModeNone            不做任何缩放  
MPMovieScallingModeAspectFit       适应屏幕大小,保持宽高比  
MPMovieScallingModeAspectFill      适应屏幕大小,保持宽高比,可裁剪  
MPMovieScallingModeFill            充满屏幕,不保持宽高比 

 

 

AVPlayerLayer(负责视频的可视区域,视频的播放模式,注意是CALayer,不能接受触摸)

AVPlayerItem(表示AVPlayer播放的资源对象,可以监听其状态)

三、相机、相册

    //使用相机前先判定设备是否可以
    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(@"相机不可用!");
    }
    

 

转载于:https://my.oschina.net/nieqing/blog/746856

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值