Created
July 14, 2026 18:51
-
-
Save suissa/6da4b8e4ef7a9dadfc6dc5b6cf766515 to your computer and use it in GitHub Desktop.
video-cutter
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 | |
| # Verifica se o usuário passou pelo menos o nome do vídeo | |
| if [ "$#" -lt 1 ]; then | |
| echo "Uso: $0 <video.mp4> [arquivo_de_cortes.yml]" | |
| echo "Exemplo: $0 meu_video.mp4 cut.yml" | |
| exit 1 | |
| fi | |
| VIDEO_FILE="$1" | |
| # Se não passar o arquivo YAML, assume 'cut.yml' por padrão | |
| YML_FILE="${2:-cut.yml}" | |
| # Verifica se o vídeo existe | |
| if [ ! -f "$VIDEO_FILE" ]; then | |
| echo "Erro: Arquivo de vídeo '$VIDEO_FILE' não encontrado." | |
| exit 1 | |
| fi | |
| # Verifica se o arquivo YAML existe | |
| if [ ! -f "$YML_FILE" ]; then | |
| echo "Erro: Arquivo '$YML_FILE' não encontrado." | |
| exit 1 | |
| fi | |
| # Verifica se o FFmpeg está instalado | |
| if ! command -v ffmpeg &> /dev/null; then | |
| echo "Erro: 'ffmpeg' não está instalado." | |
| echo "Instale com: sudo apt install ffmpeg (Ubuntu/Debian) ou brew install ffmpeg (Mac)" | |
| exit 1 | |
| fi | |
| # Extrai o nome do arquivo original e a extensão | |
| BASENAME=$(basename "$VIDEO_FILE") | |
| FILENAME="${BASENAME%.*}" | |
| EXTENSION="${BASENAME##*.}" | |
| echo "Lendo os cortes do arquivo: $YML_FILE" | |
| # Faz o parse do YAML nativamente usando grep e sed (evita precisar instalar o 'yq') | |
| # Procura linhas que comecem com '-', extraindo apenas a parte dos tempos | |
| CUTS=$(grep -E '^[[:space:]]*-[[:space:]]*[0-9]+[.:][0-9]+.*-[0-9]+[.:][0-9]+' "$YML_FILE" | sed -E 's/^[[:space:]]*-[[:space:]]*//') | |
| if [ -z "$CUTS" ]; then | |
| echo "Erro: Nenhum corte válido encontrado no arquivo '$YML_FILE'." | |
| exit 1 | |
| fi | |
| INDEX=1 | |
| # Loop pelas linhas extraídas | |
| for CUT in $CUTS; do | |
| # Substitui '.' por ':' para lidar com casos como 05.35 no lugar de 05:35 | |
| CUT_CLEAN=$(echo "$CUT" | tr '.' ':') | |
| # Separa o tempo de início e fim baseando-se no traço '-' | |
| START_TIME=$(echo "$CUT_CLEAN" | cut -d'-' -f1) | |
| END_TIME=$(echo "$CUT_CLEAN" | cut -d'-' -f2) | |
| # Formata o sufixo para ter dois dígitos (01, 02, 03, etc) | |
| SUFFIX=$(printf "%02d" $INDEX) | |
| OUTPUT_FILE="${FILENAME}-${SUFFIX}.${EXTENSION}" | |
| echo "---------------------------------------------------" | |
| echo "Processando parte $INDEX: de $START_TIME até $END_TIME" | |
| echo "Salvando como: $OUTPUT_FILE" | |
| # Comando ffmpeg para cortar | |
| # -i $VIDEO_FILE : Arquivo de entrada | |
| # -ss $START_TIME : Pula até este tempo de início | |
| # -to $END_TIME : Para de processar neste tempo | |
| # -c copy : Copia o vídeo e áudio sem recodificar (muito mais rápido e não perde qualidade) | |
| ffmpeg -i "$VIDEO_FILE" -ss "$START_TIME" -to "$END_TIME" -c copy "$OUTPUT_FILE" -v warning -y | |
| if [ $? -eq 0 ]; then | |
| echo "✅ Parte $INDEX cortada com sucesso!" | |
| else | |
| echo "❌ Erro ao cortar a parte $INDEX." | |
| fi | |
| INDEX=$((INDEX + 1)) | |
| done | |
| echo "---------------------------------------------------" | |
| echo "Todos os cortes foram finalizados com sucesso!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment