Audio/Movie/Image

Audio

1. 引入AVFoundation 库,此库用于处理音频的播放。

   > 使用AVAudioPlayer 播放音频,此类只能播放本地音频文件。对于流媒体(边下边播)的播放使用第三方框架实现,比较优秀的有:AudioStreamer, FreeStreamer

      [[AVAudioPlayer alloc] initWithContentsOfURL: error:nil]; // 此处的url是指本地文件的位置,以file:// 开头

   > AVAudioPlayer 方法及属性

      // 准备播放

      [player prepareToPlay];

      // 播放

      [player play];

      // 暂停

      [player pause];

      // 停止

      [player stop];

      // 是否在播放

      player.playing

      // 音频的总时长

      player.duration

      // 音频的音量

      player.volume

      // 音频播放的当前时间

      player.currentTime

      // 音频播放时的循环次数

      player.numberOfLoops  // 0 表示播放一次,1 表示播放两次,依次类推。任何负数表示无限循环播放。

      

      // 代理对象

      player.delegate    协议名称:AVAudioPlayerDelegate

      // 协议方法

         // 一个音频播放完毕时触发此方法

      - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

   > *若音频需支持后台播放,需以下两步操作:

      — 在工程 Info.plist 在根级添加 Required background modes, 再在此项下添加子项:App plays audio or streams audio/video using AirPlay

      — 在代码里配置音频会话 AVAudioSession

          // 每个ios应用都有一个音频会话

          [AVAudioSession sharedInstance]; // 获取唯一实例

          // 设置音频会话类别

          [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];  // 告知系统静止其他应用的音频回放,在锁屏或后台时,仍然可以播放。

          // 激活会话

          [[AVAudioSession sharedInstance] setActive:YES error:nil];

    > *若音频需要远程控制,即由设备下方经滑动弹出显示的控制界面

       - 在播放音频的控制器视图将要显示时,开始接收远程控制事件

          - (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    [self becomeFirstResponder]; // 使当前视图成为第一响应者

}

        - 在播放音频的控制器视图将要消失时,结束接收远程控制事件

          - (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];

    [self resignFirstResponder];

}

        - 实现父类方法 

          - (BOOL)canBecomeFirstResponder {

    return YES;

}  // 此方法默认返回NO

         - 实现父类方法,远程事件接收后的处理

         - (void)remoteControlReceivedWithEvent:(UIEvent *)event {

    if (event.type == UIEventTypeRemoteControl) {

        switch (event.subtype) {

            case UIEventSubtypeRemoteControlPlay:

            case UIEventSubtypeRemoteControlPause:

                      // 播放,暂停音频播放

                break;

                case UIEventSubtypeRemoteControlPreviousTrack:

                      // 播放上一首

                break;

                case UIEventSubtypeRemoteControlNextTrack:

                      // 播放下一首

                break;

            default:

                break;

        }

    }

}

2.音频录音 AVAudioRecorder ,使用方式类似AVAudioPlayer,录音保存的路径需设置到沙盒目录下。

Movie

1. iOS 视频播放 MediaPlayer 库中的MPMoviePlayerController, 支持本地视频和网络视频播放. .

   > 使用MPMoviePlayerController

      // 初始化

      [MPMoviePlayerController alloc] initWithContentURL:]

      // 设置播放器视图的frame

      moviePlayer.view.frame   

      // *将播放视图添加的父视图上

      [superview addSubview:moviePlayer.view] 

   > MPMoviePlayerController 视频播放时,播放状态等信息不是通过代理来与外界交互,而是通过通知中心。

      // 注册通知

         // 播放状态改变

      [NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackStateDidChangeNotification object:通知的附加内容 ]

         // 播放完成

      [NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackDidFinishNotification object:通知的附加内容 ]

     [扩展] 若想定制播放控制,则需设置player.controlStyle = MPMovieControlStyleNone;

      

2. 除此之外,iOS中还可以使用视频视图控制器播放视频MPMoviePlayerViewController

    一般以模态的方式弹出全屏播放。

    > 使用 MPMoviePlayerViewController

       // 初始化

       [[MPMoviePlayerViewController alloc] initWithContentURL:]

       // 注册通知

          // 播放状态改变,播放完成是暂停

      [NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackStateDidChangeNotification object:通知的附加内容 ]

          // 播放完成

      [NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackDidFinishNotification object:通知的附加内容 ]

      // 模态方式弹出显示视频播放,不直接将播放起放到父视图控制器上

      [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController]

      /* 此方法是MPMoviePlayerViewController 对UIViewControler 扩展的模态展示方法,增加了一种下拉展示动画效果。仍然可以使用原来的presentViewController: animated: completion:] */

3. 以上两个播放视频的类,自iOS9开始被弃用,替换使用自iOS8开始的AVKit 下的AVPlayerViewController

Image

1. 使用UIImagePickerController (图片选择器) 选择单个图片

   > 初始化 

      [[UIImagePickerController alloc] init]

   > 指定代理对象

      imagePicker.delegate     协议名字<UINavigationControllerDelegate,UIImagePickerControllerDelegate>

   > 设置资源类型/图片来源

      imgPicker.sourceType

      — UIImagePickerControllerSourceTypePhotoLibrary  // 来自设备图片库

      — UIImagePickerControllerSourceTypeCamera         // 来自照相机

      — UIImagePickerControllerSourceTypeSavedPhotosAlbum   // 来自相机保存的相册

   > 显示图片选择器

      [self presentViewController:imgPicker animated: completion:]

   > 实现协议方法获取图片数据

      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info

      /* info 参数中存储了所选择的图片,注意这里只能是单选的。可通过info中的土资源类型UIImagePickerControllerMediaType判断是否是图片,通过UIImagePickerControllerOriginalImage 获取所选图片的原始图片。

          在获取图片后,要压缩图片,UIImageJPEGRepresentation(imgData, 0.1)一般采用此种方式,第二个参数“压缩因子”,越小,图片就越小。也可采用UIImagePNGRepresentation(imgData) 方式,这种方式比前者压缩后要大些。 */

2.[扩展] 使用AssetsLibrary或者PhotoLibrary 实现多选图片,也可借助第三方库实现

原文地址:https://www.cnblogs.com/GJ-ios/p/5705584.html