2012-09-16 19 views
9

में कमांड लाइन से ffmpeg कैसे चलाएं I कमांड लाइन का उपयोग करके ffmpeg का उपयोग करना चाहते हैं। मैंने प्रोजेक्ट में फाइल निर्देशिका में ffmpeg.so को सहेजा है। लेकिन मुझे ऐसा करने के दौरान अपवाद मिल रहा है। यह कोड है:एंड्रॉइड

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 

कृपया मुझे बताओ कि गलती किस तरह मैं doing.Thanks हूँ:

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

    } 

} 

यह अपवाद नहीं है।

+0

कृपया मेरी मदद करो। – user1662334

+0

इनपुट छवियों और आउटपुट वीडियो दोनों के लिए "-r" पैरामीटर के साथ कमांड का प्रयास करें, उदाहरण के लिए, ffmpeg -r 24 -i उदाहरण।% D.png -vcodec mjpeg -samq -r 24 -y example.mpeg – AndroidEnthusiastic

उत्तर

11

तो सबसे पहले, आप सीधे shared object फ़ाइल निष्पादित नहीं कर सकते हैं। आप कृपया संदर्भ के रूप में लेने के लिए है कि /system/bin

का उपयोग कर चलाया जा सकता है एक ffmpeg निष्पादन का निर्माण करने की जरूरत है FFmpeg on Android

के बाद आप इसे संकलित प्राप्त कर सकते हैं, आप कर सकते हैं लेकिन APK और निकालने की अपनी संपत्ति फ़ोल्डर में निष्पादन यह /data/data/<your package>/ (एक chmod 755 भी सुनिश्चित!)

एक बार यह हो, तो आप एक कमांड लाइन स्ट्रिंग निर्माण और ProcessBuilder करने के लिए इसे पारित करने का उपयोग कर के बजाय का उपयोग कर Runtime.exec() द्वारा निष्पादन चला सकते हैं

+0

है रॉयस्टन, ffmpeg लाइब्रेरी खिड़कियों में 32 बिट में buliding नहीं है कृपया मुझे यह करने में मदद करें? – Ajay

+0

हैलो, मैंने कभी विंडोज़ पर इसे बनाने की कोशिश नहीं की है :) –

+0

@ रॉयस्टनपिनटो मैं एंड्रॉइड में वीडियो खेलना चाहता हूं, क्या मुझे अपने एक्सएमएल में एक वीडियोव्यू बनाना चाहिए। कृपया मुझे play कमांड –

1

exceptio n उल्लेख करता है कि 'पर्यावरण' शून्य है ...

शायद 'exec' के बजाय, सर्वर-साइड कोड के नीचे दिए गए नमूने के रूप में प्रक्रिया-बिल्डर का उपयोग करने का प्रयास करें, एक शेलस्क्रिप्ट (pars_submit) में लिपटे ffmpeg चल रहा है ... नोट बिल्डर। पर्यावरण

 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 - एंड्रॉयड-ffmpeg कॉल के लिए एक पूर्ण JNI इंटरफेस और आवरण का उपयोग कर ffmpeg.main के लिए और अधिक विश्वसनीय होने जा रहा है()। सभी गिट परियोजनाओं को देखें ... 'android-ffmpeg' पर खोजें और देखें कि वे ffmpeg कैसे आते हैं। सीएलआई का उपयोग नहीं किया जाता है।

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

के साथ मार्गदर्शन करें हां यह काम करता है लेकिन br.readLine() पर कोई समय लगता है .. कोई सुझाव? –

+1

फ़ोन तेजी से ट्रांसकोडिंग के लिए अच्छा नहीं है। गति के लिए आप एक सर्वर nerd। –