2015-12-04 3 views
0

Я создал приложение, использующее библиотеку FFmpeg4Android. Я хотел бы добавить водяной знак в видео, используя ffmpeg. Команда для добавления водяного знака работает нормально, но в команде есть предварительно фиксированное имя видео. Я хотел бы выбрать видео из папки галереи, а затем добавить водяные знаки к видео. Я не знаю, как добавить намерение выбирать видео с помощью FFmpeg. Я пытался добавить намерение, как это замена in.mp4 с PICK_FROM_GALLERY намерений:FFmpeg4Android: Как выбрать видео из галереи?

private void runTranscodingUsingLoader() { 
    Log.i(Prefs.TAG, "runTranscodingUsingLoader started..."); 

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

    Intent intent = new Intent(); 

    intent.setType("video/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 

    startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_GALLERY); 


    String[] complexCommand = {"ffmpeg","-y" ,"-i", String.valueOf(PICK_FROM_GALLERY),"-strict","experimental", 
      "-vf", "movie=/sdcard/videokit/watermark.png [watermark];" + 
      " [in][watermark] overlay=main_w-overlay_w-10:10 [out]","-s", 
      "320x240","-r", "30", "-b", "15496k", "-vcodec", "mpeg4","-ab", 
      "48000", "-ac", "2", "-ar", "22050", "/sdcard/videokit/out1.mp4"}; 

Он открывает галерею, но команда Doesnt водяных знаков получить выполняются в выбранном видео. Может кто-то помочь мне решить эту проблему. Я не мог найти правильные ссылки/примеры относительно этого. Мое полное кодирование выглядит следующим образом.

public class ProgressBarExample extends Activity { 

public ProgressDialog progressBar; 

String workFolder = null; 
String demoVideoFolder = null; 
String demoVideoPath = null; 
String vkLogPath = null; 
LoadJNI vk; 
private final int STOP_TRANSCODING_MSG = -1; 
private final int FINISHED_TRANSCODING_MSG = 0; 
private boolean commandValidationFailedFlag = false; 
private static final int PICK_FROM_GALLERY = 1; 

private void runTranscodingUsingLoader() { 
    Log.i(Prefs.TAG, "runTranscodingUsingLoader started..."); 

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




    String[] complexCommand = {"ffmpeg","-y" ,"-i", "/sdcard/videokit/in.mp4","-strict","experimental", 
      "-vf", "movie=/sdcard/videokit/watermark.png [watermark];" + 
      " [in][watermark] overlay=main_w-overlay_w-10:10 [out]","-s", 
      "320x240","-r", "30", "-b", "15496k", "-vcodec", "mpeg4","-ab", 
      "48000", "-ac", "2", "-ar", "22050", "/sdcard/videokit/out1.mp4"}; 
    /////////////////////////////////////////////////////////////////////// 


    vk = new LoadJNI(); 
    try { 
     // running complex command with validation 
     vk.run(complexCommand, workFolder, getApplicationContext()); 

     // running without command validation 
     //vk.run(complexCommand, workFolder, getApplicationContext(), false); 

     // running regular command with validation 
     //vk.run(GeneralUtils.utilConvertToComplex(commandStr), workFolder, getApplicationContext()); 

     Log.i(Prefs.TAG, "vk.run finished."); 
     // 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(); 
      Log.i(Prefs.TAG, "Wake lock released"); 
     } 
     else{ 
      Log.i(Prefs.TAG, "Wake lock is already released, doing nothing"); 
     } 
    } 

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


@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(Prefs.TAG, "onCreate ffmpeg4android ProgressBarExample"); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ffmpeg_demo_client_2); 

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

    Log.i(Prefs.TAG, getString(R.string.app_name) + " version: " + GeneralUtils.getVersionName(getApplicationContext())); 

    Button invoke = (Button)findViewById(R.id.invokeButton); 
    invoke.setOnClickListener(new OnClickListener() { 
     public void onClick(View v){ 
      Log.i(Prefs.TAG, "run clicked."); 
      runTranscoding(); 
     } 
    }); 

    workFolder = getApplicationContext().getFilesDir() + "/"; 
    Log.i(Prefs.TAG, "workFolder (license and logs location) path: " + workFolder); 
    vkLogPath = workFolder + "vk.log"; 
    Log.i(Prefs.TAG, "vk log (native log) path: " + vkLogPath); 
    GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(this, workFolder); 
    GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(this, demoVideoFolder); 
    int rc = GeneralUtils.isLicenseValid(getApplicationContext(), workFolder); 
    Log.i(Prefs.TAG, "License check RC: " + rc); 
} 



private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     Log.i(Prefs.TAG, "Handler got message"); 
     if (progressBar != null) { 
      progressBar.dismiss(); 

      // stopping the transcoding native 
      if (msg.what == STOP_TRANSCODING_MSG) { 
       Log.i(Prefs.TAG, "Got cancel message, calling fexit"); 
       vk.fExit(getApplicationContext()); 


      } 
     } 
    } 
}; 

public void runTranscoding() { 
    progressBar = new ProgressDialog(ProgressBarExample.this); 
    progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressBar.setTitle("FFmpeg4Android Direct JNI"); 
    progressBar.setMessage("Press the cancel button to end the operation"); 
    progressBar.setMax(100); 
    progressBar.setProgress(0); 

    progressBar.setCancelable(false); 
    progressBar.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      handler.sendEmptyMessage(STOP_TRANSCODING_MSG); 
     } 
    }); 

    progressBar.show(); 

    new Thread() { 
     public void run() { 
      Log.d(Prefs.TAG,"Worker started"); 
      try { 
       //sleep(5000); 
       runTranscodingUsingLoader(); 
       handler.sendEmptyMessage(FINISHED_TRANSCODING_MSG); 

      } catch(Exception e) { 
       Log.e("threadmessage",e.getMessage()); 
      } 
     } 
    }.start(); 

    // Progress update thread 
    new Thread() { 
     ProgressCalculator pc = new ProgressCalculator(vkLogPath); 
     public void run() { 
      Log.d(Prefs.TAG,"Progress update started"); 
      int progress = -1; 
      try { 
       while (true) { 
        sleep(300); 
        progress = pc.calcProgress(); 
        if (progress != 0 && progress < 100) { 
         progressBar.setProgress(progress); 
        } 
        else if (progress == 100) { 
         Log.i(Prefs.TAG, "==== progress is 100, exiting Progress update thread"); 
         pc.initCalcParamsForNextInter(); 
         break; 
        } 
       } 

      } catch(Exception e) { 
       Log.e("threadmessage",e.getMessage()); 
      } 
     } 
    }.start(); 
} 

} 

Любая помощь/руководство было бы действительно полезно. Спасибо.

ответ

1

FFmpeg не используется для загрузки видео из галереи или где угодно.
Но он используется для обработки видео (ов) заданного пути, так что вам нужно выбрать видео в соответствии с выбором пользователя, используя по умолчанию сборщик видеороликов по умолчанию. После метода onActivityResult(...) вы получите путь к выбранному видео, после получения этого видеоканала вы можете передать этот путь соответствующей команде ffmpeg для обработки видео.

+0

означает, что я должен пройти как видео uri из onActivityResult() в ffmpeg? @santoXme – marian

+0

вы можете получить URI абсолютного пути, и вам нужно пройти этот абсолютный путь к ffmpeg ... – santoXme

+0

ладно, спасибо вам большое @santoXme .. я постараюсь сделать то, что вы предложили. – marian

Смежные вопросы