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: