2017-04-12 105 views
0

我正在使用FFMPEG庫,在其中我想使用此庫來旋轉視頻,如果我的file path沒有任何white space,那麼它可以正常工作。但在我的情況下,我有空白的視頻目錄(你可以看到在String commandStronPreExecute()方法asynctask)路徑然後它根本不工作的完整路徑。我也看到了像this等一些問題,但還沒有任何想法如何正確解決它。下面是我MainActivity.classffmpeg命令不能在Android中使用目錄路徑的空白區

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 

    String workFolder = null; 
    String demoVideoFolder = null; 
    String vkLogPath = null; 
    private boolean commandValidationFailedFlag = false; 

    private Button btnRun; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     GeneralUtils.checkForPermissionsMAndAbove(MainActivity.this, true); 


     setIds(); 
     setListner(); 


     demoVideoFolder = Environment.getExternalStorageDirectory().getAbsolutePath() + "/videokit/"; 

     Log.i(Prefs.TAG, getString(R.string.app_name) + " version: " + GeneralUtils.getVersionName(getApplicationContext())); 
     workFolder = getApplicationContext().getFilesDir().getAbsolutePath() + "/"; 
     vkLogPath = workFolder + "vk.log"; 

     GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(this, workFolder); 
     GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(this, demoVideoFolder); 


     int rc = GeneralUtils.isLicenseValid(getApplicationContext(), workFolder); 
     Log.i(Prefs.TAG, "License check RC: " + rc); 
    } 

    private void setListner() { 
     btnRun.setOnClickListener(this); 
    } 

    private void setIds() { 
     try { 
      btnRun = (Button)findViewById(R.id.btnRun); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     switch (view.getId()){ 
      case R.id.btnRun: 

       Log.i(Prefs.TAG, "run clicked."); 
       if (GeneralUtils.checkIfFileExistAndNotEmpty(workFolder)) { 
        new TranscdingBackground(MainActivity.this).execute(); 
       } 
       else { 
        Toast.makeText(getApplicationContext(), workFolder + " not found", Toast.LENGTH_LONG).show(); 
       } 
       break; 
     } 
    } 

    public class TranscdingBackground extends AsyncTask<String, Integer, Integer> 
    { 

     ProgressDialog progressDialog; 
     Activity _act; 
     String commandStr; 

     public TranscdingBackground (Activity act) { 
      _act = act; 
     } 



     @Override 
     protected void onPreExecute() { 

//   commandStr = "ffmpeg -y -i /storage/emulated/0/WhatsApp/Media/in.mp4 -vf rotate=270*(PI/180) /sdcard/videokit/out.mp4"; 
      commandStr = "ffmpeg -y -i /storage/emulated/0/WhatsApp/Media/WhatsApp Video/in.mp4 -vf rotate=270*(PI/180) /sdcard/videokit/out.mp4"; 


      progressDialog = new ProgressDialog(_act); 
      progressDialog.setMessage("FFmpeg4Android Transcoding in progress..."); 
      progressDialog.show(); 

     } 

     protected Integer doInBackground(String... paths) { 
      Log.i(Prefs.TAG, "doInBackground started..."); 

      // delete previous log 
      boolean isDeleted = GeneralUtils.deleteFileUtil(workFolder + "/vk.log"); 
      Log.i(Prefs.TAG, "vk deleted: " + isDeleted); 

      PowerManager powerManager = (PowerManager)_act.getSystemService(Activity.POWER_SERVICE); 
      PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VK_LOCK"); 
      Log.d(Prefs.TAG, "Acquire wake lock"); 
      wakeLock.acquire(); 



      LoadJNI vk = new LoadJNI(); 
      try { 

       vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext()); 

       // copying vk.log (internal native log) to the videokit folder 
       GeneralUtils.copyFileToFolder(vkLogPath, demoVideoFolder); 

      } catch (CommandValidationException e) { 
       Log.e(Prefs.TAG, "vk run exeption.", e); 
       commandValidationFailedFlag = true; 

      } catch (Throwable e) { 
       Log.e(Prefs.TAG, "vk run exeption.", e); 
      } 
      finally { 
       if (wakeLock.isHeld()) 
        wakeLock.release(); 
       else{ 
        Log.i(Prefs.TAG, "Wake lock is already released, doing nothing"); 
       } 
      } 
      Log.i(Prefs.TAG, "doInBackground finished"); 
      return Integer.valueOf(0); 
     } 

     protected void onProgressUpdate(Integer... progress) { 
     } 

     @Override 
     protected void onCancelled() { 
      Log.i(Prefs.TAG, "onCancelled"); 
      //progressDialog.dismiss(); 
      super.onCancelled(); 
     } 


     @Override 
     protected void onPostExecute(Integer result) { 
      Log.i(Prefs.TAG, "onPostExecute"); 
      progressDialog.dismiss(); 
      super.onPostExecute(result); 

      // finished Toast 
      String rc = null; 
      if (commandValidationFailedFlag) { 
       rc = "Command Vaidation Failed"; 
      } 
      else { 
       rc = GeneralUtils.getReturnCodeFromLog(vkLogPath); 
      } 
      final String status = rc; 
      MainActivity.this.runOnUiThread(new Runnable() { 
       public void run() { 
        Toast.makeText(MainActivity.this, status, Toast.LENGTH_LONG).show(); 
        if (status.equals("Transcoding Status: Failed")) { 
         Toast.makeText(MainActivity.this, "Check: " + vkLogPath + " for more information.", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 
     } 
    } 

} 

這裏onPreExecute()方法我已經給視頻文件路徑的代碼。

回答

0

我的事情,因爲你犯了一個命令行調用,您需要對這些:

  • 轉義一些特殊字符(比如你需要在命令行中太)

  • 引用文件名(比你需要在文件名中加引號)

+0

非常感謝您的快速響應,但請您瞭解示例代碼,我如何才能完全集成。因爲我已經在'TranscdingBackground'類的'commandStr'中傳遞了命令。 –

0

只需將您的命令從String轉換爲ArrayList,如下所示:

commandStr = "ffmpeg -y -i /storage/emulated/0/WhatsApp/Media/WhatsApp Video/in.mp4 -vf rotate=270*(PI/180) /sdcard/videokit/out.mp4"; 

ArrayList<String> arrayList = new ArrayList<>(); 
arrayList.add("ffmpeg"); 
      arrayList.add("-y"); 
      arrayList.add("-i"); 
      arrayList.add("/storage/emulated/0/WhatsApp/Media/WhatsApp Video/in.mp4"); 
      arrayList.add("-vf"); 
      arrayList.add("rotate=270*(PI/180)"); 
      arrayList.add("/sdcard/videokit/out.mp4"); 

並更改您的vk.run();方法如下所示:

vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext()); 

vk.run(arrayList.toArray(new String[arrayList.size()]), workFolder, getApplicationContext());