0

I fetch the timestamps from every frame and store them in an array using the showTimestamps function. I now want to "draw" each timestamp on each frame of the video, and export it.

func showTimestamps(videoFile : URL) -> [String] {
    let asset = AVAsset(url:videoFile)
    let track = asset.tracks(withMediaType: AVMediaType.video)[0]
    let output = AVAssetReaderTrackOutput(track: track, outputSettings: nil)
    guard let reader = try? AVAssetReader(asset: asset) else {exit(1)}
    output.alwaysCopiesSampleData = false
    reader.add(output)
    reader.startReading()
    
    var times : [String] = []
    while(reader.status == .reading){
        if let sampleBuffer = output.copyNextSampleBuffer() , CMSampleBufferIsValid(sampleBuffer) && CMSampleBufferGetTotalSampleSize(sampleBuffer) != 0 {
            let frameTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer)
            if (frameTime.isValid){
                times.append(String(format:"%.3f", frameTime.seconds))
            }
        }
    }
    return times.sorted()
}

However, I cannot figure out how to export a new video with each frame containing it's respectful timestamp? i.e How can I implement this code:

func generateNewVideoWithTimestamps(videoFile: URL, timestampsForFrames: [String]) {
    // TODO
}

I want to keep the framerate, video quality, etc., the same. The only thing that should differ is to add some text on the bottom.

To get this far, I used these guides and failed: Frames, Static Text, Watermark

angryip
  • 2,140
  • 5
  • 33
  • 67

0 Answers0