代码之家  ›  专栏  ›  技术社区  ›  Marvin von Rappard

剪切多个视频的结尾

  •  6
  • Marvin von Rappard  · 技术社区  · 6 年前

    我需要一个脚本来切断多个视频的最后6秒。这些视频都有不同的长度。

    我在网上找不到任何有用的东西。

    有人知道怎么做吗? thx公司

    3 回复  |  直到 6 年前
        1
  •  8
  •   llogan    6 年前

    使用 ffprobe 要获取输入持续时间, bc 计算所需的输出持续时间,以及 ffmpeg 进行切割。此方法不需要输入包含音频流,但需要两个附加工具( ffprobe公司 卑诗省 )而不仅仅是 ffmpeg

    没有提到您首选的脚本语言,所以我假设bash会这样做。按要求以脚本形式:

    #!/bin/bash
    for f in *.mp4; do
    cut_duration=6
    input_duration=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$f")
    output_duration=$(bc <<< "$input_duration"-"$cut_duration")
      ffmpeg -i "$f" -map 0 -c copy -t "$output_duration" output/"$f"
    done
    

    或作为单行:

    for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -t "$(bc <<< "$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$f")"-6)" output/"$f"; done
    
        2
  •  3
  •   Maksim    4 年前

    对于windows批处理文件,几乎不可能做到这一点。以下是Powershell的脚本:

    $ListsFiles = Get-ChildItem "D:\VIDEOS\1\" -Filter *.avi;    
    
    Foreach ($file in $ListsFiles){
        $input_d = [math]::round((ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $file.Fullname));
    
        $output_duration=$input_d-5;
    
        $ArgumentList = '-i "{0}" -map 0 -c copy -t {1} "D:\VIDEOS\1\output\{2}"' -f $file.Fullname, $output_duration, $file;
        Write-Host -ForegroundColor Green -Object $ArgumentList;   
        Start-Process -FilePath ffmpeg -ArgumentList $ArgumentList -Wait -NoNewWindow;    
    }
    
        3
  •  1
  •   Erman Kadir Kahraman glglgl    4 年前

    要做到这一点,你必须采取迂回的方式,

    ffmpeg -i file.mp4 -itsoffset 6 \
           -i file.mp4 -c copy -map 0:a:0 -map 1 \
           -shortest -f nut - | \
    ffmpeg -y -i - -c copy -map 0 -map -0:0 -ss 6 trimmed.mp4
    

    这将运行由管道连接的两个ffmpeg进程,尽管您可以通过依次运行两个ffmpeg命令来实现。

    第一个命令接收文件两次,并将第二个输入的时间戳偏移6秒。它映射来自第一个输入的音频流和来自第二个输入的所有流。第一个命令的输出被设置为以最短的流终止,该流是来自第一个输入的音频流。副作用是第二次输入的最后6秒被切断。在第二个过程中,除了第一个音频流之外的所有流都被复制到一个新的容器中。


    如果不确定文件是否有音频,可以替换 -map 0:a:0 具有 -map 0:0