gpt4 book ai didi

linux - 仅下载 youtube 视频的一部分,精确到毫秒

转载 作者:行者123 更新时间:2023-12-04 23:07:01 30 4
gpt4 key购买 nike

我在这里使用这个 bash 脚本来下载长 yt 视频的一小部分:

    #!/bin/bash
#taken from https://unix.stackexchange.com/a/388148/48971

if [ $# -lt 4 ]; then
echo "Usage: $0 <youtube's URL> <HH:mm:ss.milisecs from time> <HH:mm:ss.milisecs to time> <output_file_name>"
echo "e.g.:"
echo "$0 https://www.youtube.com/watch?v=T1n5gXIPyws 00:00:25 00:00:42 intro.mp4"
exit 1
fi

echo "processing..."

from=$(date "+%s" -d "UTC 01/01/1970 $2")
to=$(date "+%s" -d "UTC 01/01/1970 $3")

from_pre=$(($from - 30))

if [ $from_pre -lt 0 ]
then
from_pre=0
fi

from_pre_command_print=$(date -u "+%T" -d @$from_pre)
from_command_print=$(date -u "+%T" -d @$(($from - $from_pre)))$(grep -o "\..*" <<< $2)
to_command_print=$(date -u "+%T" -d @$(($to - $from_pre)))$(grep -o "\..*" <<< $3)

command="ffmpeg "

for uri in $(youtube-dl -g $1)
do
command+="-ss $from_pre_command_print -i $uri "
done

command+="-ss $from_command_print -to $to_command_print $4"
echo "downloading with the following command:"
echo "$command"
$command
但问题是它只精确到整秒。
我想用它来下载一堆非常短的剪辑(大部分只有一个词长),这些剪辑的长度通常低于 1 秒。
我试图通过在日期中使用毫秒来解决这个问题。
但后来我发现 bash 只能用整数减去。
这是我尝试过的:
from=$(date "+%s.%3N" -d "UTC 01/01/1970 $2")
to=$(date "+%s.%3N" -d "UTC 01/01/1970 $3")

function diff {
diff="$(echo $from - 5 | bc)"
echo $diff
}
from_pre=$diff
echo $diff
但是使用 bc 的解决方法不起作用,因为稍后在脚本中它再次抛出错误,因为 bash 不知道如何处理非整数。
示例命令如下所示:
sh download_youtube.sh https://www.youtube.com/watch?v=dH3auOKyxio 00:06:28.230 00:06:28.740 clip004.mp4
这有效...如果时间范围超过 1 秒。
可悲的是,我在这里不知道如何使它更精确。
这一切都是从 youtube channel 自动编译特定单词的项目的一部分,更多信息在这里:
https://github.com/moeC137/video-recutter
我非常感谢每一个帮助
编辑:
在尝试了一个错误之后,我发现这个接缝对我有用:
#!/bin/bash
#taken from https://unix.stackexchange.com/a/388148/48971

if [ $# -lt 4 ]; then
echo "Usage: $0 <youtube's URL> <HH:mm:ss.milisecs from time> <HH:mm:ss.milisecs to time> <output_file_name>"
echo "e.g.:"
echo "$0 https://www.youtube.com/watch?v=T1n5gXIPyws 00:00:25 00:00:42 intro.mp4"
exit 1
fi

echo "processing..."

from=$(date "+%s" -d "UTC 01/01/1970 $2")
to=$(date "+%s" -d "UTC 01/01/1970 $3")



from_pre=$(($from - 20))
#to_post=$(($to + 20))

if [ $from_pre -lt 0 ]
then
from_pre=0
fi

from_pre_command_print=$(date -u "+%T" -d @$from_pre)

from_command_print=$(date -u "+%T" -d @$(($from - $from_pre)))$(grep -o "\..*" <<< $2)

to_command_print=$(date -u "+%T" -d @$(($to - $from_pre)))$(grep -o "\..*" <<< $3)

#to_post_command_print=$(date -u "+%T.%3N" -d @$to_post)

command="ffmpeg "

for uri in $(youtube-dl -g $1)
do
command+="-ss $from_pre_command_print -i $uri "
done

command+="-ss $from_command_print -to $to_command_print $4"
echo "downloading with the following command:"
echo "$command"
$command
但我开始认为原始脚本实际上以毫秒为单位。
因为这:
sh download_youtube.sh https://www.youtube.com/watch?v=dH3auOKyxio 00:06:28.230 00:06:28.740 clip004.mp4
可以,但是当尝试将其与此处的脚本结合使用时 How to repeat a command for every line in a textfile with given arguments from the textfile (Bash?)它不再使用毫秒。
解决了
原始脚本有效。它只是不喜欢时间戳中的“,”,我将它们替换为“。”现在它的工作。

最佳答案

通过用“。”替换时间戳中的“,”来解决。

关于linux - 仅下载 youtube 视频的一部分,精确到毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69998080/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com