/**
* Copyright (c) 2006 - 2012 Smaxe Ltd (www.smaxe.com).
* All rights reserved.
*/
import com.smaxe.logger.ILogger;
import com.smaxe.logger.support.Loggers;
import com.smaxe.uv.media.core.VideoFrame;
import com.smaxe.uv.media.java.audio.JavaAudioPlayback;
import com.smaxe.uv.media.java.swing.JVideoScreen;
import com.smaxe.uv.media.player.IMediaPlayerModel;
import com.smaxe.uv.media.player.JMediaPlayer;
import com.smaxe.uv.media.sdk.IMediaPlayerModelSdk;
import com.smaxe.uv.media.sdk.IMediaSdk;
import com.smaxe.uv.media.sdk.MediaSdkFactory;
import com.smaxe.uv.media.sdk.codec.AacJaadAudioCodecSdk;
import com.smaxe.uv.media.sdk.codec.Mp3JavazoomAudioCodecSdk;
import com.smaxe.uv.media.sdk.codec.SpeexAudioCodecSdk;
import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
* <code>ExMediaSdkMediaPlayer</code> - {@link IMediaSdk} example to play media file, rtmp or rtsp resource.
*
* @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 ExMediaSdkMediaPlayer 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)
final String file = "d:/ratatouille.mp4";
IMediaSdk mediaSdk = MediaSdkFactory.getMediaSdk();
playMedia(mediaSdk, createMediaPlayerModel(mediaSdk, file));
}
/**
* Creates {@link IMediaPlayerModel} instance for the <code>url</code>.
*
* @param sdk
* @param url
* @return media player model
* @throws IOException if an I/O exception occurred
*/
private static IMediaPlayerModel createMediaPlayerModel(final IMediaSdk sdk, final String url) throws IOException
{
IMediaPlayerModelSdk mediaPlayerModelSdk = sdk.createMediaPlayerModelSdk();
mediaPlayerModelSdk.setMediaCodecSdk(MediaSdkFactory.createCompositeMediaCodecSdk(new AacJaadAudioCodecSdk(), new Mp3JavazoomAudioCodecSdk(), new SpeexAudioCodecSdk()));
if (url.startsWith("rtmp"))
{
int ndx = url.indexOf("/mp4:");
if (ndx < 0) ndx = url.lastIndexOf('/');
final String stream = url.substring(ndx + 1);
final String path = url.substring(0, ndx);
final ExMediaSdkMediaPlayerPlayRtmpStream.RtmpMediaStreamReader reader = new ExMediaSdkMediaPlayerPlayRtmpStream.RtmpMediaStreamReader(path, stream);
reader.setLogger(Loggers.createSoLogger(ILogger.DEBUG, reader.id()));
return mediaPlayerModelSdk.create(reader);
}
else
if (url.startsWith("rtsp"))
{
final ExMediaSdkMediaPlayerPlayRtspStream.RtspMediaStreamReader reader = new ExMediaSdkMediaPlayerPlayRtspStream.RtspMediaStreamReader(url, 12444);
reader.setLogger(Loggers.createSoLogger(ILogger.DEBUG, reader.id()));
return mediaPlayerModelSdk.create(reader);
}
else
{
return mediaPlayerModelSdk.create(url);
}
}
/**
* Plays the media.
*
* @param mediaSdk
* @param model media player model
* @throws Exception if an exception occurred
*/
public static void playMedia(final IMediaSdk mediaSdk, final IMediaPlayerModel model) throws Exception
{
final JVideoScreen videoScreen = new JVideoScreen();
final JMediaPlayer mediaPlayer = JMediaPlayer.create(model);
mediaPlayer.setAudioPlayback(new JavaAudioPlayback());
mediaPlayer.setListener(new JMediaPlayer.ListenerAdapter()
{
@Override
public void onVideoFrame(final VideoFrame frame, final int[] frameCropOffset)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
videoScreen.setFrameCropOffset(frameCropOffset == null ?
null : new Insets(frameCropOffset[0], frameCropOffset[1], frameCropOffset[2], frameCropOffset[3]));
videoScreen.setFrame(frame);
}
});
}
});
JButton start = new JButton(new AbstractAction("Play")
{
private final static long serialVersionUID = -3538347901572402162L;
public void actionPerformed(final ActionEvent e)
{
mediaPlayer.startPlayback();
}
});
final JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
mediaPlayer.stopPlayback();
System.exit(0);
}
});
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(videoScreen, BorderLayout.CENTER);
frame.getContentPane().add(start, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
/**
* Constructor.
*/
private ExMediaSdkMediaPlayer()
{
}
}