We can make mixComposition with AVMutableComposition with multiple audio asset, then play on AVPlayer. like as:
var player: AVPlayer?
func addMultipleTrack(videoURL1: URL, videoURL2: URL, videoURL3: URL) {
let asset1 = AVURLAsset(url: videoURL1)
let asset2 = AVURLAsset(url: videoURL2)
let asset3 = AVURLAsset(url: videoURL3)
let composition = AVMutableComposition()
var timeRange = CMTimeRange(start: .zero, duration: asset1.duration)
if let audioAssetTrack1 = asset1.tracks(withMediaType: .audio).first,
let compositionAudioTrack1 = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) {
do {
try compositionAudioTrack1.insertTimeRange(timeRange, of: audioAssetTrack1, at: .zero)
}catch {
print(error)
return
}
}
timeRange = CMTimeRange(start: .zero, duration: asset2.duration)
if let audioAssetTrack2 = asset2.tracks(withMediaType: .audio).first,
let compositionAudioTrack2 = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) {
do {
try compositionAudioTrack2.insertTimeRange(timeRange, of: audioAssetTrack2, at: .zero)
}catch {
print(error)
return
}
}
timeRange = CMTimeRange(start: .zero, duration: asset3.duration)
if let audioAssetTrack3 = asset3.tracks(withMediaType: .audio).first,
let compositionAudioTrack3 = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) {
do {
try compositionAudioTrack3.insertTimeRange(timeRange, of: audioAssetTrack3, at: .zero)
}catch {
print(error)
return
}
}
let item = AVPlayerItem(asset: composition)
player = AVPlayer(playerItem: item)
let layer = AVPlayerLayer(player: player!)
tempView.layer.addSublayer(layer) // it just hold layer but not need to show ,So you can hide in your won way
player?.play()
}