We are currently using the following skeleton code for encrypting fragmented mp4 content per segment:
mp4Data, err := mp4.DecodeFile(segReader)
...
for _, s := range mp4Data.Segments { // always 1 segment...
for _, f := range s.Fragments {
err = mp4.EncryptFragment(f, args.keyBytes, args.iv, args.ipd)
...
}
}
buf := bytes.Buffer{}
err = mp4Data.Encode(&buf)
...
We would like to use encryption on live content, where media segments and fragments are produced continuously. Latency is critical, so ideally we would want to encrypt and output fragments as soon as they become available in the source reader, without waiting for complete segments (with all of their fragments) to be available. Maybe something along these lines:
var segReader io.Reader = ...
var segWriter io.Writer = ...
mp4.EncryptSegment(segReader, segWriter, args.keyBytes, args.iv, args.ipd)