4

Здесь профессиональный видеоредактор, не имеющий опыта в FFmpeg, так что терпите меня. У меня есть большая партия видео различной длины, и я хотел бы обрезать их на 10 секунд в начале и на 10 секунд в конце.

Я знаю, что есть команда "-sseof", которая ищет временной код, основанный на конце видео. Однако я могу получить только часть в конце, а не часть ДО указанного времени. Например, это просто дает мне последние 10 секунд:

ffmpeg -sseof -10 -i test.mp4 outputB.mp4

Я хочу прямо противоположное, все до последних 10 секунд.

И я бы очень хотел совместить это с отделкой с самого начала. Моя идеальная формула будет выглядеть так:

ffmpeg -i test.mp4 -ss 10 -to -sseof -10 output.mp4

Но это не работает. Какие-либо предложения? Спасибо!

РЕДАКТИРОВАТЬ:

Решение, предложенное Mulvya, сработало для меня! Вот формула, которую я использовал для запуска сценария для всей папки, вырезая 4,25 секунды с начала и 17,8 секунды с конца каждого клипа (эти значения нужно менять в нескольких местах каждый, но это работает).

for file in *.mp4; do ffmpeg -i $file -filter_complex "[0]split[s1][s2]; [s1]trim=4.25,setpts=PTS-STARTPTS,fifo[bv]; [s2]trim=4.25,setpts=(PTS-STARTPTS)+17.8/TB,fifo[v]; [bv][v]overlay=shortest=1,trim=17.8,setpts=PTS-STARTPTS[fv]; [0]volume=0[b];[0]adelay=17800|17800[a]; [b][a]amix=duration=first,volume=2,atrim=22.05,asetpts=PTS-STARTPTS[fa]" -map "[fv]" -map "[fa]" "${file%.mp4}-trimmed.mp4"; done

Большое спасибо!

3 ответа3

6

Есть разумный способ сделать это и безумный способ. Разумным способом является предварительное определение длительности в отдельной команде и формирование вашей фактической команды обрезки с использованием этой информации.

Зонд команды:

ffprobe -v 0 -show_entries format=duration -of compact=p=0:nk=1 in.mp4

Это приведет к выводу в одну строку:

194.834000

Итак, ваша команда сейчас

ffmpeg -ss 10 -t 174.834 -i test.mp4 outputB.mp4

где t = total duration - 20 sec


Безумный путь медленнее, но одна команда.

ffmpeg -i in.mp4 -filter_complex
       "[0]split[s1][s2];
        [s1]trim=10,setpts=PTS-STARTPTS,fifo[bv];
        [s2]trim=10,setpts=(PTS-STARTPTS)+10/TB,fifo[v];
        [bv][v]overlay=shortest=1,trim=10,setpts=PTS-STARTPTS[fv];
        [0]volume=0[b];[0]adelay=10000|10000[a];
        [b][a]amix=duration=first,volume=2,atrim=20,asetpts=PTS-STARTPTS[fa]"
-map "[fv]" -map "[fa]" trimmed.mp4
0

Просто хотел сказать спасибо Крису Хаммеру, это именно то, что я искал, однако я не знаю, почему вы ограничили апостроф. С тех пор я сделал изменения, чтобы позволить ». ВОТ. В основном я просто изменил 'на;;

  @echo on

@REM This basic CMD file is designed to live within the exact directory in which
@REM the files live.  This is for simplicity.  It can be edited to do more.
@REM  5 and 7

@REM SET MISC. VARIABLES USED IN SCRIPT
@REM
set _vFileType=mkv
set _vTrimOffFront=5
set _vTrimOffRear=7
set _ffmpegPath=D:\Torrents\Video


@REM CREATE EDITED DIRECTORY IF IT DOESN'T EXIST
@REM  - Used to copy edited files using existing file names if user chooses to do so
@REM
if not exist .\EDITED mkdir .\"EDITED"

@REM DETECT PROBLEMS
@REM
dir /b | findstr ";"
if %ERRORLEVEL% EQU 0 ( 
cls
echo !!! ERROR - FOUND APOSTROPHE !!!
echo.
echo     - Please remove characters from filename^(s^).
echo.
dir /b | findstr ";"
pause
exit
)


@REM FOR LOOP TO EDIT FILES AND DROP IN TO .\EDITED FOLDER
@REM
for /f "delims=" %%g in ('dir ^/b *.^%_vFileType%') do call :proc_ProcessFiles "%%g"

Pause
EXIT


@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem   *******************************************************************************************************
@rem   *******************************************************************************************************
@rem   *******************************************************************************************************
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE



:proc_ProcessFiles
set _vFilenameTemp=%1

@REM FOR LOOP TO DETERMINE DURATION OF RESPECTIVE FILE AND THEN PROCESS SAID FILE
@REM   Note: Output of FFPROBE gives decimal number for length of video, however this can't be used in CMD files--so, only the integer is saved.
@REM         - If 1525.12524 is returned, then only 1525 is assigned to the variable.
@REM
for /f "delims=. tokens=1" %%h in ('%_ffmpegPath%\ffprobe.exe -v 0 -show_entries format^=duration -of compact^=p^=0^:nk^=1 %_vFilenameTemp%') do set _vFileLengthTemp=%%h


@REM SET THE AMOUNT TO TRIM OFF OF THE END OF THE FILE. DETERMINED BY USING VARIABLES SPECIFIED AT BEGINNING OF FILE. 
@REM
:: echo %_vFilenameTemp:~1,-1%
:: echo %_vFileLengthTemp%
set /a _vFileLengthTemp="%_vFileLengthTemp%-%_vTrimOffRear%-%_vTrimOffFront%"
:: echo %_vFileLengthTemp%


@REM DO CONVERSION OF FILE USING VARIABLES CREATED ABOVE
@REM
%_ffmpegPath%\ffmpeg.exe -ss %_vTrimOffFront% -t %_vFileLengthTemp% -i %_vFilenameTemp% -vcodec copy -acodec copy ".\EDITED\EDITED-%_vFilenameTemp:~1,-1%"
0

Два предыдущих ответа послужили ответом на сценарий Windows CMD. Это ревизия 1 и предполагает следующее:

  1. CONVERT.CMD (содержание в данном документе) находится в том же каталоге, что и файлы.
  2. Переменные в начале скрипта являются правильными (а именно тип файла и путь)

Это было проверено, работает как задумано. Создано в Windows 10.

@echo on

@REM This basic CMD file is designed to live within the exact directory in which
@REM the files live.  This is for simplicity.  It can be edited to do more.
@REM

@REM SET MISC. VARIABLES USED IN SCRIPT
@REM
set _vFileType=mp4
set _vTrimOffFront=6
set _vTrimOffRear=6
set _ffmpegPath=C:\ffmpeg-20170308-3016e91-win64-static\bin


@REM CREATE EDITED DIRECTORY IF IT DOESN'T EXIST
@REM  - Used to copy edited files using existing file names if user chooses to do so
@REM
if not exist .\EDITED mkdir .\EDITED

@REM DETECT PROBLEMS
@REM
dir /b | findstr "'"
if %ERRORLEVEL% EQU 0 ( 
cls
echo !!! ERROR - FOUND APOSTROPHE !!!
echo.
echo     - Please remove characters from filename^(s^).
echo.
dir /b | findstr "'"
pause
exit
)


@REM FOR LOOP TO EDIT FILES AND DROP IN TO .\EDITED FOLDER
@REM
for /f "delims=" %%g in ('dir ^/b *.^%_vFileType%') do call :proc_ProcessFiles "%%g"


EXIT


@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem   *******************************************************************************************************
@rem   *******************************************************************************************************
@rem   *******************************************************************************************************
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE
@rem    THIS IS THE END OF THE SCRIPT!  ANYTHING BELOW THIS IS A PROCEDURE USED IN THE SCRIPT ABOVE



:proc_ProcessFiles
set _vFilenameTemp=%1

@REM FOR LOOP TO DETERMINE DURATION OF RESPECTIVE FILE AND THEN PROCESS SAID FILE
@REM   Note: Output of FFPROBE gives decimal number for length of video, however this can't be used in CMD files--so, only the integer is saved.
@REM         - If 1525.12524 is returned, then only 1525 is assigned to the variable.
@REM
for /f "delims=. tokens=1" %%h in ('%_ffmpegPath%\ffprobe.exe -v 0 -show_entries format^=duration -of compact^=p^=0^:nk^=1 %_vFilenameTemp%') do set _vFileLengthTemp=%%h


@REM SET THE AMOUNT TO TRIM OFF OF THE END OF THE FILE. DETERMINED BY USING VARIABLES SPECIFIED AT BEGINNING OF FILE. 
@REM
:: echo %_vFilenameTemp:~1,-1%
:: echo %_vFileLengthTemp%
set /a _vFileLengthTemp="%_vFileLengthTemp%-%_vTrimOffRear%-%_vTrimOffFront%"
:: echo %_vFileLengthTemp%


@REM DO CONVERSION OF FILE USING VARIABLES CREATED ABOVE
@REM
%_ffmpegPath%\ffmpeg.exe -ss %_vTrimOffFront% -t %_vFileLengthTemp% -i %_vFilenameTemp% -vcodec copy -acodec copy ".\EDITED\EDITED-%_vFilenameTemp:~1,-1%"

GOTO:EOF

КАРТИНКА - Перед запуском скрипта.

КАРТИНКА - После запуска скрипта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .