A solução que eu uso agora examina o arquivo de entrada de lista e cria pequenos arquivos com trechos "no-silence" a partir desta informação. Todos os arquivos são gravados no arquivo temp
na ordem correta. Quando isso for feito, as partes serão mescladas e os arquivos temporários serão limpos. Isso é não muito rápido. Um total de cerca de 1000 cortes em um clipe de 90 minutos leva cerca de 5 horas em um processador i7, 10 GB de RAM.
Eu acho que uma solução com filtros ffmpeg seria muito mais rápido. Mas foi muito complicado no momento. Outra solução poderia ser este exemplo de código . Ambos provavelmente seriam mais eficientes porque não criam os arquivos tmp (com cabeçalhos, gravação de arquivos, etc.).
De qualquer forma, aqui está o código de trabalho em seu estado atual:
#!/bin/bash
echo "">temp
# File or Directory selection menu with dialog
function fileDialog {
read -p "$2: " fileselection
echo "You've selected $fileselection"
}
WORKPATH=$(pwd)
echo "Arbeitsverzeichnis: $WORKPATH"
fileDialog "$WORKPATH" "Select original Video-File"
INFILE=$fileselection
ff=$(ffmpeg -i "$INFILE" 2>&1)
d="${ff#*Duration: }"
LENGTH="${d%%,*}"
echo "Arbeitsverzeichnis: $WORKPATH"
echo "Videodatei: $INFILE"
echo "Gesamtvideolänge $LENGTH"
fileDialog "$WORKPATH" "Select Label-List-File (exported from Audacity)"
LABELFILE=$fileselection
NUMLINES=$(awk 'END { print NR }' "$LABELFILE")
clear
echo "Arbeitsverzeichnis: $WORKPATH"
echo "Videodatei: $INFILE"
echo "Gesamtvideolänge $LENGTH"
echo "Sequence-Label-Datei: $LABELFILE"
echo $NUMLINES lines/sequences found in \'$LABELFILE\'
echo ""
echo "Start processing..."
awk '{d=sprintf("echo Processing Part "NR"/'"$NUMLINES"' named "$3" from "$1"s to "$2"s..."); system(d); s=sprintf("ffmpeg -hide_banner -loglevel panic -accurate_seek -y -i '"$INFILE"' -strict -2 -ss "$1" -to "$2" tmp-"NR".mp4>/dev/null"); system(s); p=sprintf("echo \"$(cat temp)\nfile '"$WORKPATH"'/tmp-"NR".mp4\">temp"); system(p);}' "$LABELFILE"
echo "Merging all "$NUMLINES" parts."
ffmpeg -f concat -i temp -c copy "short-$INFILE.mp4"
echo "Cleaning up..."
rm tmp-*.mp4
rm temp
rm "$INFILE"
Mais duas coisas pequenas que devem ser feitas: atualmente, isso converterá seu vídeo em mp4. Isso não é realmente necessário e, provavelmente, requer apenas muito tempo de CPU.