Como dividir um arquivo de vídeo junto com o arquivo de legenda correspondente?

4

Eu tenho um arquivo de vídeo grande ( large.mp4 ) e um arquivo de legenda correspondente ( large.srt ).

Qual é a melhor maneira de dividir os arquivos em partes iguais em n ?

Isso produzirá large-1.mp4 , ..., large-n.mp4 e large-1.srt , ..., large-n.srt . E todos esses arquivos serão de tamanho igual (exceto os últimos).

Qual é a melhor maneira de dividir os arquivos em partes de uma duração específica, por exemplo, 15 minutos?

A saída será semelhante à indicada acima.

Eu gostaria de usar uma ferramenta de linha de comando, de preferência ffmpeg e, de preferência, o comando direto, sem um script.

    
por deshmukh 27.03.2018 / 15:42

1 resposta

3

Uma tarefa tão complexa como essa (que eu saiba) não pode ser feita com ffmpeg sozinho e em uma única chamada, mas adicionarei uma versão on-line abaixo. Aqui está a versão do script:

#!/bin/bash
in=$1
dur=$2
totaldur=$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4 | sed -r 's/.*"([0-9]+).*//')
i=0

while (( i * dur < totaldur) )
do
  ffmpeg -i $in -i ${in%%.*}.srt \
    -ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} \
    -ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt
  ((i++))
done

Esse script recebe dois argumentos, sendo o primeiro o nome do arquivo do vídeo e o segundo a duração em segundos, veja o exemplo abaixo. Ele primeiro canaliza a saída de ffprobe para sed para obter a duração total do vídeo em segundos, esse valor é usado para criar um loop while para as partes. Dentro do loop ffmpeg é chamado para criar as partes, tanto o .mp4 quanto o .srt em uma chamada.

Exemplo de execução

$ tree # the directory contains large.mp4 and large.srt
.
├── large.mp4
└── large.srt
$ ffmpeg -i large.mp4 |& awk '/Duration/' # large.mp4 has a duration of 00:02:30.07
  Duration: 00:02:30.07, start: 0.000000, bitrate: 1283 kb/s
$ /path/to/above/script large.mp4 60 # let's split it after every 60 seconds
$ tree
.
├── large-1.mp4
├── large-1.srt
├── large-2.mp4
├── large-2.srt
├── large-3.mp4
├── large-3.srt
├── large.mp4
└── large.srt

Versão Oneline

As duas primeiras variáveis mantêm o nome do arquivo e a duração em segundos, ajustando-as às suas necessidades.

in=large.mp4;dur=60;i=0;while ((i*dur<$(ffprobe -v -8 -show_entries format=duration -of flat large.mp4|sed -r 's/.*"([0-9]+).*//')));do ffmpeg -y -i $in -i ${in%%.*}.srt -ss $((i*dur)) -t $dur -c copy -sn ${in%%.*}-$((i+1)).${in#*.} -ss $((i*dur)) -t $dur -an -vn ${in%%.*}-$((i+1)).srt;((i++));done

Links

Aqui estão alguns links que encontrei no caminho:

por dessert 13.04.2018 / 16:03