[英]How to run ffmpeg from command line in android
我想使用命令行使用ffmpeg。我已经在项目的files目录中保存了ffmpeg.so。但是我这样做时遇到异常。这是代码:
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
请告诉我我在做什么样的错误。谢谢。
首先,您不能直接执行shared object
文件。 您需要构建一个可以使用/system/bin
运行的ffmpeg可执行文件
请将此作为参考FFmpeg在Android上
在你能够编译之后,你可以在APK的assets文件夹中将可执行文件解压缩到/data/data/<your package>/
(确保chmod 755也是如此!)
完成后,您可以使用构建命令行字符串并将其传递给ProcessBuilder
而不是使用Runtime.exec()来运行可执行文件
例外提到'环境'是空的......
也许代替'exec',尝试使用processbuilder,如下面的运行ffmpeg的服务器端代码示例,包含在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使用完整的JNI接口和包装来调用ffmpeg.main()会更可靠。 看看所有的git项目......搜索'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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.