How to run ffmpeg from command line in android

前端 未结 2 350
说谎
说谎 2020-12-10 05:41

I want to use ffmpeg using command line.I have saved ffmpeg.so in files directory in the project.But i am getting exception while doing so.This is the code:

         


        
相关标签:
2条回答
  • 2020-12-10 05:53

    The exception mentions the 'environment' is null...

    maybe instead of 'exec', try using processbuilder as in the below sample of server-side code running ffmpeg wrapped in a shellscript(pars_submit)... note builder.environment

            public String getFfmpeg(@QueryParam("infil1") String infil1, 
                    @QueryParam("infil2") String infil2, @QueryParam("otfil") String otfil,
                    @QueryParam("t") String time) {         
            String outfil = "dummy.mp4";
    
              List<String> command = new ArrayList<String>();
                command.add("vendor/bin/pars_submit");
    
                command.add(infil1);     
    
                command.add(infil2);
                command.add(otfil);
                command.add(time);
    
    System.out.println("Starting process " +command.toString());
                ProcessBuilder builder = new ProcessBuilder(command);
                Map<String, String> environ = builder.environment();
    //          for(Entry<String, String> entry : environ.entrySet()){
        //          System.out.println("ENV " +entry.getKey() + " " +entry.getValue());
          //      }
    //          builder.redirectErrorStream(true);
                Process process = null;
                try {
                    process = builder.start();
    
                InputStream is = process.getInputStream();
    
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine()) != null) {  
                  //System.out.println(line);
                    outfil=line;
                }
    
    //          int exitVal = process.waitFor();
     //           System.out.println("Process exitValue: " + exitVal);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  
                finally {
                      if (process != null) {
                        process.destroy();
                        process = null;
                      }
    
    
                    }           
    
    
                return outfil;
    
    
                    }
    

    IMO - android-ffmpeg is going to be more reliable using a full JNI interface and wrapper for the call to ffmpeg.main(). Look at all the git projects... search on 'android-ffmpeg' and look how they invoke ffmpeg. CLI is not used.

    pars_submit

    #!/bin/bash
    shopt -s globstar
    uri=$1
    filnam="${uri##*/}"
    uri2=$2
    filnam2="${uri2##*/}"
    otfil=$3
    time=$4
    curl -#LO  $uri
    curl -#LO  $uri2
    ffmpeg -y -loop 1 -i "$filnam" -i "$filnam2" -t "$time" -r 1/2 -pass 1 -vcodec libx264 -b:v 200k -bt 50k  -an -f mp4 -strict -2 -passlogfile mydummy /dev/null
    # echo "ffmpegP1 Exit status" $?
    ffmpeg -y -loop 1 -i "$filnam" -i "$filnam2" -t "$time" -r 1/2 -pass 2 -vcodec libx264 -b:v 200k -bt 50k  -f mp4 -strict -2 -passlogfile mydummy -ar 44100 "$otfil" 
    # echo "ffmpegp2 Exit status" $?
    # last test
    json=$(curl  -X POST  -H "X-Parse-Application-Id: 3KxPB" -H "X-Parse-REST-API-Key: kVl5Z0CX"  -H "Content-Type: video/mp4"  --data-binary @"$otfil" https://api.parse.com/1/files/"$otfil")
    # echo "parse POST Exit status" $?
    echo $json
    
    0 讨论(0)
  • 2020-12-10 06:00

    So firstly, you cannot directly execute a shared object file. You need to build a ffmpeg executable that can be run using /system/bin

    Kindly take this as reference FFmpeg on Android

    After you are able to get it compiled, you can but the executable in your assets folder of the APK and extract it to /data/data/<your package>/ (ensure a chmod 755 too!)

    Once that's done, you can run the executable by using building a command line string and passing it to ProcessBuilder instead of using the Runtime.exec()

    0 讨论(0)
提交回复
热议问题