ffmpeg script - fatia um vídeo em várias fatias

1

Atualmente, estou usando o ffmpeg para fatiar arquivos de vídeo. Eu automatizei o processo através de um script chamado ffmpeg_split.sh . Para ver o script, clique aqui . Quando executo o script, tenho um erro ao tentar obter o parse_duration_info() . Em outras palavras, o problema é tentar definir o tempo de duração das fatias de vídeo. O erro lançado é Bad input to parse_duration_info()

Aqui está a sintaxe para dividir um vídeo com script: ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

Flags: 
-s  Path to video source (string)

-o  Path to output file with format (string)
    Format must be printf-like, for example ./path/video-part-%03d.avi

-c  Chunk length in seconds (integer)

O problema está abaixo: Este é o script completo

function parse_duration_info() {
    if [[ $1 ]] && [[ $2 -gt 0 ]] && [[ $2 -lt 5 ]] ; then
        __OFFSET=$2
        __DURATION_PATTERN='\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9]\)'
        echo "$1" | sed "s/$__DURATION_PATTERN/\$__OFFSET/"
    else
        echo "Bad input to parse_duration_info()"
        echo "Givven duration $1"
        echo "Givven offset $2"
        echo "Exiting..."
        exit 1
    fi
}
    
por Code_Ed_Student 03.10.2014 / 06:23

2 respostas

1

Você precisará dissecar este script um pouco para ver por que ele está falhando. Essa não é uma tarefa tão difícil, já que você já tem o código-fonte. Eu começaria com a confirmação de que os comandos na implementação da função, get_video_duration_in_seconds_from_file() estão corretos. Especificamente quando eu executei este comando em alguns arquivos .mp4 que eu tinha, ele não retornaria nada:

__DURATION_HMS=$(ffmpeg -i "$__FILE" 2>&1 | grep Duration | \
    grep '\d\d:\d\d:\d\d.\d\d' -o)

NOTA: esta é a linha 54.

Portanto, sem este valor, este seria um bom motivo pelo qual as chamadas que vêm depois dele para a função parse_duration_info() estão retornando a mensagem de erro.

De acordo com os comentários no script original, deve haver dois argumentos para parse_duration_info() .

# arg1: duration in format 01:23:45.67
# arg2: offset for group 1 gives hours, 2 gives minutes, 
#       3 gives seconds, 4 gives milliseconds

Mais saída de depuração

Além disso, você pode ativar a saída mais detalhada desse script adicionando essa linha logo após o shebang ( #!/bin/bash ).

set +x

Se você ativar a verbosidade total em todo o script, poderá ativá-lo seletivamente em torno de determinados blocos de código, como:

parse_duration_info() {
    set +x

    ... body of function ...

    set -x
}
    
por 03.10.2014 / 08:27
0

Tente isto:

__DURATION_HMS=$(ffmpeg -i "${FILE}" 2>&1 | grep Duration | \ grep -e '[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' -o)

    
por 09.01.2016 / 13:46