Я пытаюсь создать систему кэширования, чтобы кэшировать некоторые видео на экране-заставке, чтобы улучшить взаимодействие с пользователем при первом открытии приложения.
вот что я сделал в своем диспетчере кэша< /p>
if let cachedFileURL = LocalJackpotsCacheManager.shared.getCachedURL(forKey: cacheKey) {
// Log cached file details for confirmation
do {
let data = try Data(contentsOf: cachedFileURL)
print("Cached file successfully loaded into Data object, size: \(data.count) bytes")
} catch {
print("Failed to load cached file into Data object: \(error.localizedDescription)")
}
// Prepare the video for playback
let asset = AVURLAsset(url: cachedFileURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
// Configure the cell with the player
cell.configure(with: player)
player.play() // Start playback immediately if desired
} else {
// If file is not cached, download and cache it
LocalJackpotsCacheManager.shared.cacheVideo(from: videoURL, forKey: cacheKey) {
if let cachedFileURL = LocalJackpotsCacheManager.shared.getCachedURL(forKey: cacheKey) {
DispatchQueue.main.async {
// Prepare the downloaded video for playback
let asset = AVURLAsset(url: cachedFileURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
cell.configure(with: player)
player.play()
}
}
}
}
знаю, что именно с этим не так, но файл загружен и распечатан его размера! Keep говорит: «Невозможно открыть».
попытайтесь кэшировать и воспроизвести видео с локального компьютера, но сохранить не удалось.
Я пытаюсь создать систему кэширования, чтобы кэшировать некоторые видео на экране-заставке, чтобы улучшить взаимодействие с пользователем при первом открытии приложения. вот что я сделал в своем диспетчере кэша< /p> [code]class CacheManager {static let shared = LocalJackpotsCacheManager() [/code] [code]private let fileManager = FileManager.default private let cacheDirectory: URL private let databaseURL: URL private var db: OpaquePointer?
private init() { // Set cacheDirectory to the Documents directory cacheDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("VideoCache") databaseURL = cacheDirectory.appendingPathComponent("videoCacheMetadata.sqlite")
createCacheDirectoryIfNeeded() setupDatabase() }
private func createCacheDirectoryIfNeeded() { if !fileManager.fileExists(atPath: cacheDirectory.path) { do { try fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true, attributes: nil) } catch { print("Failed to create cache directory: \(error)") } } }
private func setupDatabase() { if sqlite3_open(databaseURL.path, &db) == SQLITE_OK { let createTableQuery = """ CREATE TABLE IF NOT EXISTS VideoCache ( id TEXT PRIMARY KEY, path TEXT, lastAccessed INTEGER ); """ if sqlite3_exec(db, createTableQuery, nil, nil, nil) != SQLITE_OK { print("Failed to create VideoCache table") } } else { print("Unable to open database") } }
func cleanOldCache(limit: Int) { let selectOldItemsQuery = """ SELECT id, path FROM VideoCache ORDER BY lastAccessed ASC LIMIT ?; """ var selectStatement: OpaquePointer?
while sqlite3_step(selectStatement) == SQLITE_ROW { let id = String(cString: sqlite3_column_text(selectStatement, 0)) let path = String(cString: sqlite3_column_text(selectStatement, 1))
// Delete the file from disk do { try fileManager.removeItem(atPath: path) } catch { print("Error deleting file from disk: \(error)") }
// Remove from database deleteCacheEntry(withId: id) } }
sqlite3_finalize(selectStatement) }
private func deleteCacheEntry(withId id: String) { let deleteQuery = "DELETE FROM VideoCache WHERE id = ?;" var deleteStatement: OpaquePointer?
и как я пытаюсь его использовать [code] if let cachedFileURL = LocalJackpotsCacheManager.shared.getCachedURL(forKey: cacheKey) { // Log cached file details for confirmation do { let data = try Data(contentsOf: cachedFileURL) print("Cached file successfully loaded into Data object, size: \(data.count) bytes") } catch { print("Failed to load cached file into Data object: \(error.localizedDescription)") } // Prepare the video for playback let asset = AVURLAsset(url: cachedFileURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true]) let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem)
// Configure the cell with the player cell.configure(with: player) player.play() // Start playback immediately if desired
} else { // If file is not cached, download and cache it LocalJackpotsCacheManager.shared.cacheVideo(from: videoURL, forKey: cacheKey) { if let cachedFileURL = LocalJackpotsCacheManager.shared.getCachedURL(forKey: cacheKey) {
DispatchQueue.main.async { // Prepare the downloaded video for playback let asset = AVURLAsset(url: cachedFileURL, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true]) let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem)
cell.configure(with: player) player.play() } } } } [/code] знаю, что именно с этим не так, но файл загружен и распечатан его размера! Keep говорит: «Невозможно открыть». попытайтесь кэшировать и воспроизвести видео с локального компьютера, но сохранить не удалось.
Я пытаюсь создать систему кэширования, чтобы кэшировать некоторые видео на экране-заставке, чтобы было удобнее работать с пользователем, особенно при первом открытии приложения.
вот что я сделал в своем диспетчере кэша
class CacheManager {static...
Как можно программно поделиться видео, например, взятым из библиотеки фотографий пользователя, в Messenger?
В метадокументации говорится, что можно поделиться URL-адресом или фотографией .
Заголовок MessageDialog говорит, что поддерживаются только...
class MediaAdapter(
private val mediaList: List,
private val activity: FragmentActivity // Use FragmentActivity context for lifecycle support
) : RecyclerView.Adapter() {
class MediaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {...
class MediaAdapter(
private val mediaList: List,
private val activity: FragmentActivity // Use FragmentActivity context for lifecycle support
) : RecyclerView.Adapter() {
class MediaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {...