如何从android中的命令行运行ffmpeg

我想使用命令行使用ffmpeg。我已经将ffmpeg.so保存在项目中的文件目录中,但是我这样做的时候得到了exception。这是代码:

public class MainActivity extends Activity { Process p; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Process p = Runtime.getRuntime().exec("/data/data/com.example.ffmpegnew/files/ffmpeg",null, new File("/data/data/com.example.ffmpegnew/files")); } catch(Exception e) { System.out.println("exception"+e); } } } 

这是例外:

 09-16 16:21:24.992: I/System.out(2103): exceptionjava.io.IOException: Error running exec(). Commands: [/data/data/com.example.ffmpegnew/files/ffmpeg] Working Directory: /data/data/com.example.ffmpegnew/files Environment: null 

请告诉我我正在做什么样的错误。谢谢。

Solutions Collecting From Web of "如何从android中的命令行运行ffmpeg"

所以首先,你不能直接执行shared object文件。 您需要构build一个可以使用/system/bin运行的ffmpeg可执行文件

请把它作为Android上的参考FFmpeg

当你能够得到它的编译后,你可以在你的资产文件夹中的可执行文件解压缩到/data/data/<your package>/ (确保一个chmod 755!)

完成之后,可以通过使用构build命令行string并将其传递给ProcessBuilder而不是使用Runtime.exec()来运行可执行文件。

例外提到“环境”为空…

可能不是'exec',请尝试使用processbuilder,如下面运行ffmpeg的shell脚本(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将是更可靠的使用完整的JNI接口和包装调用ffmpeg.main()。 看看所有的Git项目…search“android-ffmpeg”,看看他们如何调用ffmpeg。 CLI不使用。

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