Generating a fragmented file typically involves creating an init segment followed by media segments.
1. Create the Init Segment
Use mp4.CreateEmptyInit() and add tracks. You must fill in codec-specific parameters (like HEVC descriptors) into the sample descriptor.
2. Produce Media Segments
Media segments should use the same timescale set in the init segment. A segment contains one or more fragments. Each fragment consists of a moof and an mdat box.
To create a segment from a collection of samples, use mp4.FullSample to define the data and metadata, then add them to a fragment within a segment.
3. Encode the Segment
Segments can be written to an io.Writer or a bits.SliceWriter.
// 1. Create Init
init := mp4.CreateEmptyInit()
init.AddEmptyTrack(timescale, mediatype, language)
init.Moov.Trak.SetHEVCDescriptor("hvc1", vpsNALUs, spsNALUs, ppsNALUs)
// 2. Create Media Segment
seg := mp4.NewMediaSegment()
frag := mp4.CreateFragment(uint32(segNr), mp4.DefaultTrakID)
seg.AddFragment(frag)
for _, sample := range samples {
frag.AddFullSample(sample)
}
// 3. Encode
err := seg.Encode(w) // to io.Writer
// or
err := seg.EncodeSW(sw) // to bits.SliceWriter