在Swift Playground中使用AVPlayer播放视频?

8

我在使用 AVPlayer 在 Swift Playground 中播放视频时遇到了问题。

这是我的代码:

import UIKit
import AVFoundation

var f=CGRectMake(0, 0, 500, 500)
var url=NSURL(string: "http://s3.amazonaws.com/vids4project/sample.mp4")
var playerItem = AVPlayerItem(URL: url)

var v = UIView(frame:f)
var player=AVPlayer(playerItem: playerItem)
var playerLayer=AVPlayerLayer(player: player)

playerLayer.frame=f
v.layer.addSublayer(playerLayer)
player.play()

有什么建议吗?这段代码没有任何作用。我的期望是变量'v'应该显示视频。当我将avplayerlayer连接到storyboard中的视图时,它似乎在playground之外正常工作。

5个回答

8
如果您将以下内容放入playground,则应该可以正常工作。请确保替换路径:(Xcode 11&Swift Playgrounds Mac和iOS)
import UIKit
import AVFoundation
import PlaygroundSupport

var playerFrame = CGRect(x: 0, y: 0, width: 500, height: 500)

guard let path = Bundle.main.path(forResource: "movie", ofType: "m4v") else {
    fatalError("no movie found")
}

let url = URL(fileURLWithPath: path)

var playerItem = AVPlayerItem(url: url)

var playerView = UIView(frame: playerFrame)
playerView.backgroundColor = .black
var player = AVPlayer(playerItem: playerItem)
var playerLayer = AVPlayerLayer(player: player)

playerLayer.frame = playerFrame
playerView.layer.addSublayer(playerLayer)
player.play()

PlaygroundPage.current.liveView = playerView

PlaygroundPage.current.needsIndefiniteExecution = true

谢谢!你怎么让它一直播放呢? - Mago Nicolas Palacios

6
试着在结尾处添加以下内容以保持游乐场运行。
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

5

感谢@Justin Levi Winter的回答,我已经更新了Swift3的代码,并在Xcode 8上进行了测试(此视频在时间轴上播放,但不能在快速查看中播放):

import AVFoundation
import PlaygroundSupport


URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let width = 568
let height = 320

let container = UIView(frame: CGRect(x: 0, y: 0, width: width, height: height))

PlaygroundPage.current.liveView = container

PlaygroundPage.current.needsIndefiniteExecution = true


func playVideo(_ url: URL){
    let f=CGRect(x: 0, y: 0, width: width, height: height)
    let playerItem = AVPlayerItem(url: url)

    let player=AVPlayer(playerItem: playerItem)
    let playerLayer=AVPlayerLayer(player: player)

    playerLayer.frame=f
    container.layer.addSublayer(playerLayer)
    PlaygroundPage.current.liveView = container

    player.play()
}

playVideo(URL(string:"http://s3.amazonaws.com/vids4project/sample.mp4")!)

0

针对Swift 5.*

在阅读了几个答案,包括上面的答案后,我编写了以下代码。它可以工作,但有一个问题,播放器视图的位置有点偏移。我的意思是当其框架的x和y值应该在左上角时,它并没有停留在那里。顺便说一下,主要问题是如何实际编写URL。

import UIKit
import PlaygroundSupport
import AVFoundation
import CoreMedia


class MyViewController : UIViewController {

    var mPlayer : AVPlayer?
    var mItem   : AVPlayerItem?
    var playerLayer        : AVPlayerLayer?
    var playerView = UIView()  
  


    override func loadView() {
    
        let view = UIView()
        self.view = view
        view.frame = CGRect(x: 0, y: 0, width: 1000, height: 1000)
        view.backgroundColor = .darkGray
    
        let playerFrame = CGRect(x: 1, y: 10, width: 500, height: 500)
        playerView.frame =  playerFrame
        view.addSubview(playerView)
        playVideo()
   
    }

   func playVideo(){
        let url0 =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("IMG_0626.MOV")
    
    
        mItem                       = AVPlayerItem(url: url0)
        mPlayer                     = AVPlayer(playerItem: mItem!)
        playerLayer                 = AVPlayerLayer(player: mPlayer) 
    
        playerView.layer.addSublayer(playerLayer!)
        playerLayer?.frame          = playerView.bounds
        playerLayer?.videoGravity   = AVLayerVideoGravity.resizeAspect
        mPlayer?.play()
    }
}



// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
PlaygroundPage.current.needsIndefiniteExecution = true

0
另一个可尝试的选项是使用一个AVPlayerView,它可以被设置为playground的实时视图。
import Foundation
import AppKit
import PlaygroundSupport
import AVFoundation
import AVKit


public func playVideo(at vidURL: URL) -> (AVPlayerView, AVPlayer) {
    print("Playing Video at \(vidURL)")
    let videoFrame = NSRect(x: 0, y: 0, width: 500, height: 500)
    let playerView = AVPlayerView(frame: videoFrame)
    
    let playerItem = AVPlayerItem(url: vidURL)
    let player = AVPlayer(playerItem: playerItem)
    
    playerView.player = player
    
    return (playerView, player)
}

guard let videoURL: URL = Bundle.main.url(forResource: videoFileName, withExtension: "mp4") else {
    fatalError("\(videoFileName) -> Video file not found")
}

let (playerView, videoPlayer) = playVideo(at: videoURL)

PlaygroundPage.current.liveView = playerView
PlaygroundPage.current.needsIndefiniteExecution = true

videoPlayer.pause() //videoPlayer.play()

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