2012-09-16 15 views
9

Tôi muốn sử dụng ffmpeg bằng cách sử dụng dòng lệnh.I đã lưu ffmpeg.so trong thư mục tệp trong dự án.Nhưng tôi đang nhận được ngoại lệ trong khi thực hiện. Đây là mã:Làm thế nào để chạy ffmpeg từ dòng lệnh trong android

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); 
     } 

    } 

} 

Đây là ngoại lệ:

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 

Xin cho biết những loại sai lầm tôi doing.Thanks.

+0

Xin hãy giúp tôi. – user1662334

+0

Hãy thử lệnh có thông số "-r" cho cả hình ảnh đầu vào và video đầu ra, ví dụ: ffmpeg -r Ví dụ 24-.% D.png -vcodec mjpeg -samq -r 24 -y example.mpeg – AndroidEnthusiastic

Trả lời

11

Trước tiên, bạn không thể thực hiện trực tiếp tệp shared object. Bạn cần phải xây dựng một thực thi ffmpeg có thể chạy bằng /system/bin

Vui lòng thực hiện việc này như tài liệu tham khảo FFmpeg on Android

Sau khi bạn có thể để có được nó được biên dịch, bạn có thể nhưng thực thi trong thư mục tài sản của bạn của APK và chiết xuất nó để /data/data/<your package>/ (đảm bảo một chmod 755 quá!)

Khi đã xong, bạn có thể chạy file thực thi bằng cách sử dụng xây dựng một chuỗi dòng lệnh và đi qua nó để ProcessBuilder thay vì sử dụng Runtime.exec()

+0

hai Royston, thư viện ffmpeg không phải là buliding trong các cửa sổ os 32 bit xin vui lòng giúp tôi làm thế nào để làm điều đó? – Ajay

+0

Xin chào, tôi chưa bao giờ thử xây dựng nó trên Windows :) –

+0

@RoystonPinto tôi muốn phát video trong android, tôi có nên tạo một videoview trong xml của mình không. Xin vui lòng hướng dẫn tôi với lệnh chơi –

1

các ngoại trừ n đề cập đến 'môi trường' là null ...

có thể thay vì 'exec', hãy thử sử dụng trình xử lý như trong mẫu bên dưới của mã phía máy chủ đang chạy ffmpeg được bao bọc trong shellscript (pars_submit) ... note builder. môi trường

 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 sẽ đáng tin cậy hơn bằng cách sử dụng giao diện JNI đầy đủ và trình bao bọc cho cuộc gọi tới ffmpeg.main(). Nhìn vào tất cả các dự án git ... tìm kiếm trên 'android-ffmpeg' và tìm cách chúng gọi ffmpeg. CLI không được sử dụng.

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

Có nó hoạt động nhưng phải mất rất nhiều thời gian trên br.readLine() .. bất kỳ đề nghị? –

+1

Điện thoại không tuyệt vời để chuyển mã nhanh. Đối với tốc độ bạn nerd một máy chủ. –