2

У меня есть пара треков srt субтитров для видео в формате mp4 . Как мне превратить их в mkv с помощью ffmpeg/avconv?

Я хотел бы использовать пространство эффективно. Выполнение конвертации на Darwin v13. Буду благодарен, если кто-нибудь сможет мне помочь с этим. Заранее спасибо.

Я могу использовать любую оболочку, которая создает достаточно удобную среду для работы. Тем не менее, я в основном использую zsh .

пример

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

Я хочу сгенерировать Lecture.mkv из файла mp4 и всех дорожек субтитров *.srt . Но я понятия не имею, как.

2 ответа2

7

Использование 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
  • Это будет потоковое копирование (-c copy) всех потоков, поэтому перекодировка будет исключена.

  • Выбор потока по умолчанию выберет только один поток для каждого типа потока, поэтому -map используется для ручного переопределения этого.

  • Я не использую avconv , поэтому я не знаю, будет ли применена какая-либо из этих сведений . Убедитесь, что вы используете последнюю, реальную версию ffmpeg . Разработка очень активна, и контрафактный " ffmpeg " с вилки Libav старый и мертвый. Смотрите страницу загрузки FFmpeg для различных вариантов.

1

Вот полный ответ, который я сделал в соответствии с моими потребностями.

Код

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

Это генерирует команду для количества дорожек субтитров в папке.

Образец вывода

$ 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

кредиты

Автор благодарности Лорду Некбороду за предыдущий ответ, который помог мне понять, как заставить это работать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .