【问题标题】:AVMutableComposition - Only Playing First Track (Swift)AVMutableComposition - 只播放第一首曲目 (Swift)
【发布时间】:2016-05-16 13:31:37
【问题描述】:

我有一个 [AVAsset] 数组,我正在尝试将所有这些资产组合到一个资产中,以便我可以无缝播放视频(我尝试使用 AVQueuePlayer,但这不会播放资产无缝)。

以下是我到目前为止的内容,但是当我尝试播放最终作品时,它只播放第一首曲目,即使它显示它具有所有曲目并且总持续时间等于所有曲目的总和。

我是否遗漏了一个步骤,即使所有曲目似乎都在作曲中?如果 AVPlayerItem 有多个轨道,也许我需要以不同的方式处理 AVPlayer?

let playerLayer: AVPlayerLayer = AVPlayerLayer()
lazy var videoPlayer: AVPlayer = AVPlayer()

var videoClips = [AVAsset]()

let videoComposition = AVMutableComposition()
var playerItem: AVPlayerItem!
var lastTime: CMTime = kCMTimeZero

for clipIndex in videoClips {

    let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))

    do {
        try videoCompositionTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipIndex.duration),
                                                  ofTrack: clipIndex.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                                                  atTime: lastTime)
        lastTime = CMTimeAdd(lastTime, clipIndex.duration)
    } catch {
        print("Failed to insert track")
    }
}
print("VideoComposition Tracks: \(videoComposition.tracks.count)") // Shows multiple tracks

playerItem = AVPlayerItem(asset: videoComposition)
print("PlayerItem Duration: \(playerItem.duration.seconds)") // Shows the duration of all tracks together
print("PlayerItem Tracks: \(playerItem.tracks.count)") // Shows same number of tracks as the VideoComposition Track count

videoPlayer = AVPlayer(playerItem: playerItem)
playerLayer.player = videoPlayer
videoPlayer.volume = 0.0
videoPlayer.play()  // Only plays the first track

【问题讨论】:

    标签: ios swift avplayer avasset avmutablecomposition


    【解决方案1】:

    我能够找出最重要的问题的答案。为了一起播放所有剪辑,它们需要位于同一轨道中。为此,请将以下行移到 for 循环之外(之前):

    let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
    

    这是完整的、更正后的代码:

    let playerLayer: AVPlayerLayer = AVPlayerLayer()
    lazy var videoPlayer: AVPlayer = AVPlayer()
    
    var videoClips = [AVAsset]()
    
    let videoComposition = AVMutableComposition()
    var playerItem: AVPlayerItem!
    var lastTime: CMTime = kCMTimeZero
    
    let videoCompositionTrack = videoComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
    
    for clipIndex in videoClips {
    
        do {
            try videoCompositionTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipIndex.duration),
                                                      ofTrack: clipIndex.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                                                      atTime: lastTime)
            lastTime = CMTimeAdd(lastTime, clipIndex.duration)
        } catch {
            print("Failed to insert track")
        }
    }
    print("VideoComposition Tracks: \(videoComposition.tracks.count)") // Shows multiple tracks
    
    playerItem = AVPlayerItem(asset: videoComposition)
    print("PlayerItem Duration: \(playerItem.duration.seconds)") // Shows the duration of all tracks together
    print("PlayerItem Tracks: \(playerItem.tracks.count)") // Shows same number of tracks as the VideoComposition Track count
    
    videoPlayer = AVPlayer(playerItem: playerItem)
    playerLayer.player = videoPlayer
    videoPlayer.volume = 0.0
    videoPlayer.play()  // Does play all clips sequentially
    

    编辑:我之前提到过,我仍然想知道如何在一个资产中播放多个曲目。这不是它的工作原理,我现在明白了。一个很好的资源:

    https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html

    【讨论】:

    • 不正确,如果您创建AVMutableVideoComposition,则可以播放多个轨道,并在该轨道的layerInstruction 中将轨道的不透明度设置为0(在轨道末端)。
    • Here,它说,在可能的情况下,每种媒体类型应该只有一个合成轨道。这种兼容资产轨道的统一导致资源使用量最少。串行呈现媒体数据时,应将任何相同类型的媒体数据放在同一合成轨道上。
    • 我可以通过这样做在 AVPlayer 中播放我的合并视频,但我在播放时第二个视频的方向错误,但在导出后我得到了正确的方向。有相同的解决方案吗?
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多