package com.castlabs.dash.dashfragmenter.cmdlines; import com.googlecode.mp4parser.authoring.Movie; import com.googlecode.mp4parser.authoring.Track; import com.googlecode.mp4parser.authoring.builder.FragmentedMp4Builder; import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator; import com.googlecode.mp4parser.authoring.tracks.CencEncryptingTrackImpl; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; import org.kohsuke.args4j.spi.FileOptionHandler; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.WritableByteChannel; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class CencEncryptAndMux extends AbstractEncryptOrNotCommand { private static Logger LOG = Logger.getLogger(CencEncryptAndMux.class.getName()); @Argument(required = true, handler = FileOptionHandler.class, usage = "Clear MP4 file", metaVar = "myVideo.mp4, myAudio.mp4") protected List<File> inputFiles; @Option(name = "--outputfile", aliases = "-o", usage = "output file - if no output file is given output.mp4 is used", metaVar = "PATH") protected File outputFile = new File(System.getProperty("user.dir") + File.separator + "output.mp4"); public int run() { try { List<Track> tracks = new ArrayList<Track>(); if (!(outputFile.getParentFile().exists() ^ outputFile.getParentFile().mkdirs())) { System.err.println("Output directory does not exist and cannot be created."); } for (File inputFile : inputFiles) { if (!inputFile.getName().endsWith(".mp4")) { LOG.severe("Only MP4 files are supported as input."); return 87263; } Movie m = MovieCreator.build(inputFile.getAbsolutePath()); for (Track track : m.getTracks()) { if ("soun".equals(track.getHandler()) && audioKeyId != null) { tracks.add(new CencEncryptingTrackImpl(track, audioKeyId, audioKey, false)); } else if ("vide".equals(track.getHandler()) && videoKeyId != null) { tracks.add(new CencEncryptingTrackImpl(track, videoKeyId, videoKey, false)); } else { tracks.add(track); } } } Movie nuMovie = new Movie(); nuMovie.setTracks(tracks); WritableByteChannel wbc = new FileOutputStream(outputFile).getChannel(); new FragmentedMp4Builder().build(nuMovie).writeContainer(wbc); wbc.close(); return 0; } catch (IOException e) { LOG.log(Level.SEVERE, e.getMessage(), e); return 763; } } }