FFmpeg - Couper début et fin des montants fixes

5

Editeur vidéo professionnel ici qui n'est pas qualifié à FFmpeg, alors supportez-moi. J'ai un grand lot de vidéos, toutes de longueurs différentes, et j'aimerais les couper de 10 secondes au début ET de 10 secondes à la fin.

Je sais qu'il existe une commande "-sseof" qui recherche un code temporel basé sur la fin de la vidéo. Cependant, je ne peux que l'obtenir pour me donner la partie à la fin, pas la partie AVANT l'heure spécifiée. Par exemple, cela ne me donne que les 10 dernières secondes:

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

Je veux l'exact opposé, tout jusqu'à les 10 dernières secondes.

Et j'aimerais vraiment le combiner avec une assiette dès le début. Ma formule idéale ressemblerait à ceci:

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

Mais ça ne marche pas. Aucune suggestion? Merci!

MODIFIER:

La solution suggérée par Mulvya a fonctionné pour moi! Voici la formule que j'ai utilisée pour exécuter le script sur un dossier entier, coupant à 4,25 secondes du début et à 17,8 secondes de la fin de chaque clip (ces valeurs doivent être modifiées à plusieurs endroits chacune, mais cela fonctionne).

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

Merci beaucoup!

Matthew Belinkie
la source

Réponses:

7

Il y a une manière sensée de faire ceci et une manière folle. La méthode la plus sensée consiste à analyser préalablement la durée dans une commande distincte et à définir votre commande de découpage réelle à l'aide de ces informations.

Commande de sonde:

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

Cela produira une sortie sur une seule ligne:

194.834000

Donc, votre commande est maintenant

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

t = total duration - 20 sec


La manière folle est plus lente, mais une commande.

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
Gyan
la source
+1 pour avoir montré comment obtenir une longueur sans grep et sed
MrFregg
C'est bien! Les deux versions fonctionnent-elles avec des lots? Il semble que la version en 2 étapes ne fonctionne que si vous ne faites qu'une vidéo à la fois.
Matthew Belinkie
Si les deux commandes doivent être exécutées pour chaque fichier, elles peuvent être utilisées en mode batch. Sur quel OS êtes-vous?
Gyan
Je suis sur un Mac, en utilisant Terminal. J'ai essayé d'exécuter le script insensé mais je reçois une tonne d'erreurs comme celle-ci:frame= 223 fps= 27 q=29.0 size= 457kB time=00:00:15.48 bitrate= 241.8kbits/[Parsed_overlay_1 @ 0x7fed78c088c0] [framesync @ 0x7fed78c089a8] Buffer queue overflow, dropping. Last message repeated 22 times frame= 246 fps= 29 q=29.0 size= 472kB time=00:00:16.25 bitrate= 237.9kbits/[Parsed_overlay_1 @ 0x7fed78c088c0] [framesync @ 0x7fed78c089a8] Buffer queue overflow, dropping. Last message repeated 18 times
Matthew Belinkie
Essayez édité cmd. Tampon ajouté.
Gyan
0

Les deux réponses précédentes ont servi de réponse au script Windows CMD ici. C'est la révision 1 et suppose ce qui suit:

  1. CONVERT.CMD (contenu ci-dessous) réside dans le même répertoire que les fichiers.
  2. Les variables au début du script sont correctes (type de fichier et chemin)

Cela a été testé fonctionne comme prévu. Créé sur 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

IMAGE - Avant d'exécuter le script.

IMAGE - Après l'exécution du script.

Chris Hamner
la source
0

Je voulais juste remercier Chris Hammer, c’est exactement ce que je cherchais, mais je ne sais pas pourquoi vous avez limité l’apostrophe. J'ai depuis fait un changement pour permettre '. C'EST ICI. Fondamentalement, je viens de changer le 'en un;

  @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%"
aevans0001
la source