Last active
August 25, 2025 18:49
-
-
Save alandbh/7d9b2e627afeb5b9c7735b65fa1f5944 to your computer and use it in GitHub Desktop.
Bash Script for Joining Videos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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