Recherche avancée

Médias (1)

Mot : - Tags -/bug

Autres articles (13)

  • Encoding and processing into web-friendly formats

    13 avril 2011, par

    MediaSPIP automatically converts uploaded files to internet-compatible formats.
    Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
    Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
    Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
    All uploaded files are stored online in their original format, so you can (...)

  • Use, discuss, criticize

    13 avril 2011, par

    Talk to people directly involved in MediaSPIP’s development, or to people around you who could use MediaSPIP to share, enhance or develop their creative projects.
    The bigger the community, the more MediaSPIP’s potential will be explored and the faster the software will evolve.
    A discussion list is available for all exchanges between users.

  • Supporting all media types

    13 avril 2011, par

    Unlike most software and media-sharing platforms, MediaSPIP aims to manage as many different media types as possible. The following are just a few examples from an ever-expanding list of supported formats : images : png, gif, jpg, bmp and more audio : MP3, Ogg, Wav and more video : AVI, MP4, OGV, mpg, mov, wmv and more text, code and other data : OpenOffice, Microsoft Office (Word, PowerPoint, Excel), web (html, CSS), LaTeX, Google Earth and (...)

Sur d’autres sites (4709)

  • how to send audio or video by packet though udp and sync the iamge and audio

    24 janvier 2019, par Wei Wen

    how to send part of video and audio from mp4 as packet though udp from server
    Client will play the part of packet resevice.

    import java.awt.Dimension ; import java.awt.image.BufferedImage ; import
    java.io.ByteArrayOutputStream ; import java.io.IOException ; import
    java.io.ObjectOutputStream ; import java.math.BigInteger ; import
    java.net.DatagramPacket ; import java.net.DatagramSocket ; import
    java.net.ServerSocket ; import java.net.Socket ; import
    java.nio.ByteBuffer ; import java.nio.ShortBuffer ; import
    java.util.ArrayList ; import java.util.Arrays ; import
    javax.imageio.ImageIO ; import javax.sound.sampled.AudioFileFormat ;
    import javax.sound.sampled.AudioFormat ; import javax.swing.JTextArea ;

    import org.bytedeco.javacv.FFmpegFrameGrabber ; import
    org.bytedeco.javacv.Frame ; import
    org.bytedeco.javacv.Java2DFrameConverter ;

    import Enum.EType.ClientState ; import View.SingleDisplayWindow ;

    import java.security.InvalidKeyException ; import
    java.security.NoSuchAlgorithmException ; import java.util.Timer ; import
    java.util.TimerTask ; import java.util.concurrent.CountDownLatch ;
    import java.util.concurrent.ExecutionException ;

    import javax.crypto.BadPaddingException ; import
    javax.crypto.IllegalBlockSizeException ; import
    javax.crypto.NoSuchPaddingException ; import
    org.bytedeco.javacv.FrameGrabber ;

    public class SCon private final static int PORT = 8888 ;

    private final JTextArea TEXT_AREA ; private volatile
    SingleDisplayWindow DISPLAY ; /////

    private final String BD_USER_NAME, DB_PASSWORD ; private Database
    database ;

    private boolean isRunning ;

    private RSA serverRSA, clientRSA ;

    private int keyIndex, typeID = 0 ; private String mediatype = "" ;
    private ArrayList sHandlers ;

    private FileStreamingThread fileStreamingThread ; private
    VideoStreamingThread videoStreamingThread ; private BroadcastThread
    broadcastThread ; private ConnectThread connectThread ;

    private volatile static byte[] currentVideoFrame = new byte[0],
    currentAudioFrame = new byte[0] ; // current image music

    public void run() startServer() ;

     isRunning = true;       fileStreamingThread = new

    FileStreamingThread(videoFile) ; videoStreamingThread = new
    VideoStreamingThread(videoFile) ;
    //CountDownLatch latch = new CountDownLatch(1) ; fileStreamingThread.start() ; videoStreamingThread.start() ;
    //latch.countDown() ;

             broadcastThread = new BroadcastThread();        broadcastThread.start();

     connectThread = new ConnectThread();        connectThread.start();  }

    public void stop() isRunning = false ;

     try {           new Socket("localhost", PORT);

     } catch (IOException e) {           e.printStackTrace();        }

     while (fileStreamingThread.isAlive()) {

     }

     while (broadcastThread.isAlive()) {

     }

     while (connectThread.isAlive()) {

     }

     for (SHandler sHandler : sHandlers) {           sHandler.connectionClose();
     }       sHandlers.clear();      DISPLAY.dispose();
     TEXT_AREA.append("\nServer stop\n");    }


     private class VideoStreamingThread extends Thread {         private

    FFmpegFrameGrabber grabber ; // Used to extract frames from video file.
    private Java2DFrameConverter converter ; // Used to convert frames to
    image private int curIndex ; // Current key index

     public VideoStreamingThread(String video_file) {            videoFile =

    videoFile ; grabber = new FFmpegFrameGrabber(videoFile) ;
    converter = new Java2DFrameConverter() ; try
    grabber.restart() ;

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }           curIndex = keyIndex;        }

     public void run() {             try {

             while (isRunning) {
                 curIndex = keyIndex;
                 Frame frame = null;
                 System.out.println("v1");
                 if ((frame = grabber.grab()) != null) { // Grab next frame from video file
                     if (frame.image != null) { // image frame

                         BufferedImage bi = converter.convert(frame); // convert frame to image

                         // Convert BufferedImage to byte[]
                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
                         ImageIO.write(bi, "jpg", baos);
                         // Encrypt data and store as the current image of byte[] type
                         currentVideoFrame = ciphers[curIndex].doFinal(baos.toByteArray());                                                                          
                         //////////////////
                         DISPLAY.setSize(new Dimension(bi.getWidth(), bi.getHeight()));
                         DISPLAY.updateImage(bi); // Display image
                     //  Thread.sleep((long) ( 999 / grabber.getFrameRate()));

                         ///////////////
                         typeID = 1;
                         mediatype = grabber.getFormat();

                     }
                 } else {
                     grabber.restart();
                 } // Restart when reached end of video
             }
             grabber.close();

         } catch (IOException e) {
             e.printStackTrace();

         } catch (IllegalBlockSizeException e) {
             e.printStackTrace();

         } catch (BadPaddingException e) {
             e.printStackTrace();

         }           //catch (InterruptedException e) {e.printStackTrace(); }        }

     public synchronized int getCurKeyIndex() {          return curIndex;        }

     public synchronized void getVideoFile(String video_file) {
         videoFile = video_file;             grabber = new

    FFmpegFrameGrabber(video_file) ; converter = new
    Java2DFrameConverter() ;

         try {
             grabber.release();
             grabber.restart();

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }       }   }       private class FileStreamingThread extends Thread {      private FFmpegFrameGrabber

    grabber ; // Used to extract frames from video file. private int
    curIndex ; // Current key index

     public FileStreamingThread(String video_file) {             videoFile =

    videoFile ; grabber = new FFmpegFrameGrabber(videoFile) ; try
    grabber.restart() ;

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }           curIndex = keyIndex;        }

     public void run() {             try {

             while (isRunning) {
                 curIndex = keyIndex;
                 Frame frame = null;

                 System.out.println("a2");
                 if ((frame = grabber.grabSamples()) != null) { // Grab next frame from video file
                     if (frame.samples != null) { // audio frame
                         // Encrypt audio

                         ShortBuffer channelSamplesShortBuffer = (ShortBuffer) frame.samples[0];
                         channelSamplesShortBuffer.rewind();

                         ByteBuffer outBuffer = ByteBuffer.allocate(channelSamplesShortBuffer.capacity() * 2);

                         for (int i = 0; i < channelSamplesShortBuffer.capacity(); i++) {
                             short val = channelSamplesShortBuffer.get(i);
                             outBuffer.putShort(val);
                         }

                         AudioFileFormat audiofileFormat = new AudioFileFormat(null, null, typeID);
                         AudioFormat audioFormat = new AudioFormat(44100, 16, 2, true, true);
                         //System.out.println(grabber.getSampleFormat());
                         // Encrypt data and store as the current audio of byte[] type
                         currentAudioFrame = ciphers[curIndex].doFinal(outBuffer.array());

                         DISPLAY.updateAudio(outBuffer.array(), grabber.getFormat()); // Display image audio
                     //  Thread.sleep((long) (1000 / grabber.getSampleRate()));

                          //                         AudioFormat audioFormat = new AudioFormat(grabber.getSampleRate(), grabber.getAudioBitrate(),

    grabber.getAudioChannels(), true, true) ;
    // DISPLAY.updateAudio(outBuffer.array(), audioFormat) ; //
    Display image audio
    outBuffer.clear() ;

                         typeID = 2;
                         mediatype = grabber.getFormat();

                     }      
                 } else {
                     grabber.restart();
                 } // Restart when reached end of video
             }
             grabber.close();

         } catch (IOException e) {
             e.printStackTrace();

         } catch (IllegalBlockSizeException e) {
             e.printStackTrace();

         } catch (BadPaddingException e) {
             e.printStackTrace();

         }       }

     public synchronized int getCurKeyIndex() {          return curIndex;        }

     public synchronized void getVideoFile(String video_file) {
         videoFile = video_file;             grabber = new

    FFmpegFrameGrabber(video_file) ;

         try {
             grabber.release();
             grabber.restart();

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }       }   }

    public void setVideoFile(String videoFile) this.videoFile =
    videoFile ;

    public void setThreadFile(String video_file)
    fileStreamingThread.getVideoFile(video_file) ;
    videoStreamingThread.getVideoFile(video_file) ;

    private class BroadcastThread extends Thread public void run()
    while (isRunning)
    Thread.yield() ;

             for (int i = 0; i < sHandlers.size(); i++) {
                 if (sHandlers.get(i).getClientState() == ClientState.R) {
                     sHandlers.get(i).setClientState(ClientState.W);
                     BroadcastWorker workerThread = new BroadcastWorker(sHandlers.get(i));
                     workerThread.start();
                 }
             }           }       }   }

    private class BroadcastWorker extends Thread SHandler sHandler =
    null ;

     public BroadcastWorker(SHandler sHandler) {             this.sHandler =

    sHandler ;

     public void run() {             try {
             DatagramSocket out = new DatagramSocket(); // used to send UDP packets

             while (sHandler.getClientState() == ClientState.W) {
                 Thread.yield();

                 StreamFile s = new StreamFile(typeID, currentVideoFrame, currentAudioFrame, mediatype);
                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                 ObjectOutputStream os = new ObjectOutputStream(outputStream);
                 os.writeObject(s);
                 byte[] data = outputStream.toByteArray();
                     // Create and send UDP packet
                 DatagramPacket videoPacket = new DatagramPacket(data, data.length,
                         sHandler.getClientSocket().getInetAddress(),
                         Integer.parseInt(sHandler.getClientPort()));
                     out.send(videoPacket);

             }           } catch (IOException e) {
             e.printStackTrace();            }       }   }

    private class ConnectThread extends Thread public void run()
    TEXT_AREA.append("\nWaiting for clients’ connection.....\n") ;

         try {
             ServerSocket serverSocket = new ServerSocket(PORT);
             Socket clientSocket = null;

             while (isRunning) {
                 clientSocket = serverSocket.accept();

                 if (isRunning) {
                     SHandler sHandler = new SHandler(clientSocket, serverRSA, clientRSA, sessionKeys[keyIndex],
                             TEXT_AREA);
                     sHandler.start();
                     sHandlers.add(sHandler);
                 }
             }
             serverSocket.close();
             if (clientSocket != null) {
                 clientSocket.close();
             }

         } catch (IOException e) {
             e.printStackTrace();            }       }   } }

    my audio and image not sync.

  • how to send audio or video by packet though udp

    20 janvier 2019, par Wei Wen

    how to send part of video and audio from mp4 as packet though udp from server
    Client will play the part of packet resevice.

    import java.awt.Dimension ; import java.awt.image.BufferedImage ; import
    java.io.ByteArrayOutputStream ; import java.io.IOException ; import
    java.io.ObjectOutputStream ; import java.math.BigInteger ; import
    java.net.DatagramPacket ; import java.net.DatagramSocket ; import
    java.net.ServerSocket ; import java.net.Socket ; import
    java.nio.ByteBuffer ; import java.nio.ShortBuffer ; import
    java.util.ArrayList ; import java.util.Arrays ; import
    javax.imageio.ImageIO ; import javax.sound.sampled.AudioFileFormat ;
    import javax.sound.sampled.AudioFormat ; import javax.swing.JTextArea ;

    import org.bytedeco.javacv.FFmpegFrameGrabber ; import
    org.bytedeco.javacv.Frame ; import
    org.bytedeco.javacv.Java2DFrameConverter ;

    import Enum.EType.ClientState ; import View.SingleDisplayWindow ;

    import java.security.InvalidKeyException ; import
    java.security.NoSuchAlgorithmException ; import java.util.Timer ; import
    java.util.TimerTask ; import java.util.concurrent.CountDownLatch ;
    import java.util.concurrent.ExecutionException ;

    import javax.crypto.BadPaddingException ; import
    javax.crypto.IllegalBlockSizeException ; import
    javax.crypto.NoSuchPaddingException ; import
    org.bytedeco.javacv.FrameGrabber ;

    public class SCon private final static int PORT = 8888 ;

    private final JTextArea TEXT_AREA ; private volatile
    SingleDisplayWindow DISPLAY ; /////

    private final String BD_USER_NAME, DB_PASSWORD ; private Database
    database ;

    private boolean isRunning ;

    private RSA serverRSA, clientRSA ;

    private int keyIndex, typeID = 0 ; private String mediatype = "" ;
    private ArrayList sHandlers ;

    private FileStreamingThread fileStreamingThread ; private
    VideoStreamingThread videoStreamingThread ; private BroadcastThread
    broadcastThread ; private ConnectThread connectThread ;

    private volatile static byte[] currentVideoFrame = new byte[0],
    currentAudioFrame = new byte[0] ; // current image music

    public void run() startServer() ;

     isRunning = true;       fileStreamingThread = new

    FileStreamingThread(videoFile) ; videoStreamingThread = new
    VideoStreamingThread(videoFile) ;
    //CountDownLatch latch = new CountDownLatch(1) ; fileStreamingThread.start() ; videoStreamingThread.start() ;
    //latch.countDown() ;

             broadcastThread = new BroadcastThread();        broadcastThread.start();

     connectThread = new ConnectThread();        connectThread.start();  }

    public void stop() isRunning = false ;

     try {           new Socket("localhost", PORT);

     } catch (IOException e) {           e.printStackTrace();        }

     while (fileStreamingThread.isAlive()) {

     }

     while (broadcastThread.isAlive()) {

     }

     while (connectThread.isAlive()) {

     }

     for (SHandler sHandler : sHandlers) {           sHandler.connectionClose();
     }       sHandlers.clear();      DISPLAY.dispose();
     TEXT_AREA.append("\nServer stop\n");    }


     private class VideoStreamingThread extends Thread {         private

    FFmpegFrameGrabber grabber ; // Used to extract frames from video file.
    private Java2DFrameConverter converter ; // Used to convert frames to
    image private int curIndex ; // Current key index

     public VideoStreamingThread(String video_file) {            videoFile =

    videoFile ; grabber = new FFmpegFrameGrabber(videoFile) ;
    converter = new Java2DFrameConverter() ; try
    grabber.restart() ;

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }           curIndex = keyIndex;        }

     public void run() {             try {

             while (isRunning) {
                 curIndex = keyIndex;
                 Frame frame = null;
                 System.out.println("v1");
                 if ((frame = grabber.grab()) != null) { // Grab next frame from video file
                     if (frame.image != null) { // image frame

                         BufferedImage bi = converter.convert(frame); // convert frame to image

                         // Convert BufferedImage to byte[]
                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
                         ImageIO.write(bi, "jpg", baos);
                         // Encrypt data and store as the current image of byte[] type
                         currentVideoFrame = ciphers[curIndex].doFinal(baos.toByteArray());                                                                          
                         //////////////////
                         DISPLAY.setSize(new Dimension(bi.getWidth(), bi.getHeight()));
                         DISPLAY.updateImage(bi); // Display image
                     //  Thread.sleep((long) ( 999 / grabber.getFrameRate()));

                         ///////////////
                         typeID = 1;
                         mediatype = grabber.getFormat();

                     }
                 } else {
                     grabber.restart();
                 } // Restart when reached end of video
             }
             grabber.close();

         } catch (IOException e) {
             e.printStackTrace();

         } catch (IllegalBlockSizeException e) {
             e.printStackTrace();

         } catch (BadPaddingException e) {
             e.printStackTrace();

         }           //catch (InterruptedException e) {e.printStackTrace(); }        }

     public synchronized int getCurKeyIndex() {          return curIndex;        }

     public synchronized void getVideoFile(String video_file) {
         videoFile = video_file;             grabber = new

    FFmpegFrameGrabber(video_file) ; converter = new
    Java2DFrameConverter() ;

         try {
             grabber.release();
             grabber.restart();

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }       }   }       private class FileStreamingThread extends Thread {      private FFmpegFrameGrabber

    grabber ; // Used to extract frames from video file. private int
    curIndex ; // Current key index

     public FileStreamingThread(String video_file) {             videoFile =

    videoFile ; grabber = new FFmpegFrameGrabber(videoFile) ; try
    grabber.restart() ;

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }           curIndex = keyIndex;        }

     public void run() {             try {

             while (isRunning) {
                 curIndex = keyIndex;
                 Frame frame = null;

                 System.out.println("a2");
                 if ((frame = grabber.grabSamples()) != null) { // Grab next frame from video file
                     if (frame.samples != null) { // audio frame
                         // Encrypt audio

                         ShortBuffer channelSamplesShortBuffer = (ShortBuffer) frame.samples[0];
                         channelSamplesShortBuffer.rewind();

                         ByteBuffer outBuffer = ByteBuffer.allocate(channelSamplesShortBuffer.capacity() * 2);

                         for (int i = 0; i < channelSamplesShortBuffer.capacity(); i++) {
                             short val = channelSamplesShortBuffer.get(i);
                             outBuffer.putShort(val);
                         }

                         AudioFileFormat audiofileFormat = new AudioFileFormat(null, null, typeID);
                         AudioFormat audioFormat = new AudioFormat(44100, 16, 2, true, true);
                         //System.out.println(grabber.getSampleFormat());
                         // Encrypt data and store as the current audio of byte[] type
                         currentAudioFrame = ciphers[curIndex].doFinal(outBuffer.array());

                         DISPLAY.updateAudio(outBuffer.array(), grabber.getFormat()); // Display image audio
                     //  Thread.sleep((long) (1000 / grabber.getSampleRate()));
                     //  Thread.sleep((long) (1000 / grabber.getAudioBitrate()));
                     //  System.out.println(grabber.getFormat());
                          //                         System.out.println("audioInputStream.getFormat() = " +

    grabber.getFormat()) ; // System.out.println("Sample.length
    = " + grabber.length) ; // System.out.println("FrameLength :" + grabber.getFrameLength()) ; //
    System.out.println("Frame Size :" + grabber.getFrameSize()) ; //
    System.out.println("SampleSizeInBits :" +
    grabber.getSampleSizeInBits()) ; //
    System.out.println("Frame Rate : " + grabber.getFrameRate()) ; //
    System.out.println("Sample Rate :" + grabber.getSampleRate()) ; //
    System.out.println("Encoding :" + grabber.getEncoding()) ; //
    System.out.println("Channels : " + grabber.getChannels()) ;
    // AudioFormat audioFormat = new AudioFormat(grabber.getSampleRate(), grabber.getAudioBitrate(),
    grabber.getAudioChannels(), true, true) ;
    // DISPLAY.updateAudio(outBuffer.array(), audioFormat) ; //
    Display image audio
    outBuffer.clear() ;

                         typeID = 2;
                         mediatype = grabber.getFormat();

                     }      
                 } else {
                     grabber.restart();
                 } // Restart when reached end of video
             }
             grabber.close();

         } catch (IOException e) {
             e.printStackTrace();

         } catch (IllegalBlockSizeException e) {
             e.printStackTrace();

         } catch (BadPaddingException e) {
             e.printStackTrace();

         }       }

     public synchronized int getCurKeyIndex() {          return curIndex;        }

     public synchronized void getVideoFile(String video_file) {
         videoFile = video_file;             grabber = new

    FFmpegFrameGrabber(video_file) ;

         try {
             grabber.release();
             grabber.restart();

         } catch (FrameGrabber.Exception e) {
             e.printStackTrace();            }       }   }

    public void setVideoFile(String videoFile) this.videoFile =
    videoFile ;

    public void setThreadFile(String video_file)
    fileStreamingThread.getVideoFile(video_file) ;
    videoStreamingThread.getVideoFile(video_file) ;

    private class BroadcastThread extends Thread public void run()
    while (isRunning)
    Thread.yield() ;

             for (int i = 0; i < sHandlers.size(); i++) {
                 if (sHandlers.get(i).getClientState() == ClientState.R) {
                     sHandlers.get(i).setClientState(ClientState.W);
                     BroadcastWorker workerThread = new BroadcastWorker(sHandlers.get(i));
                     workerThread.start();
                 }
             }           }       }   }

    private class BroadcastWorker extends Thread SHandler sHandler =
    null ;

     public BroadcastWorker(SHandler sHandler) {             this.sHandler =

    sHandler ;

     public void run() {             try {
             DatagramSocket out = new DatagramSocket(); // used to send UDP packets

             while (sHandler.getClientState() == ClientState.W) {
                 Thread.yield();

                 StreamFile s = new StreamFile(typeID, currentVideoFrame, currentAudioFrame, mediatype);
                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                 ObjectOutputStream os = new ObjectOutputStream(outputStream);
                 os.writeObject(s);
                 byte[] data = outputStream.toByteArray();
                     // Create and send UDP packet
                 DatagramPacket videoPacket = new DatagramPacket(data, data.length,
                         sHandler.getClientSocket().getInetAddress(),
                         Integer.parseInt(sHandler.getClientPort()));
                     out.send(videoPacket);

             }           } catch (IOException e) {
             e.printStackTrace();            }       }   }

    private class ConnectThread extends Thread public void run()
    TEXT_AREA.append("\nWaiting for clients’ connection.....\n") ;

         try {
             ServerSocket serverSocket = new ServerSocket(PORT);
             Socket clientSocket = null;

             while (isRunning) {
                 clientSocket = serverSocket.accept();

                 if (isRunning) {
                     SHandler sHandler = new SHandler(clientSocket, serverRSA, clientRSA, sessionKeys[keyIndex],
                             TEXT_AREA);
                     sHandler.start();
                     sHandlers.add(sHandler);
                 }
             }
             serverSocket.close();
             if (clientSocket != null) {
                 clientSocket.close();
             }

         } catch (IOException e) {
             e.printStackTrace();            }       }   } }

    my audio and image not sync.

  • Concat two mp4 files with MP4Box error : Bad Parameter [on hold]

    6 février 2014, par user3279646

    I'm trying to concat two mp4 files. But I get an error : Bad Parameter

    Can someone help me with this problem ?

    I'm using de debian packages. On a previously version it worked fine. I moved from a old debian version to the new one and I also had to change the ffmpeg to avconv which I use to create these mp4 files. I also had to change the audio codec to '-acodec aac -strict experimental'

    Kind Regards,
    Marcel

       MP4Box -force-cat -cat conv1-1391608417314.mp4 -add conv1-1391608417345.mp4 -new output.mp4
       IsoMedia import - track ID 1 - Video (size 384 x 288)
       Error importing conv1-1391608417345.mp4: Bad Parameter

       MP4Box -info conv1-1391608417314.mp4
       Movie Info
       Timescale 1000 - Duration 00:00:23.985
       Fragmented File no - 2 track(s)
       File Brand isom - version 512
       Created: UNKNOWN DATE
       File has root IOD (9 bytes)
       Scene PL 0xff - Graphics PL 0xff - OD PL 0xff
       Visual PL: Not part of MPEG-4 Visual profiles (0xfe)
       Audio PL: Not part of MPEG-4 audio profiles (0xfe)
       No streams included in root OD

       iTunes Info:
       Encoder Software: Lavf53.21.1

       Track # 1 Info - TrackID 1 - TimeScale 1000 - Duration 00:00:23.985
       Media Info: Language "Undetermined" - Type "vide:avc1" - 23988 samples
       Visual Track layout: x=0 y=0 width=384 height=288
       MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
       AVC/H264 Video - Visual Size 384 x 288
       AVC Info: 1 SPS - 1 PPS - Profile High @ Level 4.2
       NAL Unit length bits: 32
       Self-synchronized

       Track # 2 Info - TrackID 2 - TimeScale 44100 - Duration 00:00:23.962
       Media Info: Language "Undetermined" - Type "soun:mp4a" - 1032 samples
       MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
       MPEG-4 Audio MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 44100
       Synchronized on stream 1
       Alternate Group ID 1

       MP4Box -version
       MP4Box - GPAC version 0.5.0-rev
       GPAC Copyright: (c) Jean Le Feuvre 2000-2005
       (c) ENST 2005-200X
       GPAC Configuration: --build=x86_64-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --libdir=${prefix}/lib/x86_64-linux-gnu --libexecdir=${prefix}/lib/x86_64-linux-gnu --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --mandir=${prefix}/share/man --libdir=lib/x86_64-linux-gnu --extra-cflags='-Wall -fPIC -DPIC -I/usr/include/mozjs -DXP_UNIX' --enable-joystick --enable-debug --disable-ssl
       Features: GPAC_HAS_JPEG GPAC_HAS_PNG