VideoFlint / Cabbage

A video composition framework build on top of AVFoundation. It's simple to use and easy to extend.
MIT License
1.52k stars 221 forks source link

Black video when added 2 overlay with different start time #24

Closed mvn-tony-hn closed 5 years ago

mvn-tony-hn commented 5 years ago

I write the simple demo as below:

`

  let backgroundTrackItem: TrackItem = {
        let url = Bundle.main.url(forResource: "bamboo", withExtension: "mp4")!
        let resource = AVAssetTrackResource(asset: AVAsset(url: url))
        let trackItem = TrackItem(resource: resource)
        trackItem.videoConfiguration.contentMode = .aspectFit
        return trackItem
  }()

  let overlay1: TrackItem = {

        let url = Bundle.main.url(forResource: "filmstrip_background1", withExtension: "png")!
        let image = CIImage(contentsOf: url)!
        let resource = ImageResource(image: image, duration: CMTime.init(seconds: 7, preferredTimescale: 600))
        let trackItem = TrackItem(resource: resource)
        trackItem.startTime = CMTime.init(seconds: 0, preferredTimescale: 600)
        trackItem.videoConfiguration.contentMode = .aspectFit
        let overlayHeight = renderSize.width/4

        let frame = CGRect.init(x: 0, y: 0, width: renderSize.width, height: overlayHeight)
        trackItem.videoConfiguration.contentMode = .custom
        trackItem.videoConfiguration.frame = frame;
        return trackItem
    }()

 let overlay2: TrackItem = {

       let url = Bundle.main.url(forResource: "black_overlay", withExtension: "png")!
        let image = CIImage(contentsOf: url)!
        let resource = ImageResource(image: image, duration: CMTime.init(seconds: 7, preferredTimescale: 600))
        let trackItem = TrackItem(resource: resource)
        trackItem.startTime = CMTime.init(seconds: 2, preferredTimescale: 600)

        trackItem.videoConfiguration.contentMode = .custom
        trackItem.videoConfiguration.frame = CGRect(x: 0, y: 0, width: renderSize.width/4, height: renderSize.height/4)
        return trackItem

    }()

  let timeline = Timeline()
  timeline.videoChannel = [backgroundTrackItem]
  timeline.overlays = [overlay1, overlay2]

 do {
           try Timeline.reloadVideoStartTime(providers: timeline.videoChannel)
    } catch {
        assert(false, error.localizedDescription)
    }
    timeline.renderSize = renderSize;

  let compositionGenerator = CompositionGenerator(timeline: timeline)
  let playerItem = compositionGenerator.buildPlayerItem()
  return playerItem

`

This code always return a black video. If I change the start time of overlay2 to 0, it works well. So How I can customize the start time of each overlay on video timeline?

P/s: Another question, How can I add text overlay on the video?

vitoziv commented 5 years ago

should fix here e94d136

About text overlay, I suggest you add text's image to Timeline.passingThroughVideoCompositionProvider

mvn-tony-hn commented 5 years ago

Great! This commit was resolved my issue. Please update it in the next version. I really thank you for your quick response. By the way, i'm using your library to do some video demo and it's really convenient for video editing. I will give more feedback if there are other issues. Thanks!