/** * Copyright (c) 2006 - 2012 Smaxe Ltd (www.smaxe.com). * All rights reserved. */ import com.smaxe.io.ByteArray; import com.smaxe.uv.media.core.IMedia; import com.smaxe.uv.media.core.IMediaFileReader; import com.smaxe.uv.media.core.IMediaFileWriter; import com.smaxe.uv.media.core.MediaContainer; import com.smaxe.uv.media.core.MediaTrackInfo; import com.smaxe.uv.media.sdk.IMediaContainerSdk; import com.smaxe.uv.media.sdk.IMediaSdk; import com.smaxe.uv.media.sdk.MediaSdkFactory; import com.smaxe.uv.media.util.IterableIterator; import java.io.File; import java.util.Iterator; /** * <code>ExMediaSdkMediaFileContainer</code> - {@link IMediaSdk} example to * read/write media files. * * @author Andrei Sochirca * @see <a href="http://www.smaxe.com/product.jsf?id=juv-media-sdk" target="_blank">JUV Media SDK</a> */ public final class ExMediaSdkMediaFileContainer extends Object { /** * Entry point. * * @param args * @throws Exception */ public static void main(final String[] args) throws Exception { // NOTE: // Evaluation version has some limitations: // - video decoder watermarks frames (and blacks it sometimes) IMediaSdk mediaSdk = MediaSdkFactory.getMediaSdk(); // // getMediaFileTracksAndSamples(mediaSdk, "d:/sample.flv"); createMediaFileSlice(mediaSdk, "d:/sample.flv", "d:/sample.h264", 0, 1000000); } /** * Creates <code>src</code> media file 'slice' starting with <code>start</code> timestamp. * * @param mediaSdk * @param src source file * @param dst destination file * @param start * @param duration * @throws Exception if an exception occurred */ public static void createMediaFileSlice(final IMediaSdk mediaSdk, final String src, final String dst, final long start, final long duration) throws Exception { final IMediaContainerSdk containerSdk = mediaSdk.getMediaContainerSdk(); final IMediaFileReader reader = containerSdk.openFileReader(new File(src)); // Note: media file container is the same as reader container final IMediaFileWriter writer = containerSdk.openFileWriter(new File(dst), MediaContainer.H264); // Note: if track is not defined than samples (from all tracks) are returned in time order final Iterator<IMedia.ITrackSample> samples = reader.getTrackSamples(MediaTrackInfo.ALL_TRACKS, start); for (IMedia.ITrackSample sample : new IterableIterator<IMedia.ITrackSample>(samples)) { final long timestamp = sample.getTimestamp(); if (timestamp > start + duration) break; final ByteArray sampleData = reader.readTrackSample(sample, new byte[(int) sample.getSize()], 0); writer.writeTrackSample(sample.getTrack(), timestamp, sampleData); } writer.close(); reader.close(); } /** * Prints media <code>file</code> tracks and samples. * * @param mediaSdk * @param file * @throws Exception if an exception occurred */ public static void printMediaFileTracksAndSamples(final IMediaSdk mediaSdk, final String file) throws Exception { final IMediaContainerSdk containerSdk = mediaSdk.getMediaContainerSdk(); final IMediaFileReader reader = containerSdk.openFileReader(new File(file)); final MediaTrackInfo[] tracks = reader.getTracksInfo(); for (int i = 0; i < tracks.length; i++) { System.out.println(tracks[i]); final Iterator<IMediaFileReader.ITrackSample> samples = reader.getTrackSamples(tracks[i], 0 /*timestamp*/); for (IMediaFileReader.ITrackSample sample : new IterableIterator<IMediaFileReader.ITrackSample>(samples)) { System.out.println(sample); } } reader.close(); } /** * Constructor. */ private ExMediaSdkMediaFileContainer() { } }