FFmpeg: mp4 e vários srt no mkv

2

Eu tenho algumas faixas de legenda srt para um vídeo mp4 . Como faço para torná-los mkv usando ffmpeg / avconv ?

Eu gostaria de usar o espaço eficientemente. Realizando conversão no Darwin v13 . Ficarei grato se alguém puder me ajudar com isso. Agradecemos antecipadamente.

Eu posso usar qualquer shell que faça um ambiente suficientemente conveniente para a operação. No entanto, uso principalmente zsh .

Exemplo

/some/path
    Lecture_About_Evolution_of_Evolution.mp4
    english.srt
    native.srt
    perl.srt
    elven.srt

Eu quero gerar Lecture.mkv do arquivo mp4 e todas as faixas de legenda *.srt . Mas não tenho ideia de como.

    
por theoden 17.08.2015 / 21:21

2 respostas

1

Aqui está a resposta completa que fiz de acordo com minhas necessidades.

Código

#!/bin/zsh

mkv_sub_getshort() {
    sub=$1
    sub="${sub%.${sub:e}}"
    sub="$(sed 's/^.*[[:punct:]]//g' <<< "$sub")"
    echo $sub
}

mkv_maker() {
    local c=0
    for i in *srt; do
        LOCAL_SUB[((++c))]="$i"
        LOCAL_SUB_SHORT[$c]="$(mkv_sub_getshort "$i")"
    done

    local W="   "
    printf "ffmpeg -i *mp4"
    printf "$(for i in ${LOCAL_SUB[*]}; do printf "${W}-i \"$i\""; done)"
    printf "$(for i in $(seq $((${#LOCAL_SUB} + 1))); do printf "${W}-map $((i - 1))"; done)"
    printf "${W}-c copy"
    printf "$(for i in $(seq ${#LOCAL_SUB}); do ((--i)); printf "${W}-metadata:s:s:$i language=${LOCAL_SUB_SHORT[$((i + 1))]%.srt}"; done)"
    printf "${W}output.mkv"

    unset LOCAL_SUB LOCAL_SUB_SHORT
}

mkv_maker

Isso gera o comando para o número de faixas de legendas na pasta.

Saída de amostra

$ ls -a
.           ..          mkvmaker vid.mp4     vid_eng.srt vid_fr.srt  vid_rus.srt vid_swe.srt

$ ./mkvmaker
ffmpeg -i *mp4 -i "vid_eng.srt" -i "vid_fr.srt" -i "vid_rus.srt" -i "vid_swe.srt" -map 0 -map 1 -map 2 -map 3 -map 4 -c copy -metadata:s:s:0 language=eng -metadata:s:s:1 language=fr -metadata:s:s:2 language=rus -metadata:s:s:3 language=swe output.mkv

Créditos

O crédito vai para LordNeckbeard pela resposta anterior que me ajudou a entender como fazer este trabalho.

    
por 20.08.2015 / 16:04
7

Usando ffmpeg :

ffmpeg -i video.mp4 -i subtitle1.srt -i subtitle2.srt -map 0 -map 1 -map 2 \
-c copy -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mkv
  • Isso fluxo de cópia ( -c copy ) todos os fluxos, portanto, a recodificação é evitada .

  • A seleção de fluxo padrão escolherá apenas um fluxo por tipo de fluxo, por isso -map is usado para sobrescrever manualmente isso.

  • Eu não uso avconv , então não sei se alguma dessas informações será aplicada. Verifique se você está usando uma versão recente e real de ffmpeg . O desenvolvimento é muito ativo e a falsificação " ffmpeg " do garfo de Libav está velha e morta. Veja a página Download do FFmpeg para várias opções.

por 17.08.2015 / 22:21