FFmpeg - apara início e termina quantias fixas

4

Editor de vídeo profissional aqui que não é habilidoso no FFmpeg, então tenha paciência comigo. Eu tenho um grande lote de vídeos, todos de diferentes comprimentos, e eu gostaria de cortá-los em 10 segundos no começo E 10 segundos no final.

Eu sei que existe um comando "-sseof" que procura um timecode baseado no final do vídeo. No entanto, eu só posso obtê-lo para me dar a parte no final, não a parte antes do tempo especificado. Por exemplo, isso só me dá os últimos 10 segundos:

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

Eu quero exatamente o oposto, tudo nos últimos 10 segundos.

E eu realmente gostaria de combiná-lo com um corte desde o começo. Minha fórmula ideal ficaria assim:

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

Mas isso não funciona. Alguma sugestão? Obrigado!

EDITAR:

A solução sugerida por Mulvya funcionou para mim! Aqui está a fórmula que usei para executar o script em uma pasta inteira, cortando 4,25 segundos desde o início e 17,8 segundos do final de cada clipe (esses valores precisam ser alterados em vários lugares cada um, mas funciona).

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

Muito obrigado!

    
por Matthew Belinkie 29.11.2016 / 16:14

3 respostas

5

Existe uma maneira sensata de fazer isso e de maneira insana. A maneira sã é testar a duração em um comando separado antecipadamente e modelar seu comando de ajuste real usando essa informação.

Comando do probe:

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

Isso produzirá uma saída de linha única:

194.834000

Então, seu comando agora é

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

em que t = total duration - 20 sec

O caminho insano é mais lento, mas um comando.

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
    
por 29.11.2016 / 16:48
0

As duas respostas anteriores serviram como resposta para o script do Windows CMD aqui. É a revisão 1 e assume o seguinte:

  1. CONVERT.CMD (conteúdo aqui) vive no diretório exato como os arquivos.
  2. As variáveis no início do script estão corretas (ou seja, tipo de arquivo e caminho)

Isso foi testado funcionando como pretendido. Criado no 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

PICTURE - Antes de executar o script.

PICTURE - Depois de executar o script.

    
por 13.03.2017 / 03:53
0

Só queria agradecer a Chris Hammer, isso é exatamente o que eu estava procurando, mas não sei por que você restringiu o apóstrofo. Desde então, fiz uma alteração para permitir '. AQUI ESTÁ. Basicamente eu mudei o 'para um'.

  @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%"
    
por 06.10.2018 / 00:39