在Swift中从服务器播放视频文件

41

我正在尝试使用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秒钟的视频!


2
可能是重复的问题:MPMoviePlayerController显示黑色空白屏幕 - s1m0n
@s1m0n,我不确定你为什么认为这是那个问题的重复,因为那个问题是关于Objective-C的,而这个问题是关于Swift的。 - Popeye
1
@Popeye 那个问题的答案在这里同样适用;这是关于MediaPlayer API的,而不是语言。特别地,如果我将上面的代码更改,使其将moviePlayer保留在属性中的引用,它可以正常工作。在播放视频期间保留实例建议至少参考那个问题的三个答案。 - Matt Gibson
2
事实证明,这个问题是一个重复的问题,因为答案是完全相同的。这个问题是关于MediaPlayer框架而不是Swift本身的。无论你使用Swift还是Objective-C,答案都是完全相同的:保持对MPMoviePlayerController的强引用。这是关于框架的问题,与所使用的语言无关。许多关于.Net框架的问题也被标记为重复的,无论你使用VB、C#还是C++,因为用于实现解决方案的语言对这些问题来说完全无关紧要。 - s1m0n
2
请注意,“Toms Shaji Mathew”的答案可以直接复制粘贴到这里,不用改变一个单词,它将是一个很好的、完全有效的回答来解决这个问题。 - s1m0n
显示剩余6条评论
4个回答

71

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

   }
}

1
"MPMovieControlStyle" 在 iOS 9.0 中已被弃用:不再受支持。 - Mohammad Razipour
2
MPMoviePlayerControlleriOS 10 中已被弃用 - Hieu Dinh

17
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()
        }


    }

9

导入库:

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%工作并测试


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接