windows - 使用 ffmpeg 分割视频的 Bash 脚本输出错误的视频长度
问题描述
我有一个x
几秒钟长的视频。我想将该视频分成相等的片段,每个片段不超过一分钟。为此,我拼凑了一个相当简单的 bash 脚本,用于ffmprobe
获取视频的持续时间,找出每个片段应该有多长,然后使用以下方法迭代地分割视频ffmpeg
:
INPUT_FILE=$1
INPUT_DURATION="$(./bin/ffprobe.exe -i "$INPUT_FILE" -show_entries format=duration -v quiet -of csv="p=0")"
NUM_SPLITS="$(perl -w -e "use POSIX; print ceil($INPUT_DURATION/60), qq{\n}")"
printf "\nVideo duration: $INPUT_DURATION; "
printf "Number of videos to output: $NUM_SPLITS; "
printf "Approximate length of each video: $(echo "$INPUT_DURATION" "$NUM_SPLITS" | awk '{print ($1 / $2)}')\n\n"
for i in `seq 1 "$NUM_SPLITS"`; do
START="$(echo "$INPUT_DURATION" "$NUM_SPLITS" "$i" | awk '{print (($1 / $2) * ($3 - 1))}')"
END="$(echo "$INPUT_DURATION" "$NUM_SPLITS" "$i" | awk '{print (($1 / $2) * $3)}')"
echo ./bin/ffmpeg.exe -v quiet -y -i "$INPUT_FILE" \
-vcodec copy -acodec copy -ss "$START" -t "$END" -sn test_${i}.mp4
./bin/ffmpeg.exe -v quiet -y -i "$INPUT_FILE" \
-vcodec copy -acodec copy -ss "$START" -t "$END" -sn test_${i}.mp4
done
printf "\ndone\n"
如果我在 30MB / 02:50 持续时间的Big Buck Bunny 样本上运行该脚本,则程序的输出会建议视频的长度应该相同:
λ bash split.bash .\media\SampleVideo_1280x720_30mb.mp4
Video duration: 170.859000; Number of videos to output: 3; Approximate length of each video: 56.953
./bin/ffmpeg.exe -v quiet -y -i .\media\SampleVideo_1280x720_30mb.mp4 -vcodec copy -acodec copy -ss 0 -t 56.953 -sn test_1.mp4
./bin/ffmpeg.exe -v quiet -y -i .\media\SampleVideo_1280x720_30mb.mp4 -vcodec copy -acodec copy -ss 56.953 -t 113.906 -sn test_2.mp4
./bin/ffmpeg.exe -v quiet -y -i .\media\SampleVideo_1280x720_30mb.mp4 -vcodec copy -acodec copy -ss 113.906 -t 170.859 -sn test_3.mp4
done
由于每个部分视频的持续时间,即 和 之间的时间-ss
,对于每个后续命令-t
都是相等的。ffmpeg
但我得到的持续时间更接近:
test_1.mp4 = 00:56
test_2.mp4 = 01:53
test_3.mp4 = 00:56
每个部分视频的内容重叠的地方。我在这里想念什么?
解决方案
看起来您正在使用-t
,这是复制的持续时间,但您将其传递到结束位置。也许您打算使用-to
哪个是结束位置?或者您可以使用-t
,但您需要计算从开始到结束的持续时间。
也就是说,有更好的方法可以将视频分成长度大致相等的片段,您应该查看片段复用器。
为了保证一定持续时间的片段,您很可能还需要对视频进行转码并以固定间隔引入关键帧,否则您的分割将在最近的关键帧上,而不是您想要的确切持续时间。
推荐阅读
- python - wagtail-generic-chooser 小部件 (NoReverseMatch)
- javascript - 如何使用javascript交换html div元素位置
- python - ValueError:无法将输入数组从形状(11,140,55)广播到形状(11,140,11)
- android - 每次询问时如何确保获得gps位置
- swift - Google Firebase:如何使用 Snapchat 对用户进行身份验证?
- c# - C# 设计 - 如何在没有空接口的情况下将类和枚举分组到列表中?
- python - Fbprophet 错误“系列”对象没有属性“非零”
- java - [凌空][JSONException]:值
我正在为一个大学项目开发一个安卓应用程序。当我使用 volley 发布 JsonObjectRequest 帖子时,会陷入同样的错误。我试图在 mysql 数据库中插入一个点,使用 @Override onMapClick(LatLn
- azure - 存储发送到 Azure 服务总线的消息的最佳方式?
- html - 无法使 flexbox 容器响应