Recherche avancée

Médias (1)

Mot : - Tags -/MediaSPIP

Autres articles (34)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • Les formats acceptés

    28 janvier 2010, par

    Les commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
    ffmpeg -codecs ffmpeg -formats
    Les format videos acceptés en entrée
    Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
    Les formats vidéos de sortie possibles
    Dans un premier temps on (...)

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

Sur d’autres sites (3719)

  • av_read_frame function in ffmpeg in android always returning packet.stream_index as 0

    31 juillet 2013, par droidmad

    I am using the following standard code pasted below (ref : http://dranger.com/ffmpeg/) to use ffmpeg in android using ndk. My code is working fine in ubuntu 10.04 using gcc compiler. But I am facing an issue in android.The issue is av_read_frame(pFormatCtx, &packet) is always returning packet.stream_index=0. I have tested my code with various rtsp urls and I have the same behaviour in all cases. I do not have any linking or compiling issues as everything seems to be working fine except this issue. I am trying to solve this from last 2 days but I am stuck badly.Please point me in right direction.

    #include
    #include <android></android>log.h>

    #include <libavcodec></libavcodec>avcodec.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>

    #include
    #define DEBUG_TAG "mydebug_ndk"

    jint Java_com_example_tut2_MainActivity_myfunc(JNIEnv * env, jobject this,jstring myjurl) {
     AVFormatContext *pFormatCtx = NULL;
     int             i, videoStream;
     AVCodecContext  *pCodecCtx = NULL;
     AVCodec         *pCodec = NULL;
     AVFrame         *pFrame = NULL;
     AVPacket        packet;
     int             frameFinished;

     AVDictionary    *optionsDict = NULL;
     struct SwsContext *sws_ctx = NULL;

     jboolean isCopy;
     const char * mycurl = (*env)->GetStringUTFChars(env, myjurl, &amp;isCopy);
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:p2: [%s]", mycurl);

     // Register all formats and codecs
     av_register_all();
     avformat_network_init();
     // Open video file
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:before_open");

     if(avformat_open_input(&amp;pFormatCtx, mycurl, NULL, NULL)!=0)
         return -1;
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "start: %d\t%d\n",pFormatCtx->raw_packet_buffer_remaining_size,pFormatCtx->max_index_size);

     (*env)->ReleaseStringUTFChars(env, myjurl, mycurl);
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:before_stream");
     // Retrieve stream information
     if(avformat_find_stream_info(pFormatCtx, NULL)&lt;0)
         return -1;
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:after_stream");
     // Find the first video stream
     videoStream=-1;
     for(i=0; inb_streams; i++)
         if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
           videoStream=i;
           break;
         }
     if(videoStream==-1)
         return -1; // Didn&#39;t find a video stream
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:after_videostream");
     // Get a pointer to the codec context for the video stream
     pCodecCtx=pFormatCtx->streams[videoStream]->codec;
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:after_codec_context");

     // Find the decoder for the video stream
     pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:after_decoder");

     if(pCodec==NULL)
         return -1;
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:found_decoder");

     // Open codec
     if(avcodec_open2(pCodecCtx, pCodec, &amp;optionsDict)&lt;0)
         return -1;
     // Allocate video frame
     pFrame=avcodec_alloc_frame();
     sws_ctx = sws_getContext(pCodecCtx->width,pCodecCtx->height,pCodecCtx->pix_fmt,pCodecCtx->width,
           pCodecCtx->height,PIX_FMT_YUV420P,SWS_BILINEAR,NULL,NULL,NULL);
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:before_while");

     int count=0;
     while(av_read_frame(pFormatCtx, &amp;packet)>=0) {
           __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "entered while: %d   %d   %d\n", packet.duration,packet.stream_index,packet.size);

         if(packet.stream_index==videoStream) {
             // Decode video frame
             //break;
             avcodec_decode_video2(pCodecCtx, pFrame, &amp;frameFinished,&amp;packet);
             __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:in_while");
             if(frameFinished) {
                 __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:gng_out_of_while");
                   break;
             }
         }

         // Free the packet that was allocated by av_read_frame
         av_free_packet(&amp;packet);
         if(++count>1000)
            return -2; //infinite while loop
     }
     __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:after_while");

     // Free the YUV frame
     av_free(pFrame);
     // Close the codec
     avcodec_close(pCodecCtx);
     // Close the video file
     avformat_close_input(&amp;pFormatCtx);

     return 0;

    }
  • ffmpeg audio synch issue - fractional framerate

    29 mars 2013, par JoeCitizen

    We are working on an Android app which uses the ffmpeg library via JNI to edit the frames of a video while keeping size, codec etc the same.

    We are having an issue where the audio of the output video is getting out of sync with the video. We believe this is because some input videos have a frame rate which isn't a whole number e.g 25.66 fps and our output will be at 25fps. We have tried to change the time_base field of the output codec to keep the precision i.e by multiply the numerator and denominator but it makes the output frame rate ridiculously high.

    Does anyone know how to force ffmpeg to use the exact same output frame rate as the one it reads in ? We have not found a way to output videos with a fractional frame rate.

    Example of setting up the output codec :

       c =                 st->codec;
       c->codec_id =       codec_id;
       c->codec_type =     AVMEDIA_TYPE_VIDEO;
       c->bit_rate =       inputCodecCtx->bit_rate;
       c->width =          inputCodecCtx->width;
       c->height =         inputCodecCtx->height;

       c->time_base.num =   1000;
       c->time_base.den =  (int)(fps*1000);//fps of the input video *1000 to keep precision

       c->gop_size =       inputCodecCtx->gop_size;
       c->pix_fmt =        inputCodecCtx->pix_fmt;



       static int write_video_frame(AVFormatContext *oc, AVStream *st, AVFrame *newpict, double fps)
       {
           int             ret = 0;
           AVCodecContext* c = st->codec;

           AVPacket pkt;
           av_init_packet(&amp;pkt);

           if (pkt.pts != AV_NOPTS_VALUE)
           {
               pkt.pts =  av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);

           }
           if (pkt.dts != AV_NOPTS_VALUE)


           {
               pkt.dts = av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
           }

    .....
    }
  • Encoding Exception during Transcode with audio files

    6 mai 2016, par Hakop Zakaryan

    I am attempting to transcode using an FFMPEG Wrapper Library called JAVE on Mac OSX 10.11.3 using Eclipse 4.50

    My Converter.java class looks something like this :

    package matador;

    import it.sauronsoftware.jave.AudioAttributes;
    import it.sauronsoftware.jave.EncodingAttributes;
    import it.sauronsoftware.jave.EncoderException;
    import it.sauronsoftware.jave.InputFormatException;
    import it.sauronsoftware.jave.Encoder;
    import java.io.*;

    public class Converter {

    public static void main(String[] args) throws InputFormatException, EncoderException {

       File source = new File("Classic.m4a");
       File target = new File("target.mp3");

       AudioAttributes audio = new AudioAttributes();
       audio.setCodec("libmp3lame");
       audio.setBitRate(new Integer(128000));
       audio.setChannels(new Integer(2));
       audio.setSamplingRate(new Integer(44100));

       EncodingAttributes attrs = new EncodingAttributes();
       attrs.setFormat("mp3");
       attrs.setAudioAttributes(audio);

       Encoder encoder = new Encoder(new MyFFMPEGExecutableLocator());
       try {
       encoder.encode(source, target, attrs, null);
       } catch (IllegalArgumentException e) {

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

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

           e.printStackTrace();
       }

    }

    }

    The problem I am running into is that with specific audio files (regardless of format) give me this EncoderException :

    it.sauronsoftware.jave.EncoderException:   Metadata:
    at it.sauronsoftware.jave.Encoder.encode(Encoder.java:863)
    at matador.Converter.main(Converter.java:32)

    I have looked through Encoder.java and the EncoderException on line 863 is this specific code :

    } else if (!line.startsWith("Output #0")) {
    throw new EncoderException(line);

    I have been unable to figure out why this may be occurring but specific audio files (WAV/AAC/etc) do encode yet a majority just give this exception.

    Thank you for the help !

    Edit : As per request for possibly being able to help me further, here is the entirety of the Encoder.java code :

    package it.sauronsoftware.jave;

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Hashtable;
    import java.util.StringTokenizer;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class Encoder {

    private static final Pattern FORMAT_PATTERN = Pattern
           .compile("^\\s*([D ])([E ])\\s+([\\w,]+)\\s+.+$");

    private static final Pattern ENCODER_DECODER_PATTERN = Pattern.compile(
           "^\\s*([D ])([E ])([AVS]).{3}\\s+(.+)$", Pattern.CASE_INSENSITIVE);

    private static final Pattern PROGRESS_INFO_PATTERN = Pattern.compile(
           "\\s*(\\w+)\\s*=\\s*(\\S+)\\s*", Pattern.CASE_INSENSITIVE);

    private static final Pattern SIZE_PATTERN = Pattern.compile(
           "(\\d+)x(\\d+)", Pattern.CASE_INSENSITIVE);

    private static final Pattern FRAME_RATE_PATTERN = Pattern.compile(
           "([\\d.]+)\\s+(?:fps|tb\\(r\\))", Pattern.CASE_INSENSITIVE);

    private static final Pattern BIT_RATE_PATTERN = Pattern.compile(
           "(\\d+)\\s+kb/s", Pattern.CASE_INSENSITIVE);

    private static final Pattern SAMPLING_RATE_PATTERN = Pattern.compile(
           "(\\d+)\\s+Hz", Pattern.CASE_INSENSITIVE);

    private static final Pattern CHANNELS_PATTERN = Pattern.compile(
           "(mono|stereo)", Pattern.CASE_INSENSITIVE);

    private static final Pattern SUCCESS_PATTERN = Pattern.compile(
           "^\\s*video\\:\\S+\\s+audio\\:\\S+\\s+global headers\\:\\S+.*$",
           Pattern.CASE_INSENSITIVE);

    private FFMPEGLocator locator;

    public Encoder() {
       this.locator = new DefaultFFMPEGLocator();
    }

    public Encoder(FFMPEGLocator locator) {
       this.locator = locator;
    }

    public String[] getAudioDecoders() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String decoderFlag = matcher.group(1);
                       String audioVideoFlag = matcher.group(3);
                       if ("D".equals(decoderFlag)
                               &amp;&amp; "A".equals(audioVideoFlag)) {
                           String name = matcher.group(4);
                           res.add(name);
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("Codecs:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public String[] getAudioEncoders() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String encoderFlag = matcher.group(2);
                       String audioVideoFlag = matcher.group(3);
                       if ("E".equals(encoderFlag)
                               &amp;&amp; "A".equals(audioVideoFlag)) {
                           String name = matcher.group(4);
                           res.add(name);
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("Codecs:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public String[] getVideoDecoders() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String decoderFlag = matcher.group(1);
                       String audioVideoFlag = matcher.group(3);
                       if ("D".equals(decoderFlag)
                               &amp;&amp; "V".equals(audioVideoFlag)) {
                           String name = matcher.group(4);
                           res.add(name);
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("Codecs:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public String[] getVideoEncoders() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = ENCODER_DECODER_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String encoderFlag = matcher.group(2);
                       String audioVideoFlag = matcher.group(3);
                       if ("E".equals(encoderFlag)
                               &amp;&amp; "V".equals(audioVideoFlag)) {
                           String name = matcher.group(4);
                           res.add(name);
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("Codecs:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public String[] getSupportedEncodingFormats() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = FORMAT_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String encoderFlag = matcher.group(2);
                       if ("E".equals(encoderFlag)) {
                           String aux = matcher.group(3);
                           StringTokenizer st = new StringTokenizer(aux, ",");
                           while (st.hasMoreTokens()) {
                               String token = st.nextToken().trim();
                               if (!res.contains(token)) {
                                   res.add(token);
                               }
                           }
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("File formats:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public String[] getSupportedDecodingFormats() throws EncoderException {
       ArrayList res = new ArrayList();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-formats");
       try {
           ffmpeg.execute();
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getInputStream()));
           String line;
           boolean evaluate = false;
           while ((line = reader.readLine()) != null) {
               if (line.trim().length() == 0) {
                   continue;
               }
               if (evaluate) {
                   Matcher matcher = FORMAT_PATTERN.matcher(line);
                   if (matcher.matches()) {
                       String decoderFlag = matcher.group(1);
                       if ("D".equals(decoderFlag)) {
                           String aux = matcher.group(3);
                           StringTokenizer st = new StringTokenizer(aux, ",");
                           while (st.hasMoreTokens()) {
                               String token = st.nextToken().trim();
                               if (!res.contains(token)) {
                                   res.add(token);
                               }
                           }
                       }
                   } else {
                       break;
                   }
               } else if (line.trim().equals("File formats:")) {
                   evaluate = true;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
       int size = res.size();
       String[] ret = new String[size];
       for (int i = 0; i &lt; size; i++) {
           ret[i] = (String) res.get(i);
       }
       return ret;
    }

    public MultimediaInfo getInfo(File source) throws InputFormatException,
           EncoderException {
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       ffmpeg.addArgument("-i");
       ffmpeg.addArgument(source.getAbsolutePath());
       try {
           ffmpeg.execute();
       } catch (IOException e) {
           throw new EncoderException(e);
       }
       try {
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getErrorStream()));
           return parseMultimediaInfo(source, reader);
       } finally {
           ffmpeg.destroy();
       }
    }

    private MultimediaInfo parseMultimediaInfo(File source,
           RBufferedReader reader) throws InputFormatException,
           EncoderException {
       Pattern p1 = Pattern.compile("^\\s*Input #0, (\\w+).+$\\s*",
               Pattern.CASE_INSENSITIVE);
       Pattern p2 = Pattern.compile(
               "^\\s*Duration: (\\d\\d):(\\d\\d):(\\d\\d)\\.(\\d).*$",
               Pattern.CASE_INSENSITIVE);
       Pattern p3 = Pattern.compile(
               "^\\s*Stream #\\S+: ((?:Audio)|(?:Video)|(?:Data)): (.*)\\s*$",
               Pattern.CASE_INSENSITIVE);
       MultimediaInfo info = null;
       try {
           int step = 0;
           while (true) {
               String line = reader.readLine();
               if (line == null) {
                   break;
               }
               if (step == 0) {
                   String token = source.getAbsolutePath() + ": ";
                   if (line.startsWith(token)) {
                       String message = line.substring(token.length());
                       throw new InputFormatException(message);
                   }
                   Matcher m = p1.matcher(line);
                   if (m.matches()) {
                       String format = m.group(1);
                       info = new MultimediaInfo();
                       info.setFormat(format);
                       step++;
                   }
               } else if (step == 1) {
                   Matcher m = p2.matcher(line);
                   if (m.matches()) {
                       long hours = Integer.parseInt(m.group(1));
                       long minutes = Integer.parseInt(m.group(2));
                       long seconds = Integer.parseInt(m.group(3));
                       long dec = Integer.parseInt(m.group(4));
                       long duration = (dec * 100L) + (seconds * 1000L)
                               + (minutes * 60L * 1000L)
                               + (hours * 60L * 60L * 1000L);
                       info.setDuration(duration);
                       step++;
                   } else {
                       step = 3;
                   }
               } else if (step == 2) {
                   Matcher m = p3.matcher(line);
                   if (m.matches()) {
                       String type = m.group(1);
                       String specs = m.group(2);
                       if ("Video".equalsIgnoreCase(type)) {
                           VideoInfo video = new VideoInfo();
                           StringTokenizer st = new StringTokenizer(specs, ",");
                           for (int i = 0; st.hasMoreTokens(); i++) {
                               String token = st.nextToken().trim();
                               if (i == 0) {
                                   video.setDecoder(token);
                               } else {
                                   boolean parsed = false;
                                   // Video size.
                                   Matcher m2 = SIZE_PATTERN.matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       int width = Integer.parseInt(m2
                                               .group(1));
                                       int height = Integer.parseInt(m2
                                               .group(2));
                                       video.setSize(new VideoSize(width,
                                               height));
                                       parsed = true;
                                   }
                                   // Frame rate.
                                   m2 = FRAME_RATE_PATTERN.matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       try {
                                           float frameRate = Float
                                                   .parseFloat(m2.group(1));
                                           video.setFrameRate(frameRate);
                                       } catch (NumberFormatException e) {
                                           ;
                                       }
                                       parsed = true;
                                   }
                                   // Bit rate.
                                   m2 = BIT_RATE_PATTERN.matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       int bitRate = Integer.parseInt(m2
                                               .group(1));
                                       video.setBitRate(bitRate);
                                       parsed = true;
                                   }
                               }
                           }
                           info.setVideo(video);
                       } else if ("Audio".equalsIgnoreCase(type)) {
                           AudioInfo audio = new AudioInfo();
                           StringTokenizer st = new StringTokenizer(specs, ",");
                           for (int i = 0; st.hasMoreTokens(); i++) {
                               String token = st.nextToken().trim();
                               if (i == 0) {
                                   audio.setDecoder(token);
                               } else {
                                   boolean parsed = false;
                                   // Sampling rate.
                                   Matcher m2 = SAMPLING_RATE_PATTERN
                                           .matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       int samplingRate = Integer.parseInt(m2
                                               .group(1));
                                       audio.setSamplingRate(samplingRate);
                                       parsed = true;
                                   }
                                   // Channels.
                                   m2 = CHANNELS_PATTERN.matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       String ms = m2.group(1);
                                       if ("mono".equalsIgnoreCase(ms)) {
                                           audio.setChannels(1);
                                       } else if ("stereo"
                                               .equalsIgnoreCase(ms)) {
                                           audio.setChannels(2);
                                       }
                                       parsed = true;
                                   }
                                   // Bit rate.
                                   m2 = BIT_RATE_PATTERN.matcher(token);
                                   if (!parsed &amp;&amp; m2.find()) {
                                       int bitRate = Integer.parseInt(m2
                                               .group(1));
                                       audio.setBitRate(bitRate);
                                       parsed = true;
                                   }
                               }
                           }
                           info.setAudio(audio);
                       }
                   } else {
                       step = 3;
                   }
               }
               if (step == 3) {
                   reader.reinsertLine(line);
                   break;
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       }
       if (info == null) {
           throw new InputFormatException();
       }
       return info;
    }

    private Hashtable parseProgressInfoLine(String line) {
       Hashtable table = null;
       Matcher m = PROGRESS_INFO_PATTERN.matcher(line);
       while (m.find()) {
           if (table == null) {
               table = new Hashtable();
           }
           String key = m.group(1);
           String value = m.group(2);
           table.put(key, value);
       }
       return table;
    }

    public void encode(File source, File target, EncodingAttributes attributes)
           throws IllegalArgumentException, InputFormatException,
           EncoderException {
       encode(source, target, attributes, null);
    }

    public void encode(File source, File target, EncodingAttributes attributes,
           EncoderProgressListener listener) throws IllegalArgumentException,
           InputFormatException, EncoderException {
       String formatAttribute = attributes.getFormat();
       Float offsetAttribute = attributes.getOffset();
       Float durationAttribute = attributes.getDuration();
       AudioAttributes audioAttributes = attributes.getAudioAttributes();
       VideoAttributes videoAttributes = attributes.getVideoAttributes();
       if (audioAttributes == null &amp;&amp; videoAttributes == null) {
           throw new IllegalArgumentException(
                   "Both audio and video attributes are null");
       }
       target = target.getAbsoluteFile();
       target.getParentFile().mkdirs();
       FFMPEGExecutor ffmpeg = locator.createExecutor();
       if (offsetAttribute != null) {
           ffmpeg.addArgument("-ss");
           ffmpeg.addArgument(String.valueOf(offsetAttribute.floatValue()));
       }
       ffmpeg.addArgument("-i");
       ffmpeg.addArgument(source.getAbsolutePath());
       if (durationAttribute != null) {
           ffmpeg.addArgument("-t");
           ffmpeg.addArgument(String.valueOf(durationAttribute.floatValue()));
       }
       if (videoAttributes == null) {
           ffmpeg.addArgument("-vn");
       } else {
           String codec = videoAttributes.getCodec();
           if (codec != null) {
               ffmpeg.addArgument("-vcodec");
               ffmpeg.addArgument(codec);
           }
           String tag = videoAttributes.getTag();
           if (tag != null) {
               ffmpeg.addArgument("-vtag");
               ffmpeg.addArgument(tag);
           }
           Integer bitRate = videoAttributes.getBitRate();
           if (bitRate != null) {
               ffmpeg.addArgument("-b");
               ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
           }
           Integer frameRate = videoAttributes.getFrameRate();
           if (frameRate != null) {
               ffmpeg.addArgument("-r");
               ffmpeg.addArgument(String.valueOf(frameRate.intValue()));
           }
           VideoSize size = videoAttributes.getSize();
           if (size != null) {
               ffmpeg.addArgument("-s");
               ffmpeg.addArgument(String.valueOf(size.getWidth()) + "x"
                       + String.valueOf(size.getHeight()));
           }
       }
       if (audioAttributes == null) {
           ffmpeg.addArgument("-an");
       } else {
           String codec = audioAttributes.getCodec();
           if (codec != null) {
               ffmpeg.addArgument("-acodec");
               ffmpeg.addArgument(codec);
           }
           Integer bitRate = audioAttributes.getBitRate();
           if (bitRate != null) {
               ffmpeg.addArgument("-ab");
               ffmpeg.addArgument(String.valueOf(bitRate.intValue()));
           }
           Integer channels = audioAttributes.getChannels();
           if (channels != null) {
               ffmpeg.addArgument("-ac");
               ffmpeg.addArgument(String.valueOf(channels.intValue()));
           }
           Integer samplingRate = audioAttributes.getSamplingRate();
           if (samplingRate != null) {
               ffmpeg.addArgument("-ar");
               ffmpeg.addArgument(String.valueOf(samplingRate.intValue()));
           }
           Integer volume = audioAttributes.getVolume();
           if (volume != null) {
               ffmpeg.addArgument("-vol");
               ffmpeg.addArgument(String.valueOf(volume.intValue()));
           }
       }
       ffmpeg.addArgument("-f");
       ffmpeg.addArgument(formatAttribute);
       ffmpeg.addArgument("-y");
       ffmpeg.addArgument(target.getAbsolutePath());
       try {
           ffmpeg.execute();
       } catch (IOException e) {
           throw new EncoderException(e);
       }
       try {
           String lastWarning = null;
           long duration;
           long progress = 0;
           RBufferedReader reader = null;
           reader = new RBufferedReader(new InputStreamReader(ffmpeg
                   .getErrorStream()));
           MultimediaInfo info = parseMultimediaInfo(source, reader);
           if (durationAttribute != null) {
               duration = (long) Math
                       .round((durationAttribute.floatValue() * 1000L));
           } else {
               duration = info.getDuration();
               if (offsetAttribute != null) {
                   duration -= (long) Math
                           .round((offsetAttribute.floatValue() * 1000L));
               }
           }
           if (listener != null) {
               listener.sourceInfo(info);
           }
           int step = 0;
           String line;
           while ((line = reader.readLine()) != null) {
               if (step == 0) {
                   if (line.startsWith("WARNING: ")) {
                       if (listener != null) {
                           listener.message(line);
                       }
                   } else if (!line.startsWith("Output #0")) {
                       throw new EncoderException(line);
                   } else {
                       step++;
                   }
               } else if (step == 1) {
                   if (!line.startsWith("  ")) {
                       step++;
                   }
               }
               if (step == 2) {
                   if (!line.startsWith("Stream mapping:")) {
                       throw new EncoderException(line);
                   } else {
                       step++;
                   }
               } else if (step == 3) {
                   if (!line.startsWith("  ")) {
                       step++;
                   }
               }
               if (step == 4) {
                   line = line.trim();
                   if (line.length() > 0) {
                       Hashtable table = parseProgressInfoLine(line);
                       if (table == null) {
                           if (listener != null) {
                               listener.message(line);
                           }
                           lastWarning = line;
                       } else {
                           if (listener != null) {
                               String time = (String) table.get("time");
                               if (time != null) {
                                   int dot = time.indexOf('.');
                                   if (dot > 0 &amp;&amp; dot == time.length() - 2
                                           &amp;&amp; duration > 0) {
                                       String p1 = time.substring(0, dot);
                                       String p2 = time.substring(dot + 1);
                                       try {
                                           long i1 = Long.parseLong(p1);
                                           long i2 = Long.parseLong(p2);
                                           progress = (i1 * 1000L)
                                                   + (i2 * 100L);
                                           int perm = (int) Math
                                                   .round((double) (progress * 1000L)
                                                           / (double) duration);
                                           if (perm > 1000) {
                                               perm = 1000;kMDItemAudioEncodingApplication = "Lavf57.26.100"
                                           }
                                           listener.progress(perm);
                                       } catch (NumberFormatException e) {
                                           ;
                                       }
                                   }
                               }
                           }
                           lastWarning = null;
                       }
                   }
               }
           }
           if (lastWarning != null) {
               if (!SUCCESS_PATTERN.matcher(lastWarning).matches()) {
                   throw new EncoderException(lastWarning);
               }
           }
       } catch (IOException e) {
           throw new EncoderException(e);
       } finally {
           ffmpeg.destroy();
       }
    }

    }