Skip to content

Instantly share code, notes, and snippets.

@alandbh
Last active August 25, 2025 18:49
Show Gist options
  • Save alandbh/7d9b2e627afeb5b9c7735b65fa1f5944 to your computer and use it in GitHub Desktop.
Save alandbh/7d9b2e627afeb5b9c7735b65fa1f5944 to your computer and use it in GitHub Desktop.
Bash Script for Joining Videos
#!/bin/bash
# vjoin: Junta dois vídeos usando nomes parciais e concatena com ou sem reencodificação
# Uso: vjoin <arquivo1-parcial> <arquivo2-parcial> [nome-destino] [--force]
# ------------------------------------------
# Instalando como comando global vjoin
# ------------------------------------------
# Salve o script acima com o nome vjoin (sem .sh).
# Torne-o executável com o comando:
# chmod +x vjoin
# Mova para um diretório no seu PATH, por exemplo:
# sudo mv vjoin /usr/local/bin/
# Agora você pode usar de qualquer lugar:
# vjoin <arquivo1-parcial> <arquivo2-parcial> [nome-destino] [--force]
# Verifica se ao menos 2 argumentos foram fornecidos
if [ $# -lt 2 ]; then
echo "Uso: vjoin <arquivo1-parcial> <arquivo2-parcial> [nome-destino] [--force]"
exit 1
fi
# Argumentos principais
partial1="$1"
partial2="$2"
third_arg="$3"
fourth_arg="$4"
# Lógica para nome personalizado e flag --force
if [ "$third_arg" == "--force" ]; then
custom_name=""
force_reencode="yes"
elif [ "$fourth_arg" == "--force" ]; then
custom_name="$third_arg"
force_reencode="yes"
else
custom_name="$third_arg"
force_reencode="no"
fi
# Encontra os arquivos
file1=$(ls | grep -i "$partial1" | head -n 1)
file2=$(ls | grep -i "$partial2" | head -n 1)
# Verifica se os dois arquivos foram encontrados
if [ -z "$file1" ] || [ -z "$file2" ]; then
echo "Erro: Um dos arquivos não foi encontrado."
echo "Arquivo 1: '$file1'"
echo "Arquivo 2: '$file2'"
exit 1
fi
# Define extensão
ext="${file1##*.}"
# Nome de saída
if [ -n "$custom_name" ]; then
output="${custom_name}.mp4"
else
base1="${file1%.*}"
base2="${file2%.*}"
suffix=$([ "$force_reencode" == "yes" ] && echo "_reencoded" || echo "")
output="joined_${base1}_and_${base2}${suffix}.mp4"
fi
# Arquivo temporário com lista dos vídeos
listfile=$(mktemp)
echo "file '$PWD/$file1'" >> "$listfile"
echo "file '$PWD/$file2'" >> "$listfile"
# Execução
if [ "$force_reencode" == "yes" ]; then
echo "🌀 Juntando vídeos com reencodificação..."
ffmpeg -f concat -safe 0 -i "$listfile" -c:v libx264 -crf 20 -preset medium -c:a aac -b:a 128k "$output"
else
echo "⚡ Juntando vídeos sem reencodificação (modo rápido)..."
ffmpeg -f concat -safe 0 -i "$listfile" -c copy "$output"
fi
rm "$listfile"
echo "✅ Vídeos unidos com sucesso: $output"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment