Локальный файл MoviePlayer

Итак, я уже около 16 часов пытаюсь найти ответ на эту проблему. Кажется, это должно быть так просто, но документация Apple по этому поводу довольно плохая, и я не очень хорошо понимаю цель C.

Итак, у меня есть SKSpriteNode, который я хотел бы использовать как кнопку. При нажатии этой кнопки я хотел бы воспроизвести видео в формате mp4 в полноэкранном режиме. Звучит довольно просто, правда?

Также я пишу это в шаблоне игры, потому что с его помощью я узнал немного быстроты, которую знаю, и я работаю только в GameScene.swift.

Я уже перешел на этап сборки и добавил видео в «Копирование ресурсов пакета».

class GameScene: SKScene {
    var infoButton:SKSpriteNode!
    var moviePlayer: MPMoviePlayerController!
    var url: NSURL!



    override func didMoveToView(view: SKView) {

        // Button
        let infoButtonTexture = SKTexture(imageNamed: "btn_vid")
        infoButton = SKSpriteNode(texture: infoButtonTexture)
        infoButton.position = CGPointMake(backgroundSprite.size.width * 0.393, backgroundSprite.size.height * 0.2437)
        infoButton.userInteractionEnabled = false
        infoButton.name = "infoButton"
        self.addChild(infoButton)

        // Video
        let filePath = NSBundle.mainBundle().pathForResource("hue", ofType: "mp4")
        let bundleURL = NSBundle.mainBundle()!.URLForResource("hue", withExtension: "txt")
        url = NSURL(string: "hue.mp4")

        moviePlayer.contentURL = NSURL.fileURLWithPath(filePath)
        moviePlayer.fullscreen = true
        moviePlayer.shouldAutoplay = true
        moviePlayer.prepareToPlay()
    }


    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {


        /* Called when a touch begins */

        for touch: AnyObject in touches {
            println("Something has Been Touched")
            var location:CGPoint = touch.locationInNode(self)
            var node:SKNode!
            node = self.nodeAtPoint(CGPoint(x: location.x, y: location.y))

            if node.name {
                if node.name == infoButton.name {
                    moviePlayer.play()
                }
            }
        }
    }

Я попытался удалить нерелевантный код.

Как вы заметили в разделе видео, у меня есть три разных метода получения пути к файлу. Я запустил println на всех из них, и они распечатывают следующим образом:

filePath печатается следующим образом: /Users/myname/Library/Developer/CoreSimulator/Devices/954CB013-FB55-4846-A8E0-A2773A3563FF/data/Containers/Bundle/Application/35DB47D4-FB78-4FBE-898B-A5Bappios /hue.mp4

bundleURL печатается как: file: /// Users / myname / Library / Developer / CoreSimulator / Devices / 954CB013-FB55-4846-A8E0-A2773A3563FF / data / Containers / Bundle / Application / 35DB47D4-FB78-4FBE-898B-A5B3435A0F6C -Wine.app/hue.mp4

url печатается как: hue.mp4 (вы, наверное, догадались)

Я использовал moviePlayer.contentURL = NSURL.fileURLWithPath (x) для каждого из них, где x - filePath, bundleURL или url, а ошибки следующие:

filePath: Thread: 1 EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0) В окне вывода отображается: фатальная ошибка: неожиданно обнаружен ноль при разворачивании необязательного значения (lldb)

bundleURL: этот не удается построить: отсутствует аргумент для параметра isDirectory в вызове

url: этот не удалось построить: отсутствует аргумент для параметра isDirectory в вызове

Я надеюсь, что я предоставил достаточно информации, чтобы вы получили хорошее представление о проблеме, если нет, дайте мне знать, и я опубликую ее.

Спасибо!

Дополнительный вопрос: если кто-то знает код для распознавания «щелчка вниз» и «отпускания» для узла спрайта при касании, чтобы я мог изменить изображение текстуры узла спрайта, когда кто-то касается его, это было бы потрясающе :) Или даже знаю, где я могу прочитать об этом.


person Pljeskavica    schedule 08.08.2014    source источник


Ответы (1)


Попробуй это:

let url = NSBundle.mainBundle().URLForResource("hue", withExtension: "mp4")

moviePlayer.contentURL = url
moviePlayer.fullscreen = true
moviePlayer.shouldAutoplay = true
moviePlayer.prepareToPlay()

У меня нет большого опыта работы с файлами, но это то, что один из пользователей stackoverflow предложил в каком-то посте, когда я искал способ воспроизвести видео в моем приложении.

person Shan    schedule 08.08.2014
comment
Это сработало, когда я изменил всю программу на UIKit, а не на SpriteKit. - person Pljeskavica; 28.08.2014