
我的 GoPro Hero10 有一段 30 秒 240 fps 的影片。現在我想用它創建一個“慢動作”,速度應該是 1/4。所以輸出將為 2 分鐘 @ 60fps。 (聲音也應該被轉換 - 我知道這會使音調變低,沒關係)
經過一番研究,我想出了這個:
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" output-0.25.mp4
但檢查後ffmpeg -i output-0.25.mp4
我發現,fps 仍然是 240(雖然長度正確,但它是慢動作,聽起來不錯,但文件大小相當大,並且 - 正如所說 - 在目標設備上播放的 fps 太多)。
所以我再次搜索並想出添加,-r 60
所以我最終得到:
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=4.0*PTS[v];[0:a]atempo=0.5,atempo=0.5[a]" -map "[v]" -map "[a]" -r 60 output-0.25.mp4
現在檢查也顯示了正確的 fps,但它似乎「不太慢動作」並且聲音沙啞。
我需要做什麼?
我想要的只是“獲取所有原始幀並將其填充到一個文件中,該文件以‘正常速度’播放”。
答案1
有 setpts 模式和轉換為原始模式。
使用 setpts 會是這樣的:
ffmpeg input.mkv -map_metadata -1 -filter_complex "[0:v:0]setpts=PTS*4[v];[0:a:0]atempo=0.5,atempo=0.5[a]" -map [v] -map [a] -c:v libx265 -vtag hvc1 -c:a libmp3lame -shortest "output.mp4"
- 使用可以減少檔案大小的良好編解碼器,例如 H.265 (libx265)
- 我懷疑,因為視訊元資料在原始影片上顯示為 240 FPS,且元資料在轉換過程中未刪除,所以輸出影片也顯示為 240 FPS,但實際上是 60 FPS。 -map_metadata -1 選項將刪除元資料。
使用轉換為原始模式將是這樣的:
在此範例中,我假設原始影片是 H.264 編解碼器:
ffmpeg -i input.mp4 -map 0:v -c:v copy -bsf:v h264_mp4toannexb raw.h264
ffmpeg -fflags +genpts -r 60 -i "raw.h264" -i input.mp4 -map 0:v -map 1:a -filter:a "atempo=0.5,atempo=0.5" -c:v libx265 -vtag hvc1 "output.mp4"
在第一個命令中,原始視頻轉換為原始視頻,在第二個命令中,產生新的時間戳,使視頻播放速度減慢4 倍,將原始視頻中的音頻添加到原始視頻中,將音頻速度降低4 倍,最後轉換原始影片影片轉換為 H.265 以減少檔案大小。
答案2
這是一個無需重新編碼視訊的解決方案:
- 將視訊串流提取為 HEVC (H.265)「原始」視訊串流:
ffmpeg -y -an -i testfile.mp4 -c copy input_video.h265
- 使用比特流過濾器將其修改
tick_rate
為60
“每秒滴答數”hevc_metadata
:
ffmpeg -y -i input_video.h265 -c copy -bsf:v hevc_metadata=tick_rate=60:num_ticks_poc_diff_one=1 input_video2.h265
input_video2.h265
與「放慢速度」的音訊合併:
ffmpeg -y -i input_video2.h265 -vn -i testfile.mp4 -map_metadata -1 -af "atempo=0.5,atempo=0.5" -c:v copy -vtag hvc1 -c:a aac -shortest "output.mp4"
「放慢速度」的音訊聽起來很奇怪,但我找不到比使用atempo
兩次更好的解決方案。