【问题标题】:AVPlayerViewController using audio-only AVPlayerAVPlayerViewController 使用纯音频 AVPlayer
【发布时间】:2015-04-08 18:21:05
【问题描述】:

刚开始使用 AVKit,我正在尝试播放一些音频。使用Mastering Modern Media Playback 中详述的新 AVPlayerViewController 会很好,这样我就有了现成的播放/暂停/搜索 UI。我基本上有一个带有容器视图的情节提要,其中有一个嵌入到 AVPlayerViewController 的 segue。然后我使用:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "embedAudio") {
        var playerViewController:AVPlayerViewController = segue.destinationViewController as AVPlayerViewController

        playerViewController.player = AVPlayer(URL: NSURL(string: "http://dts.podtrac.com/redirect.mp3/files.serialpodcast.org/sites/default/files/podcast/1420057326/serial-s01-e01.mp3"))
    }
}

它可以很好地嵌入和播放,但它在视频所在的位置有一个黑色的大 QuickTime 符号。我想知道是否有办法让它看起来更像音乐或播客应用。

【问题讨论】:

    标签: ios swift audio avfoundation avkit


    【解决方案1】:

    为什么要重新发明轮子?只需使用AVPlayerViewControllercontentOverlayView 属性。您可以在此处设置专辑封面图片,或在 QuickTime 徽标(视频所在的位置)和控件之间放置任何 UIView

    请注意,您必须在提供 AVPlayerViewController 之后执行此操作,因为它的 contentOverlayView 属性在 prepareForSegue 中将为零

    【讨论】:

      【解决方案2】:

      不要使用 AVPlayerViewController,因为它是全屏、黑盒、视频播放器。

      相反,创建您自己的视图控制器,例如,使用操作系统中现成的工具栏和控件(播放、暂停、停止等)并将它们挂钩到您的AVAudioPlayer。这就是您自己的视图控制器的代码可能的样子:

      维护播放器实例

      var audioPlayer:AVAudioPlayer!
      @IBOutlet weak var playProgress: UIProgressView!
      

      示例:播放

      @IBAction func doPlayAction(_ sender: AnyObject) {
          do {
              try audioPlayer = AVAudioPlayer(contentsOf: audioRecorder.url)
              audioPlayer.play()
          } catch {}
      }
      

      示例:停止

      @IBAction func doStopAction(_ sender: AnyObject) {
          if let audioPlayer = self.audioPlayer {
              audioPlayer.stop()
          }
      }
      

      示例:跟踪进度

      func playerProgress() {
          var progress = Float(0)
          if let audioPlayer = audioPlayer {
              progress = ((audioPlayer.duration > 0)
                  ? Float(audioPlayer.currentTime/audioPlayer.duration)
                  : 0)
          }
          playProgress.setProgress(progress, animated: true)
      }
      

      我使用此答案中概述的方法发布了一个录制播放示例。

      ► 在GitHub 上找到此解决方案。

      【讨论】:

        猜你喜欢
        • 2016-12-30
        • 1970-01-01
        • 2013-04-11
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 2012-10-19
        相关资源
        最近更新 更多