web-dev-qa-db-ja.com

YADと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;

?>

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 input.mp4 00:01:20 00:01:45 output.mp4

YAD(さらに別のダイアログ) スクリプトが必要です。このスクリプトは、カスタムファイルタイプ(mp3、mp4、aviなど)を入力するための入力フィールドを含むダイアログボックスを開きます。次に、2つのタイムスタンプのフィールドを入力します。このフィールドに2つのカスタムタイムスタンプを入力できます。 OKを押すと、スクリプトが実行され、2つのタイムスタンプの間からセクションが抽出されます。

Zenity を使用したソリューションにも興味がありますが、YADの方が好きです。

1
user8547

これは、 yad 、bashのみ(phpなし)、oneダイアログを使用したソリューションです。

#!/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"

これがどのように見えるかのスクリーンショットです。ボタンのテキストは、選択した言語に自動的に適合されることに注意してください。私は明らかにフランス語を話します!

dialog

このoneダイアログのみの欠点は、 yad では、ファイル入力用にファイル拡張子を事前に選択できないことです。これが必須の場合、次の2つのステップ/ダイアログソリューションがあります。

#!/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"
4
thdox

次のようにZenityを使用できます:-

  1. ファイル選択の場合:

    _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)
    _
  2. Text-Entryの場合:

    _startchop=$(zenity --entry --text=startchop)
    stopchop=$(zenity --entry --text=stopchop)
    _

    またはZenity-Forms:-

    _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ファイル選択ウィンドウ

    screen0

  • $TIMESTAMPS=$(zenity --forms --text="Time-stamps" --add-entry=startchop --add-entry=stopchop)は、タイムスタンプを入力する必要があるGUITex入力ボックスを表示します。

    timestamps

    そして、上から_$START_と_$STOP_はそれぞれ両方の値を取得します。

  • _OUTFILE="$OUTFILENAME".$OUTFILETYPE_は、(出力ファイル名のテキストエントリ)OUTFILENAME=$(zenity --entry --text=filename)の組み合わせです。

    そして、OUTFILETYPE=$(zenity --list --title="Select File Type" --text="file type selection" --column="Select" --column="File Type" --radiolist false avi true mp4 false mp3)によるGUIファイルタイプ選択ダイアログ:

    file-type-selection

したがって、この例では:-

  • _$INFILE_は、選択したファイルを入力用に返します(例:_input.mp4_)
  • _$START_&_$STOP_は、それぞれ_00:01:20_と_00:01:45_を返します。
  • _$OUTFILE_は、ファイルタイプとともに出力ファイル名を返します(例:_output.mp4_)
2
Pandya