Swift. Проблема с освоением AVFoundation
Цель: просто запустить 2 видео, одно за другим. Проблема: после того как заканчивается первое видео, на экране симулятора появляется не второе видео, а лагающее первое, а консоль бесконечно пестрит вот этими двумя ошибками:
2021-02-20 17:14:01.662121+0300 AVFoundation_Homework[10491:832640] [] [17:14:01.662] H264_DecodeFrameAsynchronously signalled err=-8969 (err) (H264_DecodeFrameAsynchronously frame failed) at /Library/Caches/com.apple.xbs/Sources/CoreMediaH264SWLib_Bundle_Sim/CoreMediaH264SWLib-574/VCPAVC/H264VideoDecoder.c:1838
2021-02-20 17:14:01.662412+0300 AVFoundation_Homework[10491:832640] [] [17:14:01.662] vtDecompressionDuctDecodeSingleFrame signalled err=-8969 (err) (VTVideoDecoderDecodeFrame returned error) at /Library/Caches/com.apple.xbs/Sources/EmbeddedCoreMedia_Sim/EmbeddedCoreMedia-2765.6/Sources/VideoToolbox/VTDecompressionSession.c:4863
Вот мой код на всякий случай:
import UIKit
import AVFoundation
class AssetStore{
let video1: AVAsset
let video2: AVAsset
let video3: AVAsset
let music1: AVAsset
let music2: AVAsset
init(video1: AVAsset, video2: AVAsset, video3: AVAsset, music1: AVAsset, music2: AVAsset) {
self.video1 = video1
self.video2 = video2
self.video3 = video3
self.music1 = music1
self.music2 = music2
}
static func asset (_ resource: String, type: String) -> AVAsset {
guard let path = Bundle.main.path(forResource: resource, ofType: type) else { fatalError() }
let url = URL(fileURLWithPath: path)
return AVAsset(url: url)
}
static func test() -> AssetStore {
return AssetStore(video1: asset("1", type: "mp4"),
video2: asset("2", type: "mp4"),
video3: asset("3", type: "mp4"),
music1: asset("music1", type: "mp3"),
music2: asset("music2", type: "mp3")
)
}
func compose() -> AVAsset {
let composition = AVMutableComposition()
guard let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { fatalError() }
guard let audioTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { fatalError() }
func insert (track: AVMutableCompositionTrack, asset: AVAsset, at: CMTime, type: AVMediaType, duratinon: CMTime ) {
try? track.insertTimeRange(
CMTimeRange(start: CMTime.zero, duration: duratinon),
of: asset.tracks(withMediaType: type)[0],
at: at)
}
insert(track: videoTrack, asset: video1, at: CMTime.zero, type: .video, duratinon: video1.duration)
insert(track: videoTrack, asset: video2, at: video1.duration , type: .video, duratinon: video2.duration)
return composition
}
}
class ViewController: UIViewController {
let store = AssetStore.test()
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
startPlaying(asset: store.compose())
}
func startPlaying(asset: AVAsset) {
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
player.play()
}
}