如何分割视频文件和相应的字幕文件?

如何分割视频文件和相应的字幕文件?

我有一个大视频文件(large.mp4)和一个相应的字幕文件(large.srt)。

将两个文件拆分成的最佳方法是什么n相等的部分?

这将产生large-1.mp4,... ,和,... ,。并且所有这些文件的大小都将相同(最后一个文件除外)。large-n.mp4large-1.srtlarge-n.srt

将两个文件分成特定时长(比如 15 分钟)的部分的最佳方法是什么?

输出将与上面所示的类似。

我想使用命令行工具,最好ffmpeg最好是直接命令,而不使用脚本。

答案1

据我所知,像这样复杂的任务无法通过ffmpeg一次调用单独完成,但我将在下面添加一个单行版本。这是脚本版本:

#!/bin/bash
in=$1
dur=$2
totaldur=$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4 | sed -r 's/.*"([0-9]+).*/\1/')
i=0

while (( i * dur < totaldur) )
do
  ffmpeg -i $in -i ${in%%.*}.srt \
    -ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} \
    -ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt
  ((i++))
done

此脚本有两个参数,第一个参数是视频的文件名,第二个参数是视频的持续时间(以秒为单位),请参见下面的示例。它首先将 的输出通过管道传输到ffprobesed获取视频的总持续时间(以秒为单位),该值用于为while各部分构建循环。循环内部ffmpeg调用 来创建各部分,一次调用即可完成.mp4和。.srt

示例运行

$ tree # the directory contains large.mp4 and large.srt
.
├── large.mp4
└── large.srt
$ ffmpeg -i large.mp4 |& awk '/Duration/' # large.mp4 has a duration of 00:02:30.07
  Duration: 00:02:30.07, start: 0.000000, bitrate: 1283 kb/s
$ /path/to/above/script large.mp4 60 # let's split it after every 60 seconds
$ tree
.
├── large-1.mp4
├── large-1.srt
├── large-2.mp4
├── large-2.srt
├── large-3.mp4
├── large-3.srt
├── large.mp4
└── large.srt

单线版本

前两个变量保存文件名和持续时间(以秒为单位),请根据需要调整这两个变量。

in=large.mp4;dur=60;i=0;while ((i*dur<$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4|sed -r 's/.*"([0-9]+).*/\1/')));do ffmpeg -y -i $in -i ${in%%.*}.srt -ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} -ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt;((i++));done

链接

以下是我在途中找到的一些链接:

相关内容