从Assets.xcsets加载视频

Load video from Assets.xcassets(从Assets.xcsets加载视频)
本文介绍了从Assets.xcsets加载视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

TL;DR:如果我将视频存储在Assets.xcsets中,如何播放该视频?

我有大约50个视频想要存储在一个应用程序中。然后我将使用按需资源抓取来使我的应用程序更小。但我只能通过将视频保存在Assets.xcsets中来实现这一点。我找不到从那里加载视频的方法,因为AVPlayer似乎只接受URL,我真的不确定如何才能为像那样的本地存储资源获得URL。

更新:

所以我做了进一步的调查,发现在资产目录中存储视频并仍然能够使用它们实际上是不可能的。我最终不得不将它们从资产目录中移出。至于按需获取资源,目录外的资源仍有可能。您可以找到类似的方法here。

推荐答案

现在可以在Assets.xcsets中加载视频,但仍然可以播放它们。 在Xcode 12.0.1 SWIFT 5上测试

import UIKit
import AVKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func createLocalUrl(for filename: String, ofType: String) -> URL? {
        let fileManager = FileManager.default
        let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
        let url = cacheDirectory.appendingPathComponent("(filename).(ofType)")
        
        guard fileManager.fileExists(atPath: url.path) else {
            guard let video = NSDataAsset(name: filename)  else { return nil }
            fileManager.createFile(atPath: url.path, contents: video.data, attributes: nil)
            return url
        }
        
        return url
    }
    
    @IBAction func playLocalVideo(_ sender: Any) {
        guard let videoURL = createLocalUrl(for: "video", ofType: "mp4") else {
            return
        }
        
        // Create an AVPlayer, passing it the local video url path
        let player = AVPlayer(url: videoURL as URL)
        let controller = AVPlayerViewController()
        controller.player = player
        present(controller, animated: true) {
            player.play()
        }
    }
}

Assets.xcassets image

如何创建本地URL:https://stackoverflow.com/a/39748919/4267092

这篇关于从Assets.xcsets加载视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)