【问题标题】:Speed up part of video using ffmpeg使用 ffmpeg 加速部分视频
【发布时间】:2015-03-20 09:48:54
【问题描述】:

我正在录制截屏视频和部分录制的截屏视频,我想使用 ffmpeg 等命令行工具加快速度。

我知道可以使用 ffmpeg 通过 (source) 之类的命令来加速整个视频

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

是否可以仅在视频的某些区域应用加速。例如。从 10 秒到 15 秒,再从 50 秒到 60 秒?使用slowmoVideo 程序似乎可以实现类似的操作。

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    示例:我想加快视频的前 4 秒。

    剪辑视频

    ffmpeg -i input.mp4 -t 4 slow.mp4
    
    ffmpeg -i input.mp4 -ss 00:00:04 part-2.mp4
    

    加快零件速度

    ffmpeg -i slow.mp4 -filter:v "setpts=0.5*PTS" part-1.mp4
    

    连接

    ffmpeg -f concat -i <(for f in ./part-*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
    

    来自 ffmpeg 文档的资源:

    【讨论】:

    • 请详细说明前两个命令的作用,在没有任何确认的情况下使用命令会令人困惑。
    • 前 2 个命令将您的视频剪切成 2 个视频。 slow.mp4 将是您在 00:00:00 和 00:00:04(4 秒)之间的原始视频。 “-t”选项适用于您编辑的视频的持续时间。 part-2.mp4 将是您在 00:00:04 到视频结尾之间的原始视频,“-ss”是“开始时间”。您可以通过命令“ffmpeg --help”使用 ffmpeg 的帮助来查看您可以执行的所有操作。我把你需要的所有资源都放在了第一篇文章的末尾。
    • Ismail 感谢您的回复,我在 android 开发中使用 ffmpeg。您能否解释其中的第三个命令。因为它不工作并抛出异常。
    • 考虑到您已将视频分成两部分。而且您仍然想加快第一部分的速度。第三个命令加速第一部分(太慢的部分,所以如果你按照我的例子,它被命名为 slow.mp4 )使用 ffmpeg 过滤器使其速度提高 2 倍。该过滤器通过更改每个视频帧的呈现时间戳 (PTS) 来工作。您可以阅读有关 here 的 ffmpeg 文档。
    【解决方案2】:

    对于音频和视频:

    总之,这(仅作为示例)对我来说效果很好(它制作了从 00:00:12.5 开始的 4 秒片段的慢动作,同时转码为 mp4):

    ffmpeg -loglevel error \
      -ss 12.5 -t 4.0 \
      -i orig.MOV \
      -filter_complex \
        "[0:v]setpts=8.0*PTS[v];[0:a]asetrate=5512.5,aresample=44100[a]" \
      -map "[v]" -map "[a]" \
      -r 30 -strict -2 \
      out.mp4
    

    我发现组合 asetrate=...,aresample=...atempo 效果更好,尤其是因为后者仅限于 [0.5;2.0]。还要注意最后的-r 30,它将帧速率设置为 30fps。在我处理的一些视频中,出于某种奇怪的原因,如果没有它,结果将是一个以 2400fps 的速度运行的巨大文件!它还确保我的剪辑的所有片段都处于相同的帧速率(见下文)。

    其他参数和往常一样:-ss 设置剪辑的开始;因为它在-i 之前,所以它工作得很快,而且也正确(在原始的时间线中)。 -t 是持续时间,也在原始时间线中。

    背景和细节:

    好的,我有一个类似的问题,因为 Google Photos、iPhoto 等似乎无法识别/理解我来自新 iPhone7+ 的漂亮慢动作视频(我只编辑了一部分以成为慢动作) .

    在搞砸了一点之后(在更多 SO 问题和漂亮的 ffmpeg docs 的帮助下),我将其归结为以下 bash 脚本。它比原来的问题多一点,因为我还想从.MOV 转换为.mp4,并在开始/结束时修剪一些时间。有了这个,我可以将 iPhone 上的一大堆.MOV 文件批量剪辑和处理成我可以上传、分享或播放的剪辑。命令行之一的示例:

    ./slo-part.sh IMG_0067.MOV clip_0067.mp4 14.0 23.0 25.5 27.67

    便捷脚本:

    这是slo-part.sh 脚本:

    #!/usr/bin/env bash
    
    # Slow down a portion of a movie clip
    
    _usage="Usage : $0 file_in file_out start start_slo stop_slo stop"
    
    function log {
      local msg=$1
      local t=$(date +"%Y-%m-%d %H:%M:%S")
      echo "$t $msg"
    }
    
    function calc {
      printf "%g" $(bc<<<"$1")
    }
    
    IN=$1
    OUT=$2
    A=$3
    B=$4
    C=$5
    D=$6
    
    : ${IN:?$_usage}
    : ${OUT:?$_usage}
    : ${A:?$_usage}
    : ${B:?$_usage}
    : ${C:?$_usage}
    : ${D:?$_usage}
    
    RATE=30
    
    AB=$(calc "$B-$A")
    BC=$(calc "$C-$B")
    CD=$(calc "$D-$C")
    
    # scratch dir
    scratch=tmp.$$
    mkdir -p $scratch
    
    if (( $(bc <<< "$AB > 0.0") )); then
      log "Extracting part-1: from $A to $B ($AB)"
      ffmpeg -loglevel error -ss $A -t $AB -i $IN -r $RATE -strict -2 $scratch/part-1.mp4
    fi
    
    if (( $(bc <<< "$BC > 0.0") )); then
      log "Extracting part-2: from $B to $C ($BC) and slow it down 8x"
      ffmpeg -loglevel error -ss $B -t $BC -i $IN -filter_complex "[0:v]setpts=8.0*PTS[v];[0:a]asetrate=5512.5,aresample=44100[a]" -map "[v]" -map "[a]" -r $RATE -strict -2 $scratch/part-2.mp4
    fi
    
    if (( $(bc <<< "$CD > 0.0") )); then
      log "Extracting part-3: from $C to $D ($CD)"
      ffmpeg -loglevel error -ss $C -t $CD -i $IN -r $RATE -strict -2 $scratch/part-3.mp4
    fi
    
    log "Concat all parts, output to $OUT"
    ffmpeg -loglevel error -y -f concat -i <(for f in $scratch/part-*.mp4; do echo "file '$PWD/$f'"; done) -c copy $OUT
    
    rm -rf $scratch
    

    【讨论】:

    • 您如何得出 asetrate 和 aresample 选项的数字?这些固定数字是否需要根据视频加速的时间进行相应更改?谢谢
    • @Harry 根据setpts=8.0*PTS[v],这看起来像是在减慢 8 倍 - 这将每个视频帧的呈现时间设置为其原始帧的 8 倍。 44100 (aresample) 是以 Hz 为单位的音频采样率,5512.5 (asetrate) 是 44100/8。我想 44100 可以保持原样(这是一个常见的采样率,以及 48KHz、96KHz、22.5KHz 等)。然后用44100 / desiredSlowdown 计算asetrate,并将8.0 替换为你想要的Slowdown 值。
    猜你喜欢
    • 2013-09-24
    • 2022-12-11
    • 2013-08-19
    • 2011-07-11
    • 2017-11-14
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多