最接近的KeyFrame時間
取得 1.mp4 1:23 (1分23秒)最接近的KeyFrame時間
ffprobe.exe -v error -select_streams v:0
-show_entries "frame=best_effort_timestamp_time"
-of "csv=p=0" -sexagesimal
-read_intervals 1:23%+#1 1.mp4
以上這四行是同一行,
要在cmd窗口執行。
如果要在bat執行,必須多加一個 %
改成 1:23%%+#1
選擇mp4裡的幾段時間範圍,另存成一個mp4
(以關鍵幀剪輯,所以時間不會很準確)
需要ffmpeg 和 ffprobe
執行方法:
把mp4拖進bat圖示
如果拖進之後沒反應,先點兩下打開bat,
然後再把mp4拖進cmd窗口
檔名:
支持unicode檔名(藉由8.3檔名來實現)
時間:
從「起點」往前找「最近的KeyFrame」
如果「起點」是0:0:0 ,可能會往後找
「終點」必須大於「起點」
如果終點沒有指定,就是指:起點開始的以後全部
會有錯誤訊息:
Non-monotonous DTS in output stream 0:1; previous: 7850002, current: 7847497;
changing to 7850003. This may result in incorrect timestamps in the output file.
@echo off
set "aa=.;%path%"
for %%a in (ffmpeg.exe ffprobe.exe) do (
if "%%~$aa:a" == "" echo need %%a & pause & exit /b
)
::=====================
set mp4=
if /i "%~x1" == ".mp4" set "mp4=%~1"
if "%mp4%" == "" echo drag mp4 to here & set /p mp4=
set "mp4=%mp4:"=%"
if not exist "%mp4%" echo "%mp4%" not exist & pause & exit /b
for %%a in ("%mp4%") do (
set "mp4=%%~sa"
set "outMp4=%%~na_out%%~xa"
)
if exist "%outMp4%" echo "%outMp4%" exist & pause & exit /b
::=========================
set timeRange=
echo input startTime endTime startTime endTime
echo for example:
echo 0:10 0:20 1:3:5 1:3:30
set /p timeRange=
if "%timeRange%" == "" echo no startTime exist & pause & exit /b
::===================
set txt=concat.txt
set ffCmd=ffprobe.exe -select_streams v:0
set ffCmd=%ffCmd% -show_entries "frame=best_effort_timestamp_time"
set ffCmd=%ffCmd% -of "csv=p=0" -sexagesimal
cd.> %txt%
call :aa %timeRange%
ffmpeg -n -safe 0 -f concat -i %txt% -c copy "%outMp4%"
goto :eof
::=========================
:aa
if "%~1" == "" goto :eof
set "mp4_txt=%mp4:\=/%"
set "mp4_txt=%mp4_txt:'='\''%"
for %%a in ("%mp4_txt%") do echo file '%%~a' >> %txt%
for /f %%a in ('%ffCmd% -read_intervals %~1%%+#1 "%mp4%" ') do (
echo inpoint %%a >> %txt%
)
if not "%~2" == "" echo outpoint %~2 >> %txt%
shift & shift
goto aa
沒有留言:
張貼留言