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
どうもありがとう!
これには正気な方法と正気でない方法があります。正気な方法は、事前に別のコマンドで期間を調べ、その情報を使用して実際のトリムコマンドを形成することです。
プローブコマンド:
ffprobe -v 0 -show_entries format=duration -of compact=p=0:nk=1 in.mp4
これにより、1行の出力が生成されます。
194.834000
だから、あなたのコマンドは今です
ffmpeg -ss 10 -t 174.834 -i test.mp4 outputB.mp4
どこ t = total duration - 20 sec
非常識な方法は遅いですが、1つのコマンドです。
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
クリス・ハマーに感謝します。これはまさに私が探していたものですが、なぜアポストロフィを制限したのかわかりません。それ以来、 'を許可するように変更しました。ここにあります。基本的に私は 'を;に変更しました。
@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%"
前の2つの回答は、ここでWindowsCMDスクリプトに対する回答として機能しました。これはリビジョン1であり、次のことを前提としています。
これは、意図したとおりに機能することがテストされています。 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