FFmpeg: mp4 і кілька srt в mkv


3

У мене є кілька 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треків субтитрів. Але я поняття не маю.

Відповіді:


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" від виделки "Лібов" старий і мертвий. Дивіться сторінку завантаження FFmpeg для різних варіантів.


Чи можна зробити його незалежним від кількості треків субтитрів?
Теоден

@theoden Чи можете ви пояснити більш докладно? Я не зовсім стежу за тим, що ви просите.
llogan

Я маю на увазі так, що всі srtмаски та mp4файли об’єднані в один mkvфайл. Незважаючи на те, що запропоноване вами рішення, здається, працює, воно спрямоване лише на 2 треки підзаголовків. Чи існує схема для цього? Я додав приклад, щоб дати зрозуміти. Вибачте за те, що трохи не зрозуміли.
Теоден

@theoden Ви шукаєте повний сценарій? Я не zshкористувач, але рекомендую переглянути глобалінг та масиви. shellcheck завжди корисний для bash.
llogan

@theoden Вам доведеться чітко перераховувати кожен вхід SRT, як показано в прикладі.
llogan

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

Кредити

Кредит належить LordNeckbeard за попередню відповідь, яка допомогла мені зрозуміти, як зробити так, щоб це працювало.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.