【问题标题】:Playing a video file from a server in Swift在 Swift 中从服务器播放视频文件
【发布时间】:2014-09-21 22:59:03
【问题描述】:

我正在尝试使用 Swift 从服务器播放视频。

我已经导入了 MediaPlayer 框架,这是我的代码:

import UIKit
import MediaPlayer

class VideoViewController: UIViewController {

   override func viewDidLoad() {
        super.viewDidLoad()

        var url:NSURL = NSURL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")        
        var moviePlayer = MPMoviePlayerController(contentURL: url)

        moviePlayer.view.frame = CGRect(x: 20, y: 100, width: 200, height: 150)        
        self.view.addSubview(moviePlayer.view)

        moviePlayer.fullscreen = true        
        moviePlayer.controlStyle = MPMovieControlStyle.Embedded        
   }
}

当我在模拟器中运行时,我只得到一个黑匣子,但无论我尝试从哪里加载视频,都没有播放视频。

更新

这是当前代码

var url:NSURL = NSURL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")

var moviePlayer = MPMoviePlayerController(contentURL: url)

moviePlayer.view.frame = CGRect(x: 20, y: 100, width: 200, height: 150)        
moviePlayer.movieSourceType = MPMovieSourceType.File

self.view.addSubview(moviePlayer.view)        
moviePlayer.prepareToPlay()
moviePlayer.play()

这段代码有趣地播放了大约 2 秒的视频,然后再次变黑!

【问题讨论】:

  • 问题似乎是一样的,但那里发布的解决方案都没有帮助。在这种情况下,Swift 和 Objective-C 可能有什么不同?
  • @Popeye 这个问题的答案在这里同样重要;这是关于 MediaPlayer API,而不是语言。特别是,如果我采用上面的代码并对其进行更改,以便在属性中保留对 moviePlayer 的引用,则它可以正常工作。在该问题的至少三个答案中建议保留实例直到您完成播放视频。
  • 好吧,事实证明这个问题是重复的,因为答案完全相同相同。这个问题是关于 MediaPlayer 框架的,而不是关于 Swift 本身的。无论您使用 Swift 还是 Objective-C,答案都完全相同:保持对 MPMoviePlayerController 的强烈引用。这是关于框架的,与使用的语言无关。无论您使用 VB、C# 还是 C++,很多关于 .Net 框架的问题也被标记为重复,因为用于实现解决方案的语言与这些问题完全无关。
  • 请注意,“Toms Shaji Mathew”的答案可以在不更改任何单词的情况下粘贴到此处,这将是解决此问题的绝佳、完全有效的答案。

标签: ios swift video mpmovieplayercontroller playback


【解决方案1】:

2019 年更新,Swift 4:

MPMovieControlStyle' 在 iOS 9.0 中已弃用:在 AVKit 中使用 AVPlayerViewController。

所以,按照建议,让我们改变它。 2016 年的原始答案如下。

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!
        
        playVideo(url: url)
    }
    
    func playVideo(url: URL) {
        let player = AVPlayer(url: url)
        
        let vc = AVPlayerViewController()
        vc.player = player
        
        self.present(vc, animated: true) { vc.player?.play() }
    }
}

原答案:

import UIKit
import MediaPlayer

class VideoViewController: UIViewController {

   var moviePlayer:MPMoviePlayerController!

   override func viewDidLoad() {
      super.viewDidLoad()

      let url:NSURL = NSURL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")

      moviePlayer = MPMoviePlayerController(contentURL: url)
      moviePlayer.view.frame = CGRect(x: 20, y: 100, width: 200, height: 150)

      self.view.addSubview(moviePlayer.view)
      moviePlayer.fullscreen = true

      moviePlayer.controlStyle = MPMovieControlStyle.Embedded

   }
}

【讨论】:

  • MPMovieControlStyle' 在 iOS 9.0 中已弃用:不再支持
  • MPMoviePlayerControlleriOS 10 中被弃用
【解决方案2】:

我只是遇到了同样的问题..

MPMoviePlayerController Stops Playing After 5 seconds - Swift

问题是您的 var moviePlayer 超出范围。通过像上面@Victor-Sigler 所做的那样在 viewDidLoad 之外声明它,可以防止黑屏问题的发生。

【讨论】:

    【解决方案3】:
    import AVKit
    import AVFoundation
    
    class VideoController: UIViewController
    
    override func viewDidLoad()
    
        {
           let videoURL = NSURL(string: "VideoUr")
            let player = AVPlayer(url: videoURL! as URL)
            let playerViewController = AVPlayerViewController()
            playerViewController.player = player
            self.present(playerViewController, animated: true) {
                playerViewController.player!.play()
            }
    
    
        }
    

    【讨论】:

      【解决方案4】:

      导入库:

      import AVKit
      import AVFoundation
      import MediaPlayer
      import AudioToolbox   
      

      这样设置代表

      AVPlayerViewControllerDelegate
      

      在你想玩按钮动作的地方写漂亮的代码:

      let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
          let player = AVPlayer(url: videoURL!)
          let playervc = AVPlayerViewController()
          playervc.delegate = self
          playervc.player = player
          self.present(playervc, animated: true) {
              playervc.player!.play()
          }
      

      100% 工作和测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多