Как воспроизвести видео с URL-адреса с помощью SKVideoNode?

Я получаю URL-адрес с помощью PHPickerViewControllerDelegate. Я подтвердил, что мой URL-адрес правильно передан в код, но когда я играю узел видео, видео не отображается, и я не слышу никакого звука, так что это не проблема с наслоением. Мы можем назвать этот вариант 1.

ОБНОВЛЕНИЕ: я думал, что смогу решить проблему с помощью AVPlayer, поэтому я попробовал два дополнительных способа (вариант 2) поместить видеофайл в проект, что сработало, но не решило мою проблему с извлечением файлов из моего локального каталога. (Вариант 3) с использованием видео из локального каталога, что не сработало. Окно SKVideoNode отображается, но видео не воспроизводится.

Это говорит мне, что это как-то связано с URL-адресом локального каталога. Есть ли что-то, что мне нужно включить в конфиденциальность, чтобы видео показывалось? Я так близко, но кажусь таким далеким.

Optional(file:///private/var/mobile/Containers/Data/Application/3D99929D-CFC4-418A-B215-3AE463F3AD38/tmp/.com.apple.Foundation.NSItemProvider.WMPrvs/RPReplay_Final1617465667.mp4)

import Foundation
import SpriteKit
import GameplayKit
import PhotosUI

class AnimationInventory18: SKScene {
 
   var chosenCharacterSceneUse1: CharacterSkin?
    var chosenBackgroundSceneUse1: BackgroundSkin?
    var selectedTextSceneUse1: String?
    var chosenImageSceneUse1: UIImage?
    var chosenLivePhotoSceneUse1: PHLivePhoto?
    var chosenVideoSceneUse1: URL?

    //MARK: First Party Class Initializers
    init(size: CGSize, chosenChateracterSceneUse: CharacterSkin?,selectedTextSceneUse: String?, chosenBackgroundSceneUse: BackgroundSkin?, chosenImageSceneUse: UIImage?, chosenLivePhotoSceneUse: PHLivePhoto?, chosenVideoSceneUse: URL? ){
        super.init(size:size)
        self.chosenCharacterSceneUse1 = chosenChateracterSceneUse
        self.selectedTextSceneUse1 = selectedTextSceneUse
        self.chosenBackgroundSceneUse1 = chosenBackgroundSceneUse
        self.chosenImageSceneUse1 = chosenImageSceneUse
        self.chosenLivePhotoSceneUse1 = chosenLivePhotoSceneUse
        self.chosenVideoSceneUse1 = chosenVideoSceneUse
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func niceToMeetYou() {
        videoPlay()     
    }

    func videoPlay(){
        // below print statement outputs - *Optional(file:///private/var/mobile/Containers/Data/Application/3D99929D-CFC4-418A-B215-3AE463F3AD38/tmp/.com.apple.Foundation.NSItemProvider.WMPrvs/RPReplay_Final1617465667.mp4)*
        print(chosenVideoSceneUse1)

        let video2 = SKVideoNode(url: chosenVideoSceneUse1!)
     
        video2.position = CGPoint(x: 90, y: -40)
        video2.zPosition = 1
        video2.xScale = 5
        video2.yScale = 5

        // below print statement outputs - *<SKVideoNode> name:'(null)' position:{90, -40} size:{0, 0} rotation:0.00*
        print(video2)
        addChild(video2)
        video2.play()

        //Plays but isnt ideal since pulling from project files instead of local director
        let urlStr = Bundle.main.path(forResource: "TryToHaveANiceDay-20210322", ofType: "mov")
        print(urlStr)
        let url = NSURL(fileURLWithPath: urlStr!)
        let player2 = AVPlayer(url: url as URL)
        let videoNode = SKVideoNode(avPlayer: player2)
        
        
        videoNode.position = CGPoint(x: 0, y: 0)
        videoNode.zPosition = 100
        videoNode.size = CGSize(width: 100, height: 100)
        videoNode.xScale = 1
        videoNode.yScale = 1

        addChild(videoNode)
        videoNode.play()
        

        // SKVideoNode displays but content does not
        let player = AVPlayer(url: chosenVideoSceneUse1! as URL)
        print(player)
        let video3 = SKVideoNode(avPlayer: player)

        video3.position = CGPoint(x: 0, y: 0)
        video3.zPosition = 100
        video3.size = CGSize(width: 100, height: 100)
        video3.xScale = 1
        video3.yScale = 1        

        addChild(video3)
        video3.play()

    //MARK: Override functions
    override func didMove(to view: SKView) {
        niceToMeetYou()
        
    }

    }


person Ojay    schedule 16.04.2021    source источник
comment
Перед «let video2 ..» добавьте это «let url2 = URL(fileURLWithPath: selectedVideoSceneUse1!)», затем измените video2 на «let video2 = SKVideoNode(url: url2)». В качестве альтернативы, не могли бы вы изменить zPosition на 100 вместо 1.   -  person JohnL    schedule 16.04.2021
comment
@JohnL Спасибо! но для набора url2 он говорит, что не может преобразовать значение типа URL в ожидаемый тип аргумента String...   -  person Ojay    schedule 16.04.2021
comment
Хорошо, тогда игнорируйте url2. Я могу запустить ваш код в func videoPlay, если я заменю selectedVideoSceneUse1 своим собственным URL-адресом, видео будет отображаться со звуком. Затем вам нужно показать, как вы определяете selectedVideoSceneUse1.   -  person JohnL    schedule 16.04.2021
comment
@JohnL selectedVideoSceneUse1 имеет тип URL, который включает следующую ссылку: *Optional(file:///private/var/mobile/Containers/Data/Application/3D99929D-CFC4-418A-B215-3AE463F3AD38/tmp/.com.apple.Foundation.NSItemProvider.WMPrvs/RPReplay_Final1617465667.mp4)* Исходная переменная задается через другой vc, доступ к которому осуществляется через мой контроллер вкладок. Видео воспроизводится нормально, если я использую SKVideoNode(fileNamed:), но я хочу, чтобы пользователь мог использовать видео из своей библиотеки.   -  person Ojay    schedule 16.04.2021
comment
@JohnL, как вы вводите URL? Вы используете необработанный текст? Если это так, это строка, а не URL-адрес.   -  person Ojay    schedule 26.04.2021
comment
@Ojay переместите объявление AVPlayer из своего метода stackoverflow.com/a/30988140/2303865   -  person Leo Dabus    schedule 29.04.2021
comment
@LeoDabus спасибо, но не сработало. Проблема как-то связана с URL-адресом, если я использую этот метод let urlStr = Bundle.main.path(forResource: "TryToHaveANiceDay-20210322", ofType: "mov"), он работает нормально, однако, когда я использую этот метод, let video2 = SKVideoNode(url: chosenVideoSceneUse1!) он не работает. Метод video2 получает URL-адрес от моего метода phpicker. Я считаю, что это как-то связано с конфиденциальностью библиотеки фотографий, но не могу найти работающее решение.   -  person Ojay    schedule 30.04.2021
comment
Вероятно, вы пытаетесь открыть URL ресурса. Это может помочь stackoverflow.com/a/43944769/2303865   -  person Leo Dabus    schedule 30.04.2021
comment
@LeoDabus спасибо за наводку, я буду углубляться в нее. Это сложно, потому что Apple устарела от UIImagePicker, и теперь вам нужно использовать PHPicker: [developer.apple.com/ документация/фотокит/   -  person Ojay    schedule 30.04.2021
comment
@LeoDabus я поставил точку останова сразу после video2.play(), в отладчике, рядом с моим свойством, содержащим URL-адрес, он говорит (URL?) Не удалось получить поле «некоторые» из необязательного selectedVideoSceneUse1 знаете ли вы, что это значит ? Я пытался искать, но не повезло.   -  person Ojay    schedule 05.05.2021