YAD e Zenity - Insira os tempos de início / parada para aparar vídeo

0

Eu tenho um script bash e um script php que funcionam em conjunto com cortar arquivos de áudio / vídeo usando os horários de início / parada .

script 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;

?>

script 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"

Uso:

./chopvideoaudio.sh [input.mp4] [startchop] [stopchop] [output.mp4]

Onde [startchop] e [stopchop] são registros de data e hora absolutos desde o início da faixa.

Exemplo de comando para executar este script:

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

Eu quero um script YAD (ainda outro diálogo) que abra uma caixa de diálogo contendo um campo de entrada para inserir um tipo de arquivo personalizado (por exemplo, mp3, mp4, avi). Em seguida, insira campos para os dois timestamps, nos quais posso inserir dois timestamps personalizados. Depois de pressionar OK , o script será executado e extrairá a seção entre os dois timestamps.

Eu também estaria interessado em uma solução usando Zenity , mas Eu prefiro YAD.

    
por user8547 10.02.2015 / 08:00

2 respostas

3

Aqui está uma solução usando yad , bash apenas (sem php), com um diálogo:

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

Aqui está uma captura de tela de como ela será. Por favor, note que o texto dos botões será automaticamente adaptado ao idioma escolhido. Eu sou falante de francês, obviamente!

Adesvantagemdestaumacaixadediálogoéquecom yad , você não pode pré -selecione a extensão do arquivo para entrada de arquivo. Se isso for obrigatório, aqui está a solução de duas etapas / caixas de diálogo:

#!/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"
    
por 24.02.2015 / 16:03
2

Você pode usar Zenity da seguinte forma: -

  1. Para Seleção de arquivo :

    file=$(zenity --file-selection --file-filter='*.mp4 *.mp3 *.avi')
    

    ou

    file=$(zenity --file-selection --title="Select Input File" --file-filter='*.mp4' --file-filter='*.mp3' --file-filter=*.avi)
    
  2. Para Entrada de texto :

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

    ou Zenity-Forms : -

    zenity --forms --text="Time-stamps" --add-entry=startchop --add-entry=stopchop
    

Agora: echo $file $startchop $stopchop fornece sua saída como: input.mp4 00:01:20 00:01:45

, por exemplo, você pode usar as variáveis $file , $startchop e $stopchop . Personalize o comando como quiser!

EDIT: -

Script chopvideoaudio.sh sugerido:

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

Uso: só execute ./chopvideoaudio.sh

Explicação: -

  • INFILE=$(zenity --title="Select Input File" --file-selection --file-filter='*.mp4' --file-filter='*.mp3' --file-filter=*.avi) exibirá Janela de seleção de arquivos da GUI pelo Zenity :

  • $TIMESTAMPS=$(zenity--forms--text="Time-stamps" --add-entry=startchop --add-entry=stopchop) exibirá a caixa de entrada GUI Tex na qual você deverá inserir registros de data e hora :

    Edecima$STARTe$STOPobtêmosdoisvaloresrespectivamente.

  • OUTFILE="$OUTFILENAME".$OUTFILETYPE é a combinação de (Uma entrada de texto para o nome do arquivo de saída) OUTFILENAME=$(zenity --entry --text=filename)

    E o diálogo de seleção do tipo de arquivo da GUI por OUTFILETYPE=$(zenity --list --title="Select File Type" --text="file type selection" --column="Select" --column="File Type" --radiolist false avi true mp4 false mp3) :

Daí Por meio deste exemplo: -

  • $INFILE retorna o arquivo selecionado para entrada (por exemplo, input.mp4 )
  • $START & $STOP retorna 00:01:20 e 00:01:45 respectivamente.
  • $OUTFILE retorna a saída file-name com o tipo de arquivo (por exemplo, output.mp4 )
por 22.02.2015 / 12:16