Recherche avancée

Médias (0)

Mot : - Tags -/performance

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (61)

  • 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 (...)

  • 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

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

Sur d’autres sites (8498)

  • RTP packets detected as UDP

    28 février 2017, par user3172852

    Here is what I am trying to do :

    WebRTC endpoint > RTP Endpoint > ffmpeg > RTMP server.

    This is what my SDP file looks like.

    var cm_offer = "v=0\n" +
                 "o=- 3641290734 3641290734 IN IP4 127.0.0.1\n" +
                 "s=nginx\n" +
                 "c=IN IP4 127.0.0.1\n" +
                 "t=0 0\n" +
                 "m=audio 60820 RTP/AVP 0\n" +
                 "a=rtpmap:0 PCMU/8000\n" +
                 "a=recvonly\n" +
                 "m=video 59618 RTP/AVP 101\n" +
                 "a=rtpmap:101 H264/90000\n" +
                 "a=recvonly\n";

    What’s happening is that wireshark can detect the incoming packets at port 59618, but not as RTP packets but UDP packets. I am trying to capture the packets using ffmpeg with the following command :

    ubuntu@ip-132-31-40-100:~$ ffmpeg -i udp://127.0.0.1:59618 -vcodec copy stream.mp4
    ffmpeg version git-2017-01-22-f1214ad Copyright (c) 2000-2017 the FFmpeg developers
     built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
     configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --mandir=/usr/share/man --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libfreetype --enable-gnutls --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvidstab --enable-libwavpack --enable-nvenc
     libavutil      55. 44.100 / 55. 44.100
     libavcodec     57. 75.100 / 57. 75.100
     libavformat    57. 63.100 / 57. 63.100
     libavdevice    57.  2.100 / 57.  2.100
     libavfilter     6. 69.100 /  6. 69.100
     libavresample   3.  2.  0 /  3.  2.  0
     libswscale      4.  3.101 /  4.  3.101
     libswresample   2.  4.100 /  2.  4.100
     libpostproc    54.  2.100 / 54.  2.100

    All I get is a blinking cursor and The stream.mp4 file is not written to disk after I exit (ctrl+c).

    So can you help me figure out :

    1. why wireshark cannot detect the packets as RTP (I suspect it has something to do with SDP)
    2. How to handle SDP answer when the RTP endpoint is pushing to ffmpeg which doesn’t send an answer back.

    Here is the entire code (hello world tutorial modified)

    /*
        * (C) Copyright 2014-2015 Kurento (http://kurento.org/)
        *
        * Licensed under the Apache License, Version 2.0 (the "License");
        * you may not use this file except in compliance with the License.
        * You may obtain a copy of the License at
        *
        *   http://www.apache.org/licenses/LICENSE-2.0
        *
        * Unless required by applicable law or agreed to in writing, software
        * distributed under the License is distributed on an "AS IS" BASIS,
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        * See the License for the specific language governing permissions and
        * limitations under the License.
        */

       function getopts(args, opts)
       {
         var result = opts.default || {};
         args.replace(
             new RegExp("([^?=&]+)(=([^&]*))?", "g"),
             function($0, $1, $2, $3) { result[$1] = decodeURI($3); });

         return result;
       };

       var args = getopts(location.search,
       {
         default:
         {
           ws_uri: 'wss://' + location.hostname + ':8433/kurento',
           ice_servers: undefined
         }
       });

       function setIceCandidateCallbacks(webRtcPeer, webRtcEp, onerror)
       {
         webRtcPeer.on('icecandidate', function(candidate) {
           console.log("Local candidate:",candidate);

           candidate = kurentoClient.getComplexType('IceCandidate')(candidate);

           webRtcEp.addIceCandidate(candidate, onerror)
         });

         webRtcEp.on('OnIceCandidate', function(event) {
           var candidate = event.candidate;

           console.log("Remote candidate:",candidate);

           webRtcPeer.addIceCandidate(candidate, onerror);
         });
       }


       function setIceCandidateCallbacks2(webRtcPeer, rtpEp, onerror)
       {
         webRtcPeer.on('icecandidate', function(candidate) {
           console.log("Localr candidate:",candidate);

           candidate = kurentoClient.getComplexType('IceCandidate')(candidate);

           rtpEp.addIceCandidate(candidate, onerror)
         });
       }


       window.addEventListener('load', function()
       {
         console = new Console();

         var webRtcPeer;
         var pipeline;
         var webRtcEpt;

         var videoInput = document.getElementById('videoInput');
         var videoOutput = document.getElementById('videoOutput');

         var startButton = document.getElementById("start");
         var stopButton = document.getElementById("stop");

         startButton.addEventListener("click", function()
         {
           showSpinner(videoInput, videoOutput);

           var options = {
             localVideo: videoInput,
             remoteVideo: videoOutput
           };


           if (args.ice_servers) {
            console.log("Use ICE servers: " + args.ice_servers);
            options.configuration = {
              iceServers : JSON.parse(args.ice_servers)
            };
           } else {
            console.log("Use freeice")
           }

           webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error)
           {
             if(error) return onError(error)

             this.generateOffer(onOffer)
           });

           function onOffer(error, sdpOffer)
           {
             if(error) return onError(error)

             kurentoClient(args.ws_uri, function(error, client)
             {
               if(error) return onError(error);

               client.create("MediaPipeline", function(error, _pipeline)
               {
                 if(error) return onError(error);

                 pipeline = _pipeline;

                 pipeline.create("WebRtcEndpoint", function(error, webRtc){
                   if(error) return onError(error);

                   webRtcEpt = webRtc;

                   setIceCandidateCallbacks(webRtcPeer, webRtc, onError)

                   webRtc.processOffer(sdpOffer, function(error, sdpAnswer){
                     if(error) return onError(error);

                     webRtcPeer.processAnswer(sdpAnswer, onError);
                   });
                   webRtc.gatherCandidates(onError);

                   webRtc.connect(webRtc, function(error){
                     if(error) return onError(error);

                     console.log("Loopback established");
                   });
                 });



               pipeline.create("RtpEndpoint", function(error, rtp){
                   if(error) return onError(error);

                   //setIceCandidateCallbacks2(webRtcPeer, rtp, onError)


                   var cm_offer = "v=0\n" +
                         "o=- 3641290734 3641290734 IN IP4 127.0.0.1\n" +
                         "s=nginx\n" +
                         "c=IN IP4 127.0.0.1\n" +
                         "t=0 0\n" +
                         "m=audio 60820 RTP/AVP 0\n" +
                         "a=rtpmap:0 PCMU/8000\n" +
                         "a=recvonly\n" +
                         "m=video 59618 RTP/AVP 101\n" +
                         "a=rtpmap:101 H264/90000\n" +
                         "a=recvonly\n";



                   rtp.processOffer(cm_offer, function(error, cm_sdpAnswer){
                     if(error) return onError(error);

                     //webRtcPeer.processAnswer(cm_sdpAnswer, onError);
                   });
                   //rtp.gatherCandidates(onError);

                   webRtcEpt.connect(rtp, function(error){
                     if(error) return onError(error);

                     console.log("RTP endpoint connected to webRTC");
                   });
                 });









               });
             });
           }
         });
         stopButton.addEventListener("click", stop);


         function stop() {
           if (webRtcPeer) {
             webRtcPeer.dispose();
             webRtcPeer = null;
           }

           if(pipeline){
             pipeline.release();
             pipeline = null;
           }

           hideSpinner(videoInput, videoOutput);
         }

         function onError(error) {
           if(error)
           {
             console.error(error);
             stop();
           }
         }
       })


       function showSpinner() {
         for (var i = 0; i < arguments.length; i++) {
           arguments[i].poster = 'img/transparent-1px.png';
           arguments[i].style.background = "center transparent url('img/spinner.gif') no-repeat";
         }
       }

       function hideSpinner() {
         for (var i = 0; i < arguments.length; i++) {
           arguments[i].src = '';
           arguments[i].poster = 'img/webrtc.png';
           arguments[i].style.background = '';
         }
       }

       /**
        * Lightbox utility (to display media pipeline image in a modal dialog)
        */
       $(document).delegate('*[data-toggle="lightbox"]', 'click', function(event) {
         event.preventDefault();
         $(this).ekkoLightbox();
       });
  • Android plugin with .so lib's (UNITY)

    23 mars 2017, par Vladimir Ilianov

    So i need ffmpeg in android. (for muxing audio and video).
    I found this awesome project for android studio (link in the end of a post, in rar as ffmpeg4android_demo_studio2).
    I works perfect, does muxing and overall awesome project. So i decided to make plugin for anroid from that project, so i remade project like that : (link in the end of a post, in rar as ffmpeg4android_demo_studio ((p.S. the is no GeneralUtils code because its big, please download rar and open it.))

    package com.netcompss.ffmpeg4android;

    public class CommandValidationException extends Exception {
       private static final long serialVersionUID = 1L;
    }

    =============================================

    package com.netcompss.ffmpeg4android;

       import android.content.Context;
       import android.util.Log;
       import android.widget.Toast;    
       public class FFMpeg {
       private Context context;
       private static FFMpeg instance;
       public FFMpeg (){
           this.instance = this;
       }

       public static  FFMpeg instance(){
           if(instance == null){
               instance = new FFMpeg();
           }
           return instance;
       }

       public void setContext(Context context){
           this.context = context;
       }

       public void mux(String video,String audio,String out){
           //GeneralUtils.checkForPermissionsMAndAbove(currentActivity, true);
           LoadJNI vk = new LoadJNI();
           try {
               String workFolder = context.getFilesDir().getAbsolutePath()+ "/";
               String cmd = "ffmpeg -i "+video+" -i "+audio+" -c copy -map 0:v:0 -map 1:a:0 -shortest "+out;
               vk.run(GeneralUtils.utilConvertToComplex(cmd) , workFolder , context);
               Log.i("test", "ffmpeg4android finished successfully");
           } catch (Throwable e) {
               Log.e("test", "vk run exception.", e);
           }
       }

       public void showMessage(String message){
           Toast.makeText(this.context,message,Toast.LENGTH_SHORT).show();
       }

       }

    ==================

    package com.netcompss.ffmpeg4android ;

    import android.app.Activity;
    import android.content.Context;
    import android.widget.TextView;
    import android.os.Bundle;


    public class LicenseCheckJNI
    {

       public int licenseCheck(String path, Context ctx) {
          String rcStr = "-100";
             rcStr = licenseCheckComplexJNI(path);
          int rc =Integer.decode(rcStr);
          return rc;
       }


       public native String licenseCheckComplexJNI(String path);
       public native String licenseCheckSimpleJNI(String path);




       static {
           System.loadLibrary("license-jni");
       }
    }

    package com.netcompss.ffmpeg4android;

    import java.io.File;
    import android.content.Context;
    import android.nfc.Tag;
    import android.util.Log;

    public final class LoadJNI {

      static {
         System.loadLibrary("loader-jni");
         System.loadLibrary("license-jni");
         System.loadLibrary("videokit");

      }

      /**
       *
       * @param args ffmpeg command
       * @param workFolder working directory
       * @param ctx Android context
       * @param isValidate apply validation to the command
       * @throws CommandValidationException
       */
      public void run(String[] args, String workFolder, Context ctx, boolean isValidate) throws CommandValidationException {
         Log.i(Prefs.TAG, "running ffmpeg4android_lib: " + Prefs.version);
         // delete previous log: this is essential for correct progress calculation
         String vkLogPath = workFolder + "vk.log";
         GeneralUtils.deleteFileUtil(vkLogPath);
         GeneralUtils.printCommand(args);

         //printInternalDirStructure(ctx);

         if (isValidate) {
            if (GeneralUtils.isValidCommand(args)) {
               Log.d(Prefs.TAG, "=LOAD================");
               load(args, workFolder, getVideokitLibPath(ctx), true);
            }
            else
               throw new CommandValidationException();
         }
         else {
            Log.d(Prefs.TAG, "=LOAD================");
            load(args, workFolder, getVideokitLibPath(ctx), true);
         }

      }

      /**
       *
       * @param args ffmpeg command
       * @param workFolder working directory
       * @param ctx Android context
       * @throws CommandValidationException
       */
      public void run(String[] args, String workFolder, Context ctx) throws CommandValidationException {
         run(args, workFolder, ctx, true);
      }


      private static void printInternalDirStructure(Context ctx) {
         Log.d(Prefs.TAG, "=printInternalDirStructure=");
         Log.d(Prefs.TAG, "==============================");
         File file = new File(ctx.getFilesDir().getParent());
         analyzeDir(file);
         Log.d(Prefs.TAG, "==============================");
      }

      private static void analyzeDir(File path) {
         if (path.isDirectory()) {
            Log.d(Prefs.TAG,"Scanning dir: " + path.getAbsolutePath());
            File[] files1 = path.listFiles();
            for (int i = 0; i < files1.length; i++) {
               analyzeDir(files1[i]);
            }
            Log.d(Prefs.TAG, "==========");
         }
         else {
            Log.d(Prefs.TAG, path.getAbsolutePath());

         }
      }

      private static String getVideokitLibPath(Context ctx) {

         //File file = new File(ctx.getFilesDir().getParent() + "/lib/");
         //analyzeDir(file);

         String videokitLibPath = ctx.getFilesDir().getParent()  + "/lib/libvideokit.so";

         File file = new File(videokitLibPath);
         if(file.exists())  {    
           Log.i(Prefs.TAG, "videokitLibPath exits");
         }
         else {
            Log.w(Prefs.TAG, "videokitLibPath not exits: " + videokitLibPath);
            videokitLibPath = ctx.getFilesDir().getParent()  + "/lib/arm64/libvideokit.so";
            Log.i(Prefs.TAG, "trying videokitLibPath: " + videokitLibPath);
            file = new File(videokitLibPath);
            if(file.exists())  {
               Log.i(Prefs.TAG, "videokitLibPath exits: " + videokitLibPath);
            }
            else {
               Log.w(Prefs.TAG, "videokitLibPath not exits: " + videokitLibPath);
               videokitLibPath = "/data/app/com.examples.ffmpeg4android_demo-1/lib/arm64/libvideokit.so";
               Log.i(Prefs.TAG, "trying videokitLibPath: " + videokitLibPath);
               file = new File(videokitLibPath);
               if(file.exists())  {
                  Log.i(Prefs.TAG, "videokitLibPath exits: " + videokitLibPath);
               }
               else {
                  Log.w(Prefs.TAG, "videokitLibPath not exits: " + videokitLibPath);
                  videokitLibPath = "/data/app/com.examples.ffmpeg4android_demo-2/lib/arm64/libvideokit.so";
                  Log.i(Prefs.TAG, "trying videokitLibPath: " + videokitLibPath);
                  if(file.exists())  {
                     Log.i(Prefs.TAG, "videokitLibPath exits: " + videokitLibPath);
                  }
                  else {
                     Log.e(Prefs.TAG, "can't find path of lib");
                  }
               }
            }
         }





         //String videokitLibPath = ctx.getFilesDir().getParent()  + "/lib/arm64/libvideokit.so";

         // only this works on Android M, and the number changes (demo-2, demo-1)
         //String videokitLibPath = "/data/app/com.examples.ffmpeg4android_demo-1/lib/arm64/libvideokit.so";


         //Log.i(Prefs.TAG, "videokitLibPath: " + videokitLibPath);
         return videokitLibPath;

      }



      public void fExit( Context ctx) {
         fexit(getVideokitLibPath(ctx));
      }

      public native String fexit(String videokitLibPath);
      public native String unload();
      public native String load(String[] args, String videokitSdcardPath, String videokitLibPath, boolean isComplex);
    }

    ============================

    package com.netcompss.ffmpeg4android;

    public class Prefs {
      public static final String TAG = "ffmpeg4android";
      public static final String version = "322.00.00_LM322";
    }
    [/code]
    [code=JavaScript]
    package com.netcompss.ffmpeg4android;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;

    import android.util.Log;

    public class ProgressCalculator {

      private int _durationOfCurrentWaitIndex = 0;
      private final int DURATION_OF_CURRENT_WAIT_INDEX_LIMIT = 12;
      private String _durationOfCurrent;
      private long _lastVklogSize = -1;
      private int _vkLogNoChangeCounter = 0;
      private SimpleDateFormat _simpleDateFormat;
      long _timeRef = -1;
      int  _prevProgress = 0;
      private String vkLogPath = null;

      public ProgressCalculator(String vkLogPathIn) {
         vkLogPath = vkLogPathIn;
         _simpleDateFormat = new SimpleDateFormat("HH:mm:ss.SS");
         try {
            Date ref = _simpleDateFormat.parse("00:00:00.00");
            ref.setYear(112);
            _timeRef = ref.getTime();
         } catch (ParseException e) {
            Log.w(Prefs.TAG, "failed to set _timeRef");
         }
      }

      public void initCalcParamsForNextInter() {
         Log.i(Prefs.TAG, "initCalcParamsForNextInter");
         _lastVklogSize = -1;
         _vkLogNoChangeCounter = 0;
         _durationOfCurrent = null;

      }

      public int calcProgress() {
         return calcProgress(1);
      }


      public int calcProgress(int durationMultiplyer) {
         //Log.i(Prefs.TAG, "========calc progress======= " + durationMultiplyer);
         int progress  = 0;
         if (_durationOfCurrent == null) {
            String dur = GeneralUtils.getDutationFromVCLogRandomAccess(vkLogPath);
            Log.d(Prefs.TAG, "dur: " + dur);
            if (dur == null || dur.equals("") || dur.equals("null") ) {
               Log.i(Prefs.TAG, "dur is not good, not setting ");
               if (_durationOfCurrentWaitIndex < DURATION_OF_CURRENT_WAIT_INDEX_LIMIT) {
                  Log.i(Prefs.TAG, "waiting for real duration, going out of calcProgress with 0");
                  _durationOfCurrentWaitIndex ++;
                  return 0;
               }
               else {
                  Log.i(Prefs.TAG, "_durationOfCurrentWaitIndex is equal to: " + DURATION_OF_CURRENT_WAIT_INDEX_LIMIT + " reseting.");
                  _durationOfCurrentWaitIndex = 0;
                  Log.i(Prefs.TAG, "setting fake Prefs.durationOfCurrent");

                  _durationOfCurrent = "00:03:00.00";
                  Log.w(Prefs.TAG, "setting fake Prefs.durationOfCurrent (Cant get from file): " + _durationOfCurrent);

               }
            }
            else {
               _durationOfCurrent = GeneralUtils.getDutationFromVCLogRandomAccess(vkLogPath);
               Log.i(Prefs.TAG, "duration: " + _durationOfCurrent + " \nTranscoding...");
            }
         }


         if (_durationOfCurrent != null) {

            long currentVkLogSize = -1;
            currentVkLogSize = GeneralUtils.getVKLogSizeRandomAccess(vkLogPath);
            //Log.d(Prefs.TAG, "currentVkLogSize: " + currentVkLogSize + " _lastVklogSize: " + _lastVklogSize);

            if (currentVkLogSize > _lastVklogSize) {
               _lastVklogSize = currentVkLogSize;
               _vkLogNoChangeCounter = 0;
            }
            else {
               //Log.w(Prefs.TAG, "Looks like Vk log is not increasing in size");
               _vkLogNoChangeCounter++;
            }


            String currentTimeStr = GeneralUtils.readLastTimeFromVKLogUsingRandomAccess(vkLogPath);
            //Log.d(Prefs.TAG, "currentTimeStr: " + currentTimeStr);
            if (currentTimeStr.equals("exit")) {
               Log.d(Prefs.TAG, "============Found one of the exit tokens in the log============");
               return 100;
            }
            else if (currentTimeStr.equals("error") && _prevProgress == 0) {
               Log.d(Prefs.TAG, "============Found error in the log============");
               return 100;
            }
            else if (_vkLogNoChangeCounter > 16) {
               Log.e(Prefs.TAG, "VK log is not changing in size, and no exit token found");
               return 100;
            }
            try {
               Date durationDate = _simpleDateFormat.parse(_durationOfCurrent);
               Date currentTimeDate = _simpleDateFormat.parse(currentTimeStr);
               currentTimeDate.setYear(112);
               durationDate.setYear(112);
               //Log.d(Prefs.TAG, " durationDate: " + durationDate + " currentTimeDate: " + currentTimeDate);

               long durationLong = durationDate.getTime() - _timeRef;
               if (durationMultiplyer != 1) {
                  //Log.i(Prefs.TAG, "====durationMultiplyer is not 1, handling===");
                  //Log.i(Prefs.TAG, "durationLong before: " + durationLong);
                  durationLong = durationLong * durationMultiplyer;
                  //Log.i(Prefs.TAG, "durationLong after: " + durationLong);
               }
               long currentTimeLong = currentTimeDate.getTime() - _timeRef;
               //Log.d(Prefs.TAG, " durationLong: " + durationLong + " currentTimeLong: " + currentTimeLong + " diff: " + (durationLong - currentTimeLong));
               progress  = Math.round(((float)currentTimeLong / durationLong) * 100);
               if (progress >= 100) {
                  Log.w(Prefs.TAG, "progress is 100, but can't find exit in the log, probably fake progress, still running...");
                  progress = 99;
               }
               _prevProgress = progress;


            } catch (ParseException e) {
               Log.w(Prefs.TAG, e.getMessage());
            }
         }

         return progress;
      }


    }

    ==================================

    Then clicked build and copied ffmpeg4android_lib.aar in unity project under assets/Plugins/Android/libs/
    then made this wrap up

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using System.IO;


    public class Test : MonoBehaviour {

       private AndroidJavaObject FFMpeg = null;
       private AndroidJavaObject activityContext = null;

       public string Path1;
       public string Path2;
       public string Out3;

       public string path;

       public Text File1;
       public Text File2;
       public Text Context;
       public Text End;

       public void Convert(){
           File1.text = File.Exists (path+Path1).ToString();
           File2.text = File.Exists (path+Path2).ToString();
           if (FFMpeg == null) {
               using(AndroidJavaClass activityclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){
                   activityContext = activityclass.GetStatic<androidjavaobject> ("currentActivity");
               }
               Context.text = "Context =" + activityContext;
           }
           using (AndroidJavaClass pluginClass = new AndroidJavaClass ("com.netcompss.ffmpeg4android.FFMpeg")) {
               if (pluginClass != null) {
                   FFMpeg = pluginClass.CallStatic<androidjavaobject> ("instance");
                   FFMpeg.Call ("setContext", activityContext);
                   //activityContext.Call ("runOnUiThread", new AndroidJavaRunnable (() => {
                   FFMpeg.Call ("mux", path+Path1,path+Path2,path+Out3);
                   //}));
               }
           }
           End.text = "Done";

       }
    }
    </androidjavaobject></androidjavaobject>

    =============================================

    And the problem is :
    When i launch apk made from original project in AndroidStudio everything works fine.
    When i launch apk made in unity its works fine until this part :
    load(args, workFolder, getVideokitLibPath(ctx), true) ;

    IT does load all lib ok.
    Its throw this error in logcat when trying to do that code

    03-23 10:43:17.293 28263-28277/? W/dalvikvm: No implementation found for native Lcom/netcompss/ffmpeg4android/LoadJNI;.load:([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;
    03-23 10:43:17.294 28263-28277/? E/test: vk run exception.
                                            java.lang.UnsatisfiedLinkError: Native method not found: com.netcompss.ffmpeg4android.LoadJNI.load:([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;
                                                at com.netcompss.ffmpeg4android.LoadJNI.load(Native Method)
                                                at com.netcompss.ffmpeg4android.LoadJNI.run(LoadJNI.java:37)
                                                at com.netcompss.ffmpeg4android.LoadJNI.run(LoadJNI.java:57)
                                                at com.netcompss.ffmpeg4android.FFMpeg.mux(FFMpeg.java:36)
                                                at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
                                                at com.unity3d.player.UnityPlayer.a(Unknown Source)
                                                at com.unity3d.player.UnityPlayer$b$1.handleMessage(Unknown Source)
                                                at android.os.Handler.dispatchMessage(Handler.java:103)
                                                at android.os.Looper.loop(Looper.java:194)
                                                at com.unity3d.player.UnityPlayer$b.run(Unknown Source)

    Projects Dropbox link :
    https://www.dropbox.com/s/6vglcw7xk2n8lwu/AndroidStudioProjects.rar?dl=0

  • Merge commit ’2dd464868c64fa21a6e3bd63ad364ff12999c7d0’

    31 mars 2017, par James Almer
    Merge commit ’2dd464868c64fa21a6e3bd63ad364ff12999c7d0’
    

    * commit ’2dd464868c64fa21a6e3bd63ad364ff12999c7d0’ :
    configure : Move license checks directly after command line parsing

    Merged-by : James Almer <jamrial@gmail.com>

    • [DH] configure