Как обойти ошибку платформы Mac Catalyst, из-за которой в сеансе экспорта не отображается вывод Core Animation?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как обойти ошибку платформы Mac Catalyst, из-за которой в сеансе экспорта не отображается вывод Core Animation?

Сообщение Anonymous »


Подтверждено, что это ошибка платформы (происходит на Mac Catalyst, но не на iOS или iPadOS), и, похоже, виновником является AVVideoCompositionCoreAnimationTool?

/// Экспортирует видео с целевой анимацией. функция экспортаВидео() { пусть назначениеURL = createExportFileURL (от: Дата()) Guard let videoURL = Bundle.main.url(forResource: "black_video", withExtension: "mp4") else { делегат?.exporterDidFailExporting(экспортер: self) print("Не могу найти видео") возвращаться } // Инициализируем видеоресурс пусть актив = AVURLAsset (url: videoURL, параметры: [AVURLAssetPreferPrecisionDurationAndTimingKey: true]) Guard пусть assetsVideoTrack: AVAssetTrack = assets.tracks(withMediaType: AVMediaType.video).first, let assetsAudioTrack: AVAssetTrack = assets.tracks(withMediaType: AVMediaType.audio).first else { return } пусть композиция = AVMutableComposition() Guard let videoCompTrack = Composition.addMutableTrack(withMediaType: AVMediaType.video, PreferredTrackID: Int32(kCMPersistentTrackID_Invalid)), let audioCompTrack = Composition.addMutableTrack(withMediaType: AVMediaType.audio,eferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { return } videoCompTrack.preferredTransform = assetsVideoTrack.preferredTransform // Получаем продолжительность пусть videoDuration = assets.duration.секунды // Получаем видеопрямоугольник let videoSize = assetsVideoTrack.naturalSize.applying(assetVideoTrack.preferredTransform) пусть videoRect = CGRect (происхождение: .zero, размер: videoSize) // Инициализируем целевые слои и анимацию анимацияLayers = TargetView.initTargetViewAndAnimations(atPoint: CGPoint(x: videoRect.midX, y: videoRect.midY), atSecondsIntoVideo: 2, videoRect: videoRect) // Устанавливаем скорость воспроизведения пусть продолжительность = CMTime (секунды: videoDuration, Предпочтительная шкала времени: CMTimeScale (600)) let applyRange = CMTimeRange (начало: .ноль, конец: продолжительность) videoCompTrack.scaleTimeRange(appliedRange, toDuration: продолжительность) audioCompTrack.scaleTimeRange(appliedRange, toDuration: продолжительность) // Создаем видеослой. пусть видеослой = CALayer() videolayer.frame = CGRect(начало: .ноль, размер: videoSize) // Создаем родительский слой. пусть родительский слой = CALayer() родительский слой.frame = CGRect (происхождение: .ноль, размер: videoSize) родительский слой.addSublayer(видеослой) пусть раз = timesForEvent (startTime: 0,1, endTime: продолжительность.секунды - 0,01) пусть timeRangeForCurrentSlice = times.timeRange // Вставляем соответствующий сегмент видеодорожки делать { попробуйте videoCompTrack.insertTimeRange(timeRangeForCurrentSlice, of: assetsVideoTrack, at: .zero) попробуйте audioCompTrack.insertTimeRange(timeRangeForCurrentSlice, of: assetsAudioTrack, at: .zero) } поймать пусть compError { print("TrimVideo: ошибка во время композиции: \(compError)") делегат?.exporterDidFailExporting(экспортер: self) возвращаться } // Добавляем все ненулевые слои анимации для экспорта. для слоя в анимацииLayers.compactMap({ $0 }) { родительский слой.addSublayer(слой) } // Настраиваем состав слоя. пусть LayerComposition = AVmutableVideoComposition() LayerComposition.frameDuration = CMTimeMake (значение: 1, временной масштаб: 30) LayerComposition.renderSize = размер видео LayerComposition.animationTool = AVVideoCompositionCoreAnimationTool( postProcessingAsVideoLayer: видеослой, в: родительский слой) let инструкции = initVideoCompositionInstructions( videoCompositionTrack: videoCompTrack, assetsVideoTrack: assetsVideoTrack) LayerComposition.instructions = инструкции // Создает сеанс экспорта и асинхронно экспортирует видео. Guard let ExportSession = initExportSession( состав: состав, URL-адрес назначения: URL-адрес назначения, LayerComposition: LayerComposition) else { делегат?.exporterDidFailExporting(экспортер: self) возвращаться } // Выполняем экспорт ExportSession.exportAsynchronous(completionHandler: { если пусть ошибка = ExportSession.error { print("Ошибка экспорта: \(ошибка), \(error.localizedDescription)") } self.delegate?.exporterDidFinishExporting(экспортер: self, с: URL назначения) }) } Не знаю, как реализовать собственный композитор, который выполняет ту же анимацию, что и этот воспроизводимый случай:

класс AnimationCreator: NSObject { // ОТМЕТКА: - Целевые анимации /// Создает целевые анимации. статическая функция addAnimationsToTargetView (_ targetView: TargetView, startTime: Double) { // Добавляем анимацию внешнего вида AnimationCreator.addAppearanceAnimation(on: targetView, defaultBeginTime: AVCoreAnimationBeginTimeAtZero, startTime: startTime) // Добавляем анимацию пульса. AnimationCreator.addTargetPulseAnimation(on: targetView, defaultBeginTime: AVCoreAnimationBeginTimeAtZero, startTime: startTime) // Добавляем анимацию вращения AnimationCreator.addRotationAnimation(to: targetView, BeginTime: AVCoreAnimationBeginTimeAtZero, startTime: startTime) } /// Добавляет анимацию появления к цели частная статическая функция addAppearanceAnimation (в targetView: TargetView, defaultBeginTime: Double = 0, startTime: Double = 0) { // Запускает цель прозрачной, а затем делает ее непрозрачной в указанное время targetView.targetImageView.layer.opacity = 0 пусть появляется = CABasicAnimation(keyPath: "opacity") появляются.длительность = .greatestFiniteMagnitude // оставаться на экране навсегда появляются.fromValue = 1.0 // Непрозрачный появляются.toValue = 1.0 // Непрозрачный появляются.beginTime = defaultBeginTime + startTime targetView.targetImageView.layer.add(появляются, forKey: "появляются") } /// Добавляет к цели пульсирующую анимацию. частная статическая функция addTargetPulseAnimation (в targetView: TargetView, defaultBeginTime: Double = 0, startTime: Double = 0) { let targetPulse = CABasicAnimation(keyPath: "transform.scale") targetPulse.fromValue = 1 // Обычный размер targetPulse.toValue = 1.1 // Немного больший размер targetPulse.duration = 0,4 targetPulse.beginTime = defaultBeginTime + startTime targetPulse.autoreverses = правда targetPulse.repeatCount = .greatestFiniteMagnitude targetView.targetImageView.layer.add(targetPulse, forKey: "pulse_animation") } /// Добавляет к цели анимацию вращения. частная статическая функция addRotationAnimation (to targetView: TargetView, BeginTime: Double = 0, startTime: Double = 0) { пусть вращение: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z") ротация.toValue = Double.pi * 2 // поворот по полному кругу вращение.длительность = 1,0 вращение.isCumulative = правда вращение.repeatCount = .greatestFiniteMagnitude вращение.beginTime = начало времени targetView.targetImageView.layer.add(вращение, forKey: "rotation_animation") } } В более крупном проекте я попытался изменить

/// Создает анимацию изменения счета для новой точки. func initScoreChangeStartAnimation (scoreViewLayer: CALayer, startTime: Double, продолжительность: Double) { letcoreAnimation = CABasicAnimation(keyPath: «opacity») ScoreAnimation.duration = длительность — VideoHighlightReelOverlayUIConstants.pointChangeAnimationDuration ScoreAnimation.fromValue = 1 ScoreAnimation.toValue = 1 ScoreAnimation.beginTime = время начала // Добавляем анимацию в слой представления партитуры. ScoreViewLayer.add(scoreAnimation, forKey: "scoreChangeStart") } /// Создает анимацию изменения счета для счета следующего очка. func initScoreChangeEndAnimation (scoreViewLayer: CALayer, startTime: Double, продолжительность: Double) { letcoreAnimation = CABasicAnimation(keyPath: «opacity») ScoreAnimation.duration = VideoHighlightReelOverlayUIConstants.pointChangeAnimationDuration ScoreAnimation.fromValue = 1 ScoreAnimation.toValue = 1 ScoreAnimation.beginTime = startTime + (продолжительность — VideoHighlightReelOverlayUIConstants.pointChangeAnimationDuration) // Добавляем анимацию в слой представления партитуры. ScoreViewLayer.add(scoreAnimation, forKey: "scoreChangeEnd") } в

/// Создает анимацию изменения счета для новой точки. func initScoreChangeStartAnimation (scoreViewLayer: CALayer, startTime: Double, продолжительность: Double) { letcoreAnimation = CAKeyframeAnimation(keyPath: «opacity») let mainDuration = продолжительность - VideoHighlightReelOverlayUIConstants.pointChangeAnimationDuration ОценкаАнимация.значения = [1.0, 1.0] ScoreAnimation.keyTimes = [0, NSNumber(значение: mainDuration/duration)] ScoreAnimation.duration = продолжительность ScoreAnimation.beginTime = время начала // Добавляем анимацию в слой представления партитуры. ScoreViewLayer.add(scoreAnimation, forKey: "scoreChangeStart") } /// Создает анимацию изменения счета для счета следующего очка. func initScoreChangeEndAnimation (scoreViewLayer: CALayer, startTime: Double, продолжительность: Double) { let ScoreAnimation = CAKeyframeAnimation(keyPath: «непрозрачность») let mainDuration = VideoHighlightReelOverlayUIConstants.pointChangeAnimationDuration ОценкаАнимация.значения = [1.0, 1.0] ScoreAnimation.keyTimes = [NSNumber(значение: (длительность - mainDuration)/длительность), 1] ScoreAnimation.duration = продолжительность ScoreAnimation.beginTime = время начала // Добавляем анимацию в слой представления партитуры. ScoreViewLayer.add(scoreAnimation, forKey: "scoreChangeEnd") } но он не отображается при экспорте Mac Catalyst. Я также закомментировал другие экземпляры CABasicAnimation.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Приложение Mac Catalyst Crashed на других Mac, но работает при запуске из Xcode
    Anonymous » » в форуме IOS
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Приложение Mac Catalyst Crashed на других Mac, но работает при запуске из Xcode
    Anonymous » » в форуме IOS
    0 Ответы
    290 Просмотры
    Последнее сообщение Anonymous
  • CSS Animation-Iteration-Count портит режим Animation-fill-mode [закрыто]
    Anonymous » » в форуме CSS
    0 Ответы
    72 Просмотры
    Последнее сообщение Anonymous
  • Swiftui: MatchEdgeMetryEffect и Animation Animation Clipshape
    Anonymous » » в форуме IOS
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Ошибка замены выбранного текста UITextView Mac Catalyst
    Anonymous » » в форуме IOS
    0 Ответы
    77 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»