首页 > 解决方案 > 您如何实际播放 AVAssetTrack,而不是 AVURLAsset?

问题描述

假设您有一个小视频文件

let p = Bundle.main.path(forResource: "small", ofType: "mp4")
let url = NSURL.fileURL(withPath: p!)

您可以轻松地将其设为播放器项目并播放它..

let pi = AVPlayerItem(url: url)
av.player = AVPlayer(playerItem: pi)

或者,您可以将其设为 AVURLAsset,然后获取其中一个曲目

AVAssetTrack

 asset = AVURLAsset(url: url)
 let tracks:[AVAssetTrack] = asset!.tracks
 print(tracks.count)
 let track:AVAssetTrack = tracks[2]

那么.......你会播放其中一首曲目吗?

你怎么玩 AVAssetTrack ?

标签: avfoundationavasset

解决方案


下面的代码显示了如何创建AVMutableComposition仅包含所需曲目的曲目,然后像播放任何曲目一样播放乐曲,AVAsset因为考虑到名称,也许令人惊讶的是,它是一个:

let asset = AVURLAsset(url: url)
let track = asset.tracks[1]  // or whatever

let composition = AVMutableComposition()
let compositionTrack = composition.addMutableTrack(withMediaType: track.mediaType, preferredTrackID: kCMPersistentTrackID_Invalid)

try! compositionTrack?.insertTimeRange(CMTimeRange(start: .zero, duration: asset.duration), of: track, at: .zero)

let playerItem = AVPlayerItem(asset: composition)  // play me in your AVPlayer

NB在现实生活中tracksduration可能应该异步加载。


推荐阅读