YAD 和 Zenity - 输入开始/停止时间以修剪视频

whi*_*ngs 1 video-editing audio shell-script zenity

我有一个 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;

?>
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

用法:

./chopvideoaudio.sh [input.mp4] [startchop] [stopchop] [output.mp4]
Run Code Online (Sandbox Code Playgroud)

其中 [startchop] 和 [stopchop] 都是从曲目开始的绝对时间戳。

运行此脚本的示例命令:

./chopvideoaudio.sh input.mp4 00:01:20 00:01:45 output.mp4

我想要一个YAD(又一个对话框)脚本,它将打开一个对话框,其中包含一个输入字段以输入自定义文件类型(例如 mp3、mp4、avi)。然后输入两个时间戳的字段,我可以在其中输入两个自定义时间戳。按下OK脚本后,脚本将运行并从两个时间戳之间提取部分。

我也对使用Zenity的解决方案感兴趣,但我更喜欢 YAD。

thd*_*dox 5

这是一个使用yad的解决方案,仅使用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"
Run Code Online (Sandbox Code Playgroud)

这是它的外观的屏幕截图。请注意,按钮的文本将自动适应您选择的语言。我显然是讲法语的!

对话

这个的缺点一个对话框仅是与屠杀,你不能预先选择文件输入文件扩展名。如果这是强制性的,这里有两个步骤/对话框解决方案:

#!/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"
Run Code Online (Sandbox Code Playgroud)

  • @ user8547,我编辑了我的答案,用“00:00:00”预填充开始/结束字段,并用输出文件名预填充为 basenamee-out.ext。 (2认同)