我有一个大视频文件(large.mp4
)和一个相应的字幕文件(large.srt
)。
将两个文件拆分成的最佳方法是什么n相等的部分?
这将产生large-1.mp4
,... ,和,... ,。并且所有这些文件的大小都将相同(最后一个文件除外)。large-n.mp4
large-1.srt
large-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
此脚本有两个参数,第一个参数是视频的文件名,第二个参数是视频的持续时间(以秒为单位),请参见下面的示例。它首先将 的输出通过管道传输到ffprobe
以sed
获取视频的总持续时间(以秒为单位),该值用于为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
链接
以下是我在途中找到的一些链接: