web-dev-qa-db-ja.com

FFmpeg:mp4とmkvへの複数のsrt

mp4ビデオ用のsrt字幕トラックがいくつかあります。 mkv/ffmpegを使用してそれらをavconvにするにはどうすればよいですか?

スペースを有効活用したい。 Darwin v1で変換を実行しています。誰かがそれを手伝ってくれたらありがたいです。前もって感謝します。

操作に十分便利な環境となるシェルなら何でも使用できます。ただし、私は主にzshを使用します。

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

Lecture.mkvファイルとすべてのmp4字幕トラックから*.srtを生成したいと思います。しかし、私にはその方法がわかりません。

3
theoden8

これが私のニーズに応じて私がした完全な答えです。

コード

#!/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に送られ、これを機能させる方法を理解するのに役立ちました。

2
theoden8

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)すべてのストリームなので、再エンコードは回避されます。

  • デフォルト ストリーム選択 はストリームタイプごとに1つのストリームのみを選択するため、-mapは、手動でオーバーライドするために使用されます。

  • 私はavconvを使用していないので、この情報のいずれかが適用されるかどうかはわかりません。 ffmpegの最新の実際のバージョンを使用していることを確認してください。開発は非常に活発で、Libavフォークからの偽造「ffmpeg」は古くて死んでいます。さまざまなオプションについては、 FFmpeg Download ページを参照してください。

9
llogan