iOS 用 AVPlayer 播放一个本地音频文件

来源:互联网 发布:3大运营商网络制式 编辑:程序博客网 时间:2024/05/22 23:02

iOS 用 AVPlayer 播放一个本地音频文件

  • 步骤

    • 第一步:在 Project - TARGETS - Project名 - Build Phases - Link Binary With Libraries,添加 AVFoundation.framework。
    • 第二步:创建一个 UIViewController 的子类 PlayerViewController。
    • 第三步:在 PlayerViewController 中添加一个属性 AVPlayer。
    • 第四步:在 PlayerViewController 的 viewDidLoad 方法中实现最主要的代码。

      关键代码

      .h

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <code>#import<uikit uikit.h="">
      #import
       
      @interfacePlayViewController: UIViewController
       
      @property(strong, nonatomic) AVPlayer *player;
       
      @end
      </avfoundation></uikit></code>

      .m

      ?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      <code>#import"PlayerViewController.h"
       
      @interfacePlayerViewController ()
       
      @end
       
      @implementationPlayerViewController
       
      - (void) viewDidLoad
      {
          [superviewDidLoad];
       
          AVAudioSession *session = [AVAudioSession sharedInstance];
          [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
          [audioSession setActive:YES error:nil];
       
          NSString *audioPath = [[NSBundle mainBundle] pathForResource:@"rem"ofType:@"wav"];
          NSURl *audioUrl = [NSURL fileURLWithPath:audioPath];
          NSError *playerError;
          _player = [[AVPlayer alloc] initWithContentsOfURL:audioUrl error:&playerError];
          if(_player === NULL)
          {
              NSLog(@"fail to play audio :(");
              return;
          }
       
          [_player setVolume:1];
          [_player play];
      }
       
      - (void) didReceiveMemoryWarning
      {
          [superdidReceiveMemoryWarning];
      }
       
      @end
      </code>

      几个重要的点:

      • 1.必须要用 AVAudioSession,否则木有声音啊。
      • 2.不要把 AVPlayer 当做局部变量(具体说在这个例子中,不要在 viewDidLoad 中定义)。
      • 3.要找好路径,这里用 mainBundle,不要搞错。



      AVAudioSession类由AVFoundation框架引入。每个IOS应用都有一个音频会话。这个会话可以被AVAudioSession类的sharedInstance类方法访问,如下:

      1. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
      复制代码

      在获得一个AVAudioSession类的实例后,你就能通过调用音频会话对象的setCategory:error:实例方法,来从IOS应用可用的不同类别中作出选择。下面列出了可供使用的音频会话类别:
      AVAudioSessionCategorySoloAmbient


      这个类别非常像AVAudioSessionCategoryAmbient类别,除了会停止其他程序的音频回放,比如iPod程序。当设备被设置为静音模式,你的音频回放将会停止。


      AVAudioSessionCategoryRecord
      这会停止其他应用的声音(比如iPod)并让你的应用也不能初始化音频回放(比如AVAudioPlayer)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlayer的prepareToPlay会返回YES,但是调用play方法将返回NO。主UI界面会照常工作。这时,即使你的设备屏幕被用户锁定了,应用的录音仍会继续。


      AVAudioSessionCategoryPlayback
      这个类别会静止其他应用的音频回放(比如iPod应用的音频回放)。你可以使用AVAudioPlayer的prepareToPlay和play方法,在你的应用中播放声音。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放都会继续。


      AVAudioSessionCategoryPlayAndRecord
      这个类别允许你的应用中同时进行声音的播放和录制。当你的声音录制或播放开始后,其他应用的声音播放将会停止。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放和录制都会继续。


      AVAudioSessionCategoryAudioProcessing
      这个类别用于应用中进行音频处理的情形,而不是音频回放或录制。设置了这种模式,你在应用中就不能播放和录制任何声音。调用AVAPlayer的prepareToPlay和play方法都将返回NO。其他应用的音频回放,比如iPod,也会在此模式下停止。


      AVAudioSessionCategoryAmbient
      这个类别不会停止其他应用的声音,相反,它允许你的音频播放于其他应用的声音之上,比如iPod。你的应用的主UI县城会工作正常。调用AVAPlayer的prepareToPlay和play方法都将返回YES。当用户锁屏时,你的应用将停止所有正在回放的音频。仅当你的应用是唯一播放该音频文件的应用时,静音模式将停止你程序的音频回放。如果正当iPod播放一手歌时,你开始播放音频,将设备设为静音模式并不能停止你的音频回放。



0 0
原创粉丝点击