2013-08-26 11 views
250

Я попытался вырезать видео с помощью начала и время окончания видео, используя следующую командуРазрезание видео на основе времени начала и конца с помощью FFmpeg

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4 

Используя вышеприведенную команду, я хочу, чтобы сократить видео от 00:00:03 до 00:00:08. Но это не режет видео между этими временами, а не режет видео с первых 11 секунд. может ли кто-нибудь помочь мне, как это решить?

Edit 1:

Я попытался вырезать с помощью следующей команды, которая предложенный mark4o

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4 

Но это было показано следующее сообщение об ошибке.

кодер «ААС» является экспериментальным, но экспериментальные кодеки не включены

так я добавил -strict -2 в команду т.е.,

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4 

Сейчас он работает нормально.

+2

Отсутствует полный, неразрезанный вывод консоли ffmpeg. Пожалуйста, всегда включайте это, когда спрашиваете. Благодарю. – slhck

+1

Откуда вы взяли -strict 2? Просто интересно, как это не в документах: https://ffmpeg.org/ffmpeg.html – StackOverflowed

+0

Его качество после установки ffmpeg, в справке ffmpeg вы можете найти эту опцию – Kalai

ответ

314

У вас, вероятно, нет ключевого кадра на отметке 3 секунды. Поскольку не-ключевые кадры кодируют отличия от других фреймов, им требуются все данные, начиная с предыдущего ключевого кадра.

С контейнером mp4 можно вырезать без ключевого кадра без повторного кодирования с использованием списка редактирования. Другими словами, если ближайший ключевой кадр до 3 с равен 0, то он будет копировать видео, начинающееся с 0 секунд, и использовать список редактирования, чтобы сообщить игроку, чтобы он начал играть в течение 3 секунд.

Если вы используете latest ffmpeg от git master он сделает это, используя список редактирования, когда вызывается с помощью команды, которую вы предоставили. Если это не работает для вас, вы, вероятно, используете более старую версию ffmpeg, или ваш плеер не поддерживает списки редактирования. Некоторые игроки проигнорируют список редактирования и всегда воспроизводят все носители в файле от начала и до конца.

Если вы хотите точно точно начать с не-ключевого кадра и хотите, чтобы он воспроизводился, начиная с нужной точки на проигрывателе, который не поддерживает списки редактирования, или хотите убедиться, что часть разреза фактически не находится на выходе файл (например, если он содержит конфиденциальную информацию), то вы можете сделать это путем повторного кодирования, чтобы был ключевой кадр точно в желаемое время начала. Повторное кодирование является значением по умолчанию, если вы не указали copy. Например:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4 

Когда повторное кодирование вы можете также включить дополнительные качества, связанные параметры или конкретный AAC кодер. Подробнее см. Ffmpeg's x264 Encoding Guide для видео и AAC Encoding Guide для аудио.

Кроме того, параметр -t указывает продолжительность, а не время окончания. Вышеуказанная команда будет кодировать 8 с видео, начиная с 3 секунд. Для начала с 3 секунд и завершения в 8 с используйте -t 5. Если вы используете текущую версию ffmpeg, вы также можете заменить -t на -to в приведенной выше команде для завершения в указанное время.

+2

Есть ли ярлык для указания до конца видео? –

+6

@JikkuJose: опустить '-t' /' -to' и его аргумент для продолжения до конца. – mark4o

+10

Примечание: перед 'входным файлом (прежде чем' -i') быстрее вывести '-ss' перед входным файлом, так как ffmpeg будет пропускать непосредственно в местоположение. Тем не менее, это также установит время «нуль» в это место, что означает, что '-to' будет указывать на неправильное время. Источник: https://trac.ffmpeg.org/wiki/Seeking –

24
ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4 

Капля все, кроме от вторых 3 до второго 8.

+0

Не работает для меня. Выводит все видео – chefarov

+1

Я получаю первые 8 секунд с этим, первые 3 секунды заморожены на первом кадре. Исправлено путем объединения фильтра 'setpts = PTS-STARTPTS' после фильтра обрезки. – jiggunjer

+0

Это говорит: «Кодер« aac »является экспериментальным, но экспериментальные кодеки не включены, добавьте« -strict -2 », если вы хотите его использовать». Добавление -strict -2 не помогает. Результатом является файл с нулевой длиной. – Ivan

57
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

Используйте -c скопировать для убеждается в мгновенно. В этом случае ffmpeg не будет перекодировать видео, просто вырезается до соответствующего размера.

+2

-c копия фантастическая для скорости! –

+1

-c копия отлично работает, но только если я удаляю -async 1 – dorien

+0

Это заканчивается неудачей при записи из-за недопустимых заголовков в случае разных входных и выходных контейнеров, например. .mkv и выход .mp4. –

45

Попробуйте использовать это. Это самый быстрый и лучший FFmpeg-полосная меня понять это:

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4 

Эта команда обрезает видео за считанные секунды!

Я объяснил это на своем блоге here:

-i: Это определяет входной файл. В этом случае это (input.mp4).
-ss: Используется с -i, это ищет входной файл (input.mp4) в положение.
00:01:00: Это время, когда начнется ваше обрезанное видео.
-to: Указывает продолжительность с начала (00:01:40) до конца (00:02:12).
00:02:00: Это время, когда ваше обрезанное видео закончится.
-c copy: Это возможность обрезать через копию потока. (NB: Очень быстро)

Формат времени является: ччем: мм: сс

Пожалуйста, обратите внимание, что в настоящее время весьма upvoted ответа устарел и облицовка будет крайне медленной. Для получения дополнительной информации посмотрите официальный ffmpeg article.

+1

обработал мой 45-минутный 720p-файл в 3s. Это должен быть правильный ответ. –

+1

Спасибо !!! Это должно быть –

+1

Возможно, вы все еще страдаете от недостатка ключевых кадров. Я принял ваш подход к резке, затем перекодировал в соответствии с принятым ответом, чтобы убедиться, что я минимизировал время, необходимое мне для повторного кодирования. – pelson

-2

вы можете попробовать следующий код для обрезки видео

инициализации

private void loadFFMpegBinary() { 
    try { 
     if (ffmpeg == null) { 
      Log.d(TAG, "ffmpeg : era nulo"); 
      ffmpeg = FFmpeg.getInstance(this); 
     } 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 
      @Override 
      public void onFailure() { 
       //showUnsupportedExceptionDialog; 
      } 

      @Override 
      public void onSuccess() { 
       Log.d(TAG, "ffmpeg : correct Loaded"); 
      } 
     }); 
    } catch (FFmpegNotSupportedException e) { 
     // showUnsupportedExceptionDialog; 
    } catch (Exception e) { 
     Log.d(TAG, "EXception no controlada : " + e); 
    } 
} 

вызова ниже метод для преобразования/обрезки файла

р ath: оригинал видео дорожка с хранения

dest.getAbsolutePath(): пункт назначения, где вы хотите сохранить I реж

startMs: начать видео мс

endMs: конец видео мс

exeFFmpegBinary("-i " + path + " -ss " + startMs/1000 + " -to " + endMs/1000 + " -c copy " + dest.getAbsolutePath()); 

называется метод

private void exeFFmpegBinary(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); 
      } 

      @Override 
      public void onProgress(String s) { 
       Log.d(TAG, "Started command : ffmpeg " + command); 
      } 

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

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

Я ПРИНИМАЮ СВОИ ГОЛОСОВАТЬ, НО ВЫ ДОЛЖНЫ ДАВАТЬ ПРИЧИНУ, ЧТОБЫ ПОКАЗАТЬ ГОЛОСУ –