首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从视频中提取子片段的时间为10s;30%;60%;最后30秒

从视频中提取子片段的时间为10s;30%;60%;最后30秒
EN

Stack Overflow用户
提问于 2018-07-01 07:40:30
回答 1查看 266关注 0票数 1

我正在Mac终端上写Bash命令。为了能够使用循环,我想提取4个不同输入文件.mp4视频的子剪辑:第一个子剪辑(从第二个10到20),第二个子剪辑(从输入文件的33%开始到10秒),第三个子剪辑(从输入文件的66%开始到10秒),第四个子剪辑(在输入文件结束前30秒开始的10秒)。

到目前为止,我只知道如何使它与固定的时间(即秒)工作,但这些只对应于我的第一个视频(我有+200):

代码语言:javascript
运行
复制
#!/bin/bash
for file in *.mp4; do ffmpeg -i "$file" -vf "select='between(t, 10, 20) + between(t, 197, 207) + between(t, 393, 403) + between(t, 570,580)',
setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, 10, 20) + 
between(t, 197, 207) + between(t, 393, 403) + between(t, 570, 580)', 
asetpts=N/SR/TB" ${file%.mp4}_1.mp4; done

对于第一个子剪辑,我总是希望从第二个10到20,所以我可以保留它的现状,但对于第二至第四次,我需要一些公式,但不知道哪一个。有什么建议吗?

耽误您时间,实在对不起

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-02 10:53:49

首先,您需要以秒为单位获取视频持续时间:

代码语言:javascript
运行
复制
DURATION=$(ffmpeg -i $file 2>&1 | grep "Duration" | awk '{print $2}' | sed 's/\..*//g' | awk '{split($1, a, ":"); print 3600*a[1] + 60*a[2] + a[3]}')

在这个命令中,您查询ffmpeg以获得视频持续时间,并通过以下方法解析结果:搜索“工期”关键字(grep)、获取时间域(awk)、丢弃厘米秒(sed)并将H:M:S字符串解析为若干秒(awk)。

然后,您可以计算所需的间隔:

代码语言:javascript
运行
复制
START1=10
END1=20
START2=$(($DURATION*33/100))
END2=$(($START2+10))
START3=$(($DURATION*66/100))
END3=$(($START3+10))
START4=$(($DURATION-30))
END4=$(($START4+10))

您需要整整几秒钟,所以使用返回整数的bash方法是一个很好的方法。

你应该确保你的视频持续至少30秒。

现在,您可以使用适当的时间替换来启动命令:

代码语言:javascript
运行
复制
#!/bin/bash

for file in *.mp4
do
    DURATION=$(ffmpeg -i $file 2>&1 | grep "Duration" | awk '{print $2}' | sed 's/\..*//g' | awk '{split($1, a, ":"); print 3600*a[1] + 60*a[2] + a[3]}')

    START1=10
    END1=20
    START2=$(($DURATION*33/100))
    END2=$(($START2+10))
    START3=$(($DURATION*66/100))
    END3=$(($START3+10))
    START4=$(($DURATION-30))
    END4=$(($START4+10))

    ffmpeg -i "$file" -vf "select='between(t, $START1, $END1) + between(t, $START2, $END2) + between(t, $START3, $END3) + between(t, $START4, $END4)', setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, $START1, $END1) +  between(t, $START2, $END2) + between(t, $START3, $END3) + between(t, $START4, $END4)', asetpts=N/SR/TB" ${file%.mp4}_1.mp4
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51121333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档