# Package com.codename1.media

package com.codename1.media

Video and Audio playback support are handled within this package using the `com.codename1.media.Media` & `com.codename1.media.MediaManager` APIs. Said API's allow for video playback both within a native full screen player and embedded within an application screen.

Simplified video playback API is also available via the `com.codename1.components.MediaPlayer` class. Capture/recording is handled separately for the most part thru the `com.codename1.capture.Capture` API. However, there is some basic low level recording functionality within `com.codename1.media.MediaManager` as well.

The code below demonstrates capturing and playing back audio files using this API:

    Form hi = new Form("Capture", BoxLayout.y());
    hi.setToolbar(new Toolbar());
    Style s = UIManager.getInstance().getComponentStyle("Title");
    FontImage icon = FontImage.createMaterial(FontImage.MATERIAL_MIC, s);

    FileSystemStorage fs = FileSystemStorage.getInstance();
    String recordingsDir = fs.getAppHomePath() + "recordings/";
    fs.mkdir(recordingsDir);
    try {
        for(String file : fs.listFiles(recordingsDir)) {
            MultiButton mb = new MultiButton(file.substring(file.lastIndexOf("/") + 1));
            mb.addActionListener((e) -> {
                try {
                    Media m = MediaManager.createMedia(recordingsDir + file, false);
                    m.play();
                } catch(IOException err) {
                    Log.e(err);
                }
            });
            hi.add(mb);
        }

        hi.getToolbar().addCommandToRightBar("", icon, (ev) -> {
            try {
                String file = Capture.captureAudio();
                if(file != null) {
                    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MMM-dd-kk-mm");
                    String fileName =sd.format(new Date());
                    String filePath = recordingsDir + fileName;
                    Util.copy(fs.openInputStream(file), fs.openOutputStream(filePath));
                    MultiButton mb = new MultiButton(fileName);
                    mb.addActionListener((e) -> {
                        try {
                            Media m = MediaManager.createMedia(filePath, false);
                            m.play();
                        } catch(IOException err) {
                            Log.e(err);
                        }
                    });
                    hi.add(mb);
                    hi.revalidate();
                }
            } catch(IOException err) {
                Log.e(err);
            }
        });
    } catch(IOException err) {
        Log.e(err);
    }
    hi.show();

The sample code below demonstrates simple video playback.

    final Form hi = new Form("MediaPlayer", new BorderLayout());
    hi.setToolbar(new Toolbar());
    Style s = UIManager.getInstance().getComponentStyle("Title");
    FontImage icon = FontImage.createMaterial(FontImage.MATERIAL_VIDEO_LIBRARY, s);
    hi.getToolbar().addCommandToRightBar(new Command("", icon) {
    @Override
        public void actionPerformed(ActionEvent evt) {
            Display.getInstance().openGallery((e) -> {
                if(e != null && e.getSource() != null) {
                    String file = (String)e.getSource();
                    try {
                        Media video = MediaManager.createMedia(file, true);
                        hi.removeAll();
                        hi.add(BorderLayout.CENTER, new MediaPlayer(video));
                        hi.revalidate();
                    } catch(IOException err) {
                        Log.e(err);
                    }
                }
            }, Display.GALLERY_VIDEO);
        }
    });
    hi.show();

- Class
  Description
  AbstractMedia
  An abstract base class for AsyncMedia.
  AsyncMedia
  An interface for media elements that provides asynchronous pause and play functionality as well as support for state change events, so that interested parties can register to be notified when state changes between play and pause.
  AsyncMedia.MediaErrorEvent
  Encapsulates a media error event.
  AsyncMedia.MediaErrorType
  Enum encapsulating the different types of media errors that can occur.
  AsyncMedia.MediaException
  Encapsulates a media exception.
  AsyncMedia.MediaStateChangeEvent
  Encapsulates a state-change event on a Media object.
  AsyncMedia.PauseRequest
  An async resource used to track the progress of a pauseAsync() request.
  AsyncMedia.PlayRequest
  An async resource used to track the progress of a playAsync() request.
  AsyncMedia.State
  An enum to represent the state of a media object.
  AudioBuffer
  This class can be used to capture raw PCM data from the device's microphone.
  AudioBuffer.AudioBufferCallback
  A callback that can be registered to receive notifications when the contents of the AudioBuffer is changed.
  Media
  Media control interface allows for media playback, recording.
  MediaManager
  Allow us to create `Media` objects using String URI's or with a stream to the media data.
  MediaMetaData
  MetaData for use by `RemoteControlListener` to provide information about the currently playing background media on the device's lock screen.
  MediaRecorderBuilder
  A builder class to generate a Media recorder with specific settings.
  RemoteControlListener
  A base class that is meant to be overridden to implement functionality that responds to the device's remote control for media playback.
  WAVWriter
  A class that can write raw PCM data to a WAV file.