FFmpeg: mp4 e srt multipli in mkv

Ho un paio di tracce di sottotitoli per un video mp4 . Come faccio a metterli in mkv usando ffmpeg / avconv ?

Vorrei usare lo spazio in modo efficiente. Effettuare la conversione su Darwin v13 . Sarò grata se qualcuno mi possa aiutare con questo. Grazie in anticipo.

Posso utilizzare qualsiasi shell che crea un ambiente sufficientemente conveniente per l'operazione. Tuttavia, io uso principalmente zsh .

Esempio

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

Voglio generare Some_Lection.mkv dal file mp4 e tutte le tracce dei sottotitoli *.srt . Ma non ho idea di come.

Utilizzo di 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 
  • Questo copia di stream ( -c copy ) tutti i flussi, in modo da evitare la codifica.

  • La selezione del stream di stream predefinito selezionerà solo un stream per tipo di stream, in modo che -map viene utilizzato per sovrascrivere manualmente tale stream.

  • Non uso avconv , quindi non so se alcuna di queste informazioni si applicherà. Assicurati di utilizzare una versione recente e reale di ffmpeg . Lo sviluppo è molto attivo e il contraffatto " ffmpeg " dalla forchetta Libav è vecchio e morto. Vedere la pagina di download di FFmpeg per varie opzioni.

Ecco la risposta completa che ho fatto secondo le mie esigenze.

Codice

 #!/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 

Questo genera il command per il numero di tracce di sottotitoli nella cartella.

Esempio di output

 $ 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 

Crediti

Il credito va a LordNeckbeard per la risposta precedente che mi ha aiutato a capire come farlo funzionare.