Как обрезать видео с временем начала и окончания в Android программно? - PullRequest
0 голосов
/ 24 мая 2018

Я хочу программно обрезать локальное видео на основе времени начала и конца в Android, я попробовал ниже прикрепить несколько ссылок, но у меня не получилось. Пожалуйста, дайте мне знать какие-либо рабочие библиотеки или примеры кода, чтобы преодолеть это?

Реферированные ссылки:

  1. Android SDK вырезать / обрезать видеофайл
  2. Как обрезать видео с помощью библиотеки FFMPEG в Android?
  3. https://superuser.com/questions/377343/cut-part-from-video-file-from-start-position-to-end-position-with-ffmpeg

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Используйте библиотеку FFMPEG для решения вашей проблемы.Спасибо за написание мыслей, чтобы сделать ffmpeg простым для Android 1. implementation 'com.writingminds:FFmpegAndroid:0.3.2'

инициализировать ffmpeg

private void setUpFFmpeg() {
ffmpeg = FFmpeg.getInstance(context);


try {
    ffmpeg.loadBinary(new LoadBinaryResponseHandler() {

        @Override
        public void onStart() {
            Log.d("Event ", "onStart");
        }

        @Override
        public void onFailure() {
            Log.d("Event ", "onFailure");
        }

        @Override
        public void onSuccess() {
            Log.d("Event ", "onSuccess");
        }

        @Override
        public void onFinish() {
            Log.d("Event ", "onFinish");

        }
    });
} catch (FFmpegNotSupportedException e) {
    // Handle if FFmpeg is not supported by device
}
}

использовать команду FFMPEG подобно @Mahesh Keshvala, опубликованному выше.Хорошая работа @ Mahesh

, тогда execFFmpegBinary(complexCommand); будет таким

private void execFFmpegBinary(String[] command){
      try {

    ffmpeg.execute(commands, new ExecuteBinaryResponseHandler() {

        @Override
        public void onStart() {
            Log.d("Event ", "onStart");
        }

        @Override
        public void onProgress(String message) {
            Log.e("Event ", "onProgress - " + message);

        }

        @Override
        public void onFailure(String message) {
            Log.e("Event ", "onFailure - " + message);

        }

        @Override
        public void onSuccess(String message) {
            Log.e("Event ", "onSuccess - " + message);

        }

        @Override
        public void onFinish() {
            Log.e("Event ", "onFinish");

        }
    });
} catch (FFmpegCommandAlreadyRunningException e) {
    // Handle if FFmpeg is already running
 }
}

команда try для вырезанного видео

String[] complexCommand = {"-ss", "" + startMs / 1000, "-y", "-i", inputFileAbsolutePath, "-t", "" + (endMs - startMs) / 1000, "-s", "320x240", "-r", "15", "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", outputFileAbsolutePath};

чтобы узнать больше о ffmpeg android, обратитесь по этой ссылке

0 голосов
/ 24 мая 2018

Вот решение, использующее библиотеку FFMPEG с использованием приведенной ниже функции для обрезки или обрезки видео, возможно, это будет работать для вас:

private void executeCutVideoCommand(int startMs, int endMs) {
    File moviesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES
    );

    String filePrefix = "cut_video";
    String fileExtn = ".mp4";
    String yourRealPath = getPath(VideoEffectActivity.this, selectedVideoUri);
    File dest = new File(moviesDir, filePrefix + fileExtn);
    int fileNo = 0;
    while (dest.exists()) {
        fileNo++;
        dest = new File(moviesDir, filePrefix + fileNo + fileExtn);
    }

    Log.d(TAG, "startTrim: src: " + yourRealPath);
    Log.d(TAG, "startTrim: dest: " + dest.getAbsolutePath());
    Log.d(TAG, "startTrim: startMs: " + startMs);
    Log.d(TAG, "startTrim: endMs: " + endMs);
    filePath = dest.getAbsolutePath();
    //String[] complexCommand = {"-i", yourRealPath, "-ss", "" + startMs / 1000, "-t", "" + endMs / 1000, dest.getAbsolutePath()};
    String[] complexCommand = {"-ss", "" + startMs / 1000, "-y", "-i", yourRealPath, "-t", "" + (endMs - startMs) / 1000, "-vcodec", "mpeg4", "-b:v", "2097152", "-b:a", "48000", "-ac", "2", "-ar", "22050", filePath};

    execFFmpegBinary(complexCommand);

}


 private void execFFmpegBinary(final String[] command) {
    try {
        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {
                Log.d(TAG, "FAILED with output : " + s);
            }

            @Override
            public void onSuccess(String s) {
                Log.d(TAG, "SUCCESS with output : " + s);
               //You have to create a class of Preview Activity
               //If you don't have please remove below Intent code
                    Intent intent = new Intent(VideoEffectActivity.this, PreviewActivity.class);
                    intent.putExtra(FILEPATH, filePath);
                    startActivity(intent);
            }

            @Override
            public void onProgress(String s) {
                    progressDialog.setMessage("progress : " + s);
                Log.d(TAG, "progress : " + s);
            }

            @Override
            public void onStart() {
                Log.d(TAG, "Started command : ffmpeg " + command);
                progressDialog.setMessage("Processing...");
                progressDialog.show();
            }

            @Override
            public void onFinish() {
                Log.d(TAG, "Finished command : ffmpeg " + command);
               progressDialog.dismiss();
            }
        });
    } catch (FFmpegCommandAlreadyRunningException e) {
        // do nothing for now
    }
}

Поместите эту зависимость в файл Gradle:

    compile 'com.writingminds:FFmpegAndroid:0.3.2'
...