Recherche avancée

Médias (91)

Autres articles (107)

  • Multilang : améliorer l’interface pour les blocs multilingues

    18 février 2011, par

    Multilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
    Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela.

  • MediaSPIP v0.2

    21 juin 2013, par

    MediaSPIP 0.2 est la première version de MediaSPIP stable.
    Sa date de sortie officielle est le 21 juin 2013 et est annoncée ici.
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Comme pour la version précédente, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • Other interesting software

    13 avril 2011, par

    We don’t claim to be the only ones doing what we do ... and especially not to assert claims to be the best either ... What we do, we just try to do it well and getting better ...
    The following list represents softwares that tend to be more or less as MediaSPIP or that MediaSPIP tries more or less to do the same, whatever ...
    We don’t know them, we didn’t try them, but you can take a peek.
    Videopress
    Website : http://videopress.com/
    License : GNU/GPL v2
    Source code : (...)

Sur d’autres sites (16834)

  • Nomenclature #4626 (Nouveau) : Renommer le menu "Squelettes"

    13 janvier 2021, par RastaPopoulos ♥

    Un petit pavé en début d’année, comme ça peut-être qu’en décembre on aura un début d’idée de quoi faire. :D

    Constat : dans mon expérience, 100% des gens à qui on apprend à utiliser éditorialement SPIP, admins et rédacs donc, n’ont strictement aucune fichue idée de ce que veut dire "Suqelettes", ni quel est le rapport avec le contenu qu’il y a à l’intérieur. Passer du temps à devoir expliquer un terme qui n’aura jamais aucun sens dans leurs activités quotidiennes est une perte de temps pour tout le monde, et 3 mois plus tard illes l’auront oublié vu que ça n’a de rapport avec rien dans leur vie d’admins/rédacs.

    Le fait de faire une référence à l’histoire technique de SPIP, ça ne parle qu’aux devs/intégrateurices : fort peu de gens par rapport à la masse des admins et rédacs qui vont l’utiliser au quotidien.

    Quand on se retire, en tant que devs/ingégrateurices, alors en gros 99% des utilisateurices de l’interface d’admin sont des gens qui ne savent rien du tout de comment c’est techniquement derrière, et même pour beaucoup qui n’ont jamais choisi spécialement ce CMS, et même allons plus loin : assez souvent qui ne savent même pas quel est le CMS utilisé !

    Et point important : ces gens ne devraient avoir aucune obligation de le savoir pour utiliser pourtant comme il faut l’interface.

    Si on leur apprend, parce que nous on aime SPIP et qu’on est enthousiaste à raconter son histoire et comment il marche, c’est super. Mais ça ne doit PAS être une obligation pour comprendre l’interface du premier coup.

    Mon idée (toute relative, c’est pour démarrer quoi) : revenir à des choses simples et couramment utilisées. Il n’y a aucun intérêt spécial à vouloir être original quand on parle quand même du menu principal d’admin.

    Le fait de changer l’intitulé, va forcément changer légèrement le sens, donc quelques plugins qui s’insèrent dedans devront possiblement être déplacés ailleurs. Mais il me semble que ça restera très à la marge, et que la majorité ça correspond toujours. Ça ne doit pas bloquer pour changer. Donc :
    - Mise en page
    - Présentation
    - …

    Dans WP il y a une entrée principale "Apparence", mais ce n’est justement pas notre cas : il faut un terme plus large, qui couvre à la fois les choix graphiques (changer ou configurer un thème, choisir la boite modale…) et les choix de structuration générale, de navigation (Compositions, Menus…).

    Dans ma tête "Mise en page" est pour le moment le terme le plus vaste qui me vient à l’esprit, et qui regroupe plusieurs notions à la fois, pas juste l’apparence graphique. S’il y a mieux tant mieux, du moment que ça regroupe bien ces différentes notions. L’autre jour sur spip-dev Laurent (c-real) disait surcharger avec ce terme aussi pour ses utilisateurices.

    On ne trouvera sûrement jamais le mot parfait à 100%, mais ça sera toujours 1000 fois mieux que "Squelettes" qui vraiment, après 10 ans à devoir l’expliquer en permanence, ne signifie rien pour personne à part nous.

  • Squeeze image when images are larger image than 1024X768 in FFMpeg with javacv

    14 avril 2016, par Saty

    I am using this below code to stream RTMP to my Adobe FMS Server... its doing good. It shows squeezed image if the camera resolution is above 1024X768.
    The issue came when we tested on a Tab which has camera resolution of 1200X800, The recorder automatically takes the resolution of 1024X768 which makes the preview and the actual video a squeezed one and one more thing is recording format does not support MP4

    Can anyone describe why its not working with this and can we use that format.

    public class MainActivity extends Activity implements OnClickListener {

    private final static String LOG_TAG = "MainActivity";

    private PowerManager.WakeLock mWakeLock;

    private String ffmpeg_link = "rtmp://username:password@xxx.xxx.xxx.xxx:1935/live/test.flv";

    //private String ffmpeg_link = "/mnt/sdcard/new_stream.flv" ;

    private volatile FFmpegFrameRecorder recorder;
    boolean recording = false;
    long startTime = 0;

    private int sampleAudioRateInHz = 44100;
    private int imageWidth = 320;
    private int imageHeight = 240;
    private int frameRate = 30;

    private Thread audioThread;
    volatile boolean runAudioThread = true;
    private AudioRecord audioRecord;
    private AudioRecordRunnable audioRecordRunnable;

    private CameraView cameraView;
    private IplImage yuvIplimage = null;

    private Button recordButton;
    private LinearLayout mainLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.activity_main);

    initLayout();
    initRecorder();
    }

    @Override
    protected void onResume() {
     super.onResume();

    if (mWakeLock == null) {
       PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
       mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, LOG_TAG);
       mWakeLock.acquire();
    }
    }

    @Override
    protected void onPause() {
    super.onPause();

    if (mWakeLock != null) {
       mWakeLock.release();
       mWakeLock = null;
    }
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();

    recording = false;
    }


    private void initLayout() {

    mainLayout = (LinearLayout) this.findViewById(R.id.record_layout);

    recordButton = (Button) findViewById(R.id.recorder_control);
    recordButton.setText("Start");
    recordButton.setOnClickListener(this);

    cameraView = new CameraView(this);

    LinearLayout.LayoutParams layoutParam = new LinearLayout.LayoutParams(imageWidth, imageHeight);        
    mainLayout.addView(cameraView, layoutParam);
    Log.v(LOG_TAG, "added cameraView to mainLayout");
    }

    private void initRecorder() {
    Log.w(LOG_TAG,"initRecorder");

    if (yuvIplimage == null) {
       // Recreated after frame size is set in surface change method
       yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
       //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);

       Log.v(LOG_TAG, "IplImage.create");
     }

    recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1);
    Log.v(LOG_TAG, "FFmpegFrameRecorder: " + ffmpeg_link + " imageWidth: " + imageWidth + " imageHeight " + imageHeight);

    recorder.setFormat("flv");
    Log.v(LOG_TAG, "recorder.setFormat(\"flv\")");

    recorder.setSampleRate(sampleAudioRateInHz);
    Log.v(LOG_TAG, "recorder.setSampleRate(sampleAudioRateInHz)");

    // re-set in the surface changed method as well
    recorder.setFrameRate(frameRate);
    Log.v(LOG_TAG, "recorder.setFrameRate(frameRate)");

    // Create audio recording thread
    audioRecordRunnable = new AudioRecordRunnable();
    audioThread = new Thread(audioRecordRunnable);

    }

     // Start the capture
        public void startRecording() {
        try {
       recorder.start();
       startTime = System.currentTimeMillis();
       recording = true;
       audioThread.start();
    } catch (FFmpegFrameRecorder.Exception e) {
       e.printStackTrace();
        }
        }

        public void stopRecording() {
        // This should stop the audio thread from running
       runAudioThread = false;

       if (recorder != null && recording) {
       recording = false;
       Log.v(LOG_TAG,"Finishing recording, calling stop and release on recorder");
       try {
           recorder.stop();
           recorder.release();
       } catch (FFmpegFrameRecorder.Exception e) {
           e.printStackTrace();
       }
       recorder = null;
       }
       }

      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Quit when back button is pushed
      if (keyCode == KeyEvent.KEYCODE_BACK) {
       if (recording) {
           stopRecording();
       }
       finish();
       return true;
       }
       return super.onKeyDown(keyCode, event);
       }

       @Override
       public void onClick(View v) {
       if (!recording) {
       startRecording();
       Log.w(LOG_TAG, "Start Button Pushed");
       recordButton.setText("Stop");
       } else {
       stopRecording();
       Log.w(LOG_TAG, "Stop Button Pushed");
       recordButton.setText("Start");
       }
       }

       //---------------------------------------------
       // audio thread, gets and encodes audio data
       //---------------------------------------------
       class AudioRecordRunnable implements Runnable {

       @Override
        public void run() {
       // Set the thread priority
         android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

       // Audio
       int bufferSize;
       short[] audioData;
       int bufferReadResult;

       bufferSize = AudioRecord.getMinBufferSize(sampleAudioRateInHz,
               AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
       audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioRateInHz,
               AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

       audioData = new short[bufferSize];

       Log.d(LOG_TAG, "audioRecord.startRecording()");
       audioRecord.startRecording();

       // Audio Capture/Encoding Loop
       while (runAudioThread) {
           // Read from audioRecord
           bufferReadResult = audioRecord.read(audioData, 0, audioData.length);
           if (bufferReadResult > 0) {
               //Log.v(LOG_TAG,"audioRecord bufferReadResult: " + bufferReadResult);

               // Changes in this variable may not be picked up despite it being "volatile"
               if (recording) {
                   try {
                       // Write to FFmpegFrameRecorder
                       Buffer[] buffer = {ShortBuffer.wrap(audioData, 0, bufferReadResult)};                        
                       recorder.record(buffer);
                   } catch (FFmpegFrameRecorder.Exception e) {
                       Log.v(LOG_TAG,e.getMessage());
                       e.printStackTrace();
                   }
               }
           }
       }
       Log.v(LOG_TAG,"AudioThread Finished");

       /* Capture/Encoding finished, release recorder */
       if (audioRecord != null) {
           audioRecord.stop();
           audioRecord.release();
           audioRecord = null;
           Log.v(LOG_TAG,"audioRecord released");
       }
    }

    }

     class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {

    private boolean previewRunning = false;

    private SurfaceHolder holder;
    private Camera camera;

    private byte[] previewBuffer;

    long videoTimestamp = 0;

    Bitmap bitmap;
    Canvas canvas;

    public CameraView(Context _context) {
       super(_context);

       holder = this.getHolder();
       holder.addCallback(this);
       holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
       camera = Camera.open();

       try {
           camera.setPreviewDisplay(holder);
           camera.setPreviewCallback(this);

           Camera.Parameters currentParams = camera.getParameters();
           Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
           Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

           // Use these values
           imageWidth = currentParams.getPreviewSize().width;
           imageHeight = currentParams.getPreviewSize().height;
           frameRate = currentParams.getPreviewFrameRate();                

           bitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ALPHA_8);


           /*
           Log.v(LOG_TAG,"Creating previewBuffer size: " + imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8);
           previewBuffer = new byte[imageWidth * imageHeight * ImageFormat.getBitsPerPixel(currentParams.getPreviewFormat())/8];
           camera.addCallbackBuffer(previewBuffer);
           camera.setPreviewCallbackWithBuffer(this);
           */              

           camera.startPreview();
           previewRunning = true;
       }
       catch (IOException e) {
           Log.v(LOG_TAG,e.getMessage());
           e.printStackTrace();
       }  
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
       Log.v(LOG_TAG,"Surface Changed: width " + width + " height: " + height);

       // We would do this if we want to reset the camera parameters
       /*
       if (!recording) {
           if (previewRunning){
               camera.stopPreview();
           }
           try {
               //Camera.Parameters cameraParameters = camera.getParameters();
               //p.setPreviewSize(imageWidth, imageHeight);
               //p.setPreviewFrameRate(frameRate);
               //camera.setParameters(cameraParameters);

               camera.setPreviewDisplay(holder);
               camera.startPreview();
               previewRunning = true;
           }
           catch (IOException e) {
               Log.e(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }  
       }            
       */

       // Get the current parameters
       Camera.Parameters currentParams = camera.getParameters();
       Log.v(LOG_TAG,"Preview Framerate: " + currentParams.getPreviewFrameRate());
       Log.v(LOG_TAG,"Preview imageWidth: " + currentParams.getPreviewSize().width + " imageHeight: " + currentParams.getPreviewSize().height);

       // Use these values
       imageWidth = currentParams.getPreviewSize().width;
       imageHeight = currentParams.getPreviewSize().height;
       frameRate = currentParams.getPreviewFrameRate();

       // Create the yuvIplimage if needed
       yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 2);
       //yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_32S, 2);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
       try {
           camera.setPreviewCallback(null);

           previewRunning = false;
           camera.release();

       } catch (RuntimeException e) {
           Log.v(LOG_TAG,e.getMessage());
           e.printStackTrace();
       }
    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

       if (yuvIplimage != null && recording) {
           videoTimestamp = 1000 * (System.currentTimeMillis() - startTime);

           // Put the camera preview frame right into the yuvIplimage object
           yuvIplimage.getByteBuffer().put(data);

           // FAQ about IplImage:
           // - For custom raw processing of data, getByteBuffer() returns an NIO direct
           //   buffer wrapped around the memory pointed by imageData, and under Android we can
           //   also use that Buffer with Bitmap.copyPixelsFromBuffer() and copyPixelsToBuffer().
           // - To get a BufferedImage from an IplImage, we may call getBufferedImage().
           // - The createFrom() factory method can construct an IplImage from a BufferedImage.
           // - There are also a few copy*() methods for BufferedImage<->IplImage data transfers.

           // Let's try it..
           // This works but only on transparency
           // Need to find the right Bitmap and IplImage matching types

           /*
           bitmap.copyPixelsFromBuffer(yuvIplimage.getByteBuffer());
           //bitmap.setPixel(10,10,Color.MAGENTA);

           canvas = new Canvas(bitmap);
           Paint paint = new Paint();
           paint.setColor(Color.GREEN);
           float leftx = 20;
           float topy = 20;
           float rightx = 50;
           float bottomy = 100;
           RectF rectangle = new RectF(leftx,topy,rightx,bottomy);
           canvas.drawRect(rectangle, paint);

           bitmap.copyPixelsToBuffer(yuvIplimage.getByteBuffer());
           */
           //Log.v(LOG_TAG,"Writing Frame");

           try {

               // Get the correct time
               recorder.setTimestamp(videoTimestamp);

               // Record the image into FFmpegFrameRecorder
               recorder.record(yuvIplimage);

           } catch (FFmpegFrameRecorder.Exception e) {
               Log.v(LOG_TAG,e.getMessage());
               e.printStackTrace();
           }
       }
    }

    }
    }

  • Why does File upload for moving image and Audio to tmp PHP folder work on Windows but only image upload portion works on Mac using MAMP ?

    31 mai 2021, par Yazdan

    So according to my colleague who tested this on Windows says it works perfectly fine , but in my case when I use it on a Mac with MAMP for Moodle , the image files get uploaded to the correct destination folder without an issue whereas the audio files don't move from the tmp folder to the actual destination folder and to check if this was the case ... I just changed and gave a fixed path instead of $fileTmpLoc and the file made it to the correct destination. Sorry I know the first half of the code isn't the main issue but I still wanted to post the whole code so one could understand it easily, moreover I am just beginning to code so please "have a bit of patience with me" . Thanks in advance

    


    &#xA;// this file contains upload function &#xA;// checks if the file exists in server&#xA;include("../db/database.php");&#xA;require_once(dirname(__FILE__) . &#x27;/../../../config.php&#x27;);&#xA;global $IP;&#xA;&#xA;$ajaxdata = $_POST[&#x27;mediaUpload&#x27;];&#xA;&#xA;$FILENAME = $ajaxdata[1];&#xA;$IMAGE=$ajaxdata[0];&#xA;// an array to check which category the media belongs too&#xA;$animal= array("bird","cat","dog","horse","sheep","cow","elephant","bear","giraffe","zebra");&#xA;$allowedExts = array("mp3","wav");&#xA;$temp = explode(".", $_FILES["audio"]["name"]);&#xA;$extension = end($temp);&#xA;&#xA;&#xA;&#xA;$test = $_FILES["audio"]["type"]; &#xA;&#xA;&#xA;if (&#xA;   $_FILES["audio"]["type"] == "audio/wav"||&#xA;   $_FILES["audio"]["type"] == "audio/mp3"||&#xA;   $_FILES["audio"]["type"] == "audio/mpeg"&#xA;   &amp;&amp;&#xA;   in_array($extension, $allowedExts)&#xA;   )&#xA;   {&#xA;&#xA;       // if the name detected by object detection is present in the animal array&#xA;       // then initialize target path to animal database or to others&#xA;       if (in_array($FILENAME, $animal)) &#xA;       { &#xA;           $image_target_dir = "image_dir/";&#xA;           $audio_target_dir = "audio_dir/";&#xA;       } &#xA;       else&#xA;       { &#xA;           $image_target_dir = "other_image_dir/";&#xA;           $audio_target_dir = "other_audio_dir/";&#xA;       } &#xA;       // Get file path&#xA;       &#xA;       $img = $IMAGE;&#xA;       // decode base64 image&#xA;       $img = str_replace(&#x27;data:image/png;base64,&#x27;, &#x27;&#x27;, $img);&#xA;       $img = str_replace(&#x27; &#x27;, &#x27;&#x2B;&#x27;, $img);&#xA;       $image_data = base64_decode($img);&#xA;&#xA;       //$extension  = pathinfo( $_FILES["fileUpload"]["name"], PATHINFO_EXTENSION ); // jpg&#xA;       $image_extension = "png";&#xA;       $image_target_file =$image_target_dir . basename($FILENAME . "." . $image_extension);&#xA;       $image_file_upload = "http://localhost:8888/moodle310/blocks/testblock/classes/".$image_target_file;&#xA;       &#xA;       &#xA;       $audio_extension ="mp3";&#xA;       $audio_target_file= $audio_target_dir . basename($FILENAME. "." . $audio_extension) ;&#xA;       $audio_file_upload = "http://localhost:8888/moodle310/blocks/testblock/classes/".$audio_target_file;&#xA;&#xA;       // file size limit&#xA;       if(($_FILES["audio"]["size"])&lt;=51242880)&#xA;       {&#xA;&#xA;           $fileName = $_FILES["audio"]["name"]; // The file name&#xA;           $fileTmpLoc = $_FILES["audio"]["tmp_name"]; // File in the PHP tmp folder&#xA;           $fileType = $_FILES["audio"]["type"]; // The type of file it is&#xA;           $fileSize = $_FILES["audio"]["size"]; // File size in bytes&#xA;           $fileErrorMsg = $_FILES["audio"]["error"]; // 0 for false... and 1 for true&#xA;           &#xA;           if (in_array($FILENAME, $animal)) &#xA;           { &#xA;               $sql = "INSERT INTO mdl_media_animal (animal_image_path,animal_name,animal_audio_path) VALUES (&#x27;$image_file_upload&#x27;,&#x27;$FILENAME&#x27;,&#x27;$audio_file_upload&#x27;)";&#xA;           } else {&#xA;               $sql = "INSERT INTO mdl_media_others (others_image_path,others_name,others_audio_path) VALUES (&#x27;$image_file_upload&#x27;,&#x27;$FILENAME&#x27;,&#x27;$audio_file_upload&#x27;)";&#xA;           }&#xA;&#xA;           // if file exists&#xA;           if (file_exists($audio_target_file) || file_exists($image_target_file)) {&#xA;               echo "alert";&#xA;           } else {&#xA;               // write image file&#xA;               if (file_put_contents($image_target_file, $image_data) ) {&#xA;                   // ffmpeg to write audio file&#xA;                   $output = shell_exec("ffmpeg -i $fileTmpLoc -ab 160k -ac 2 -ar 44100 -vn $audio_target_file");&#xA;                   echo $output;&#xA;               &#xA;                   // $stmt = $conn->prepare($sql);&#xA;                   $db = mysqli_connect("localhost", "root", "root", "moodle310"); &#xA;                   // echo $sql;&#xA;                   if (!$db) {&#xA;                       echo "nodb";&#xA;                       die("Connection failed: " . mysqli_connect_error());&#xA;                   }&#xA;                   // echo"sucess";&#xA;                   if(mysqli_query($db, $sql)){&#xA;                   // if($stmt->execute()){&#xA;                       echo $fileTmpLoc;&#xA;                       echo "sucess";  &#xA;                       echo $output;&#xA;                   }&#xA;                   else {&#xA;                       // echo "Error: " . $sql . "<br />" . mysqli_error($conn);&#xA;                       echo "failed";&#xA;                   }&#xA;&#xA;               }else {&#xA;                   echo "failed";&#xA;               }&#xA;&#xA;               &#xA;           &#xA;           &#xA;           }&#xA;   &#xA;    // $test = "ffmpeg -i $outputfile -ab 160k -ac 2 -ar 44100 -vn bub.wav";&#xA;       } else&#xA;       {&#xA;         echo "File size exceeds 5 MB! Please try again!";&#xA;       }&#xA;}&#xA;else&#xA;{&#xA;   echo "PHP! Not a video! ";//.$extension." ".$_FILES["uploadimage"]["type"];&#xA;   }&#xA;&#xA;?>&#xA;

    &#xA;

    I am a student learning frontend but a project of mine requires a fair bit of backend. So forgive me if my question sounds silly.

    &#xA;

    What I meant by manually overriding it was creating another folder and a index.php file with echo "hello"; $output = shell_exec("ffmpeg -i Elephant.mp3 -ab 160k -ac 2 -ar 44100 -vn bub.mp3"); echo $output; so only yes in this case Elephant.mp3 was changed as the initial tmp path so in this case as suggested by Mr.CBroe the permissons shouldn't be an issue.

    &#xA;

    Okay I checked my Apache_error.logonly to find out ffmpeg is indeed the culprit ... I had installed ffmpeg globally so I am not sure if it is an access problem but here is a snippet of the log

    &#xA;

    I checked my php logs and found out that FFmpeg is the culprit.&#xA;Attached is a short log file

    &#xA;

    [Mon May 31 18:11:33 2021] [notice] caught SIGTERM, shutting down&#xA;[Mon May 31 18:11:40 2021] [notice] Digest: generating secret for digest authentication ...&#xA;[Mon May 31 18:11:40 2021] [notice] Digest: done&#xA;[Mon May 31 18:11:40 2021] [notice] Apache/2.2.34 (Unix) mod_ssl/2.2.34 OpenSSL/1.0.2o PHP/7.2.10 configured -- resuming normal operations&#xA;sh: ffmpeg: command not found&#xA;sh: ffmpeg: command not found&#xA;sh: ffmpeg: command not found&#xA;

    &#xA;