Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2020 Audio & Video

WWDC20 · 22 min · Audio & Video

Author fragmented MPEG-4 content with AVAssetWriter

Transform your audio and video content into fragmented MPEG-4 files for a faster and smoother HLS streaming experience. Learn how to work with the fragmented MPEG-4 format, generate fragmented content from a movie, and set up AVAssetWriter to create fragments for HLS output.

Watch at developer.apple.com ↗

Transcript all transcripts

Code shown on screen · 6 snippets

Instantiate AVAssetWriter and input swift · at 5:36 ↗
// Instantiate asset writer
let assetWriter = AVAssetWriter(contentType: UTType(AVFileType.mp4.rawValue)!)

// Add inputs
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: compressionSettings)
			
assetWriter.add(videoInput)
Configure AVAssetWriter swift · at 6:28 ↗
assetWriter.outputFileTypeProfile = .mpeg4AppleHLS

assetWriter.preferredOutputSegmentInterval = CMTime(seconds: 6.0, preferredTimescale: 1)

assetWriter.initialSegmentStartTime = myInitialSegmentStartTime

assetWriter.delegate = myDelegateObject
Delegate methods swift · at 8:00 ↗
optional func assetWriter(_ writer: AVAssetWriter, didOutputSegmentData segmentData: Data, segmentType: AVAssetSegmentType)


optional func assetWriter(_ writer: AVAssetWriter, didOutputSegmentData segmentData: Data, segmentType: AVAssetSegmentType, segmentReport: AVAssetSegmentReport?)
AVAssetSegmentType swift · at 8:37 ↗
public enum AVAssetSegmentType : Int {
    case initialization = 1 
    case separable = 2
}
Custom segmentation swift · at 13:45 ↗
// Set properties
assetWriter.outputFileTypeProfile = .mpeg4AppleHLS

assetWriter.preferredOutputSegmentInterval = .indefinite

assetWriter.delegate = myDelegateObject

// Passthrough
let videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: nil)
Audio has dependencies swift · at 15:17 ↗
extension AVAssetTrack {
       /* indicates whether this audio track has dependencies (e.g. kAudioFormatMPEGD_USAC) */
    open var hasAudioSampleDependencies: Bool { get }
}

Resources