我有一个 bash 脚本和一个 php 脚本,它们协同工作使用开始/停止时间修剪音频/视频文件。
PHP 脚本:
<?php
// Create datetime objcects
$dt1 = new DateTime($argv[1]);
$dt2 = new DateTime($argv[2]);
// Conver difference to seconds
$dt3 = $dt2->format('U') - $dt1->format('U');
// echo $dt3."\n";
$h = (int)($dt3 / 3600);
$dt3 %= 3600;
$m = (int)($dt3 / 60);
$dt3 %= 60;
$s = $dt3;
// Dump as H:M:S
echo $h . ":" . $m . ":" . $s;
?>
chopvideoaudio.sh 脚本:
#!/bin/bash
INFILE=$1
START=$2
STOP=$3
OUTFILE=$4
OFFSET=`php TimeDiff.php "$START" "$STOP"`
echo "Disecting $INFILE starting from $START to $STOP (duration $OFFSET)"
ffmpeg -ss "$START" -t "$OFFSET" -i "$INFILE" "$OUTFILE"
用法:
./chopvideoaudio.sh [input.mp4] [startchop] [stopchop] [output.mp4]
其中 [startchop] 和 [stopchop] 都是从曲目开头开始的绝对时间戳。
运行此脚本的示例命令:
./chopvideoaudio.sh 输入.mp4 00:01:20 00:01:45 输出.mp4
我想要一个YAD(又一个对话)该脚本将打开一个对话框,其中包含一个输入字段,用于输入自定义文件类型(例如 mp3、mp4、avi)。然后输入两个时间戳的字段,我可以在其中输入两个自定义时间戳。按下后,OK
脚本将运行并提取两个时间戳之间的部分。
我也对使用的解决方案感兴趣禅尼蒂,但我更喜欢YAD。
答案1
这是一个使用的解决方案亚德,仅 bash(无 php),带有一对话:
#!/bin/bash
eval $(yad --width=400 --form --field=input:FL --field=start --field=end --field=output:SFL "" "00:00:00" "00:00:00" "" | awk -F'|' '{printf "INPUT=\"%s\"\nSTART=%s\nEND=%s\nOUTPUT=\"%s\"\n", $1, $2, $3, $4}')
[[ -z $INPUT || -z $START || -z $END || -z $OUTPUT ]] && exit 1
DIFF=$(($(date +%s --date="$END")-$(date +%s --date="$START")))
OFFSET=""$(($DIFF / 3600)):$(($DIFF / 60 % 60)):$(($DIFF % 60))
ffmpeg -ss "$START" -t "$OFFSET" -i "$INPUT" "$OUTPUT"
这是它的外观的屏幕截图。请注意,按钮的文本将自动适应您选择的语言。我显然是法语使用者!
这样做的缺点一对话框只是与亚德,您无法为文件输入预先选择文件扩展名。如果这是强制性的,这里有两个步骤/对话框解决方案:
#!/bin/bash
INPUT=$(yad --width=600 --height=400 --file-selection --file-filter='*.mp3 *.mp4 *.avi')
eval $(yad --width=400 --form --field=start --field=end --field=output:SFL "00:00:00" "00:00:00" "${INPUT/%.*}-out.${INPUT##*.}" | awk -F'|' '{printf "START=%s\nEND=%s\nOUTPUT=\"%s\"\n", $1, $2, $3}')
[[ -z $START || -z $END || -z $OUTPUT ]] && exit 1
DIFF=$(($(date +%s --date="$END")-$(date +%s --date="$START")))
OFFSET=""$(($DIFF / 3600)):$(($DIFF / 60 % 60)):$(($DIFF % 60))
ffmpeg -ss "$START" -t "$OFFSET" -i "$INPUT" "$OUTPUT"
这显示了一个文件选择器,然后是一个时间戳窗口,如下所示:
答案2
您可以使用禅尼蒂如下:-
为了文件选择:
file=$(zenity --file-selection --file-filter='*.mp4 *.mp3 *.avi')
或者
file=$(zenity --file-selection --title="Select Input File" --file-filter='*.mp4' --file-filter='*.mp3' --file-filter=*.avi)
为了文本输入:
startchop=$(zenity --entry --text=startchop) stopchop=$(zenity --entry --text=stopchop)
或者禅宗形式:-
zenity --forms --text="Time-stamps" --add-entry=startchop --add-entry=stopchop
现在: echo$file $startchop $stopchop
给你输出如下:input.mp4 00:01:20 00:01:45
即您可以使用变量$file
,$startchop
和$stopchop
。根据您的意愿自定义命令!
编辑:-
建议的chopvideoaudio.sh
脚本:
#!/bin/bash
INFILE=$(zenity --title="Select Input File" --file-selection --file-filter='*.mp4' --file-filter='*.mp3' --file-filter=*.avi)
$TIMESTAMPS=$(zenity --forms --text="Time-stamps" --add-entry=startchop --add-entry=stopchop)
START=$(echo $TIMESTAMPS | cut -d '|' -f 1)
STOP=$(echo $TIMESTAMPS | cut -d '|' -f 2)
OUTFILENAME=$(zenity --entry --text=filename)
OUTFILETYPE=$(zenity --list --titile="Select File Type" --text="file types\ selection" --column="Select" --column="File Type" --radiolist false avi true mp4 false mp3)
OUTFILE="$OUTFILENAME".$OUTFILETYPE
OFFSET=`php TimeDiff.php "$START" "$STOP"`
echo "Disecting $INFILE starting from $START to $STOP (duration $OFFSET)"
ffmpeg -ss "$START" -t "$OFFSET" -i "$INFILE" "$OUTFILE"
用法:仅运行./chopvideoaudio.sh
解释:-
INFILE=$(zenity --title="Select Input File" --file-selection --file-filter='*.mp4' --file-filter='*.mp3' --file-filter=*.avi)
将显示Zenity 的 GUI 文件选择窗口:$TIMESTAMPS=$(zenity --forms --text="Time-stamps" --add-entry=startchop --add-entry=stopchop)
将显示 GUI Tex 输入框,您必须在其中输入时间戳:从上面分别得到
$START
和$STOP
两个值。OUTFILE="$OUTFILENAME".$OUTFILETYPE
是(输出文件名的文本条目)的组合OUTFILENAME=$(zenity --entry --text=filename)
GUI 文件类型选择对话框
OUTFILETYPE=$(zenity --list --title="Select File Type" --text="file type selection" --column="Select" --column="File Type" --radiolist false avi true mp4 false mp3)
:
因此通过这个例子:-
$INFILE
返回选定的输入文件(例如input.mp4
)$START
&分别$STOP
返回00:01:20
和00:01:45
。$OUTFILE
返回输出文件名和文件类型(例如output.mp4
)