Els*_*mak 6 nsdata ios avasset swift avplayeritem
有没有办法将数据转换为 AVAsset/AVURLAsset 或更好的 AVPlayerItem?我找到了一个将数据转换为 PHAsset 的答案,需要先将其保存到桌面。有没有更好的办法?
由于我还没有找到一种没有临时文件的方法,根据 Elsammak 的示例,这里有一个小帮助程序类,负责删除临时文件(TemporaryMediaFile只要您使用AVAsset,临时文件就会保留在周围)当对象被释放时被删除,或者您可以.deleteFile()手动调用它):
import Foundation
import AVKit
class TemporaryMediaFile {
    var url: URL?
    init(withData: Data) {
        let directory = FileManager.default.temporaryDirectory
        let fileName = "\(NSUUID().uuidString).mov"
        let url = directory.appendingPathComponent(fileName)
        do {
            try withData.write(to: url)
            self.url = url
        } catch {
            print("Error creating temporary file: \(error)")
        }
    }
    public var avAsset: AVAsset? {
        if let url = self.url {
            return AVAsset(url: url)
        }
        return nil
    }
    public func deleteFile() {
        if let url = self.url {
            do {
                try FileManager.default.removeItem(at: url)
                self.url = nil
            } catch {
                print("Error deleting temporary file: \(error)")
            }
        }
    }
    deinit {
        self.deleteFile()
    }
}
用法示例:
    let data = Data(bytes: ..., count: ...)
    let tempFile = TemporaryMediaFile(withData: data)
    if let asset = tempFile.avAsset {
        self.player = AVPlayer(playerItem: AVPlayerItem(asset: asset))
    }
    // ..keep "tempFile" around while it's playing..
    tempFile.deleteFile()
我成功做到了,这里是为任何感兴趣的人提供的。
extension Data {
    func getAVAsset() -> AVAsset {
        let directory = NSTemporaryDirectory()
        let fileName = "\(NSUUID().uuidString).mov"
        let fullURL = NSURL.fileURL(withPathComponents: [directory, fileName])
        try! self.write(to: fullURL!)
        let asset = AVAsset(url: fullURL!)
        return asset
    }
}