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
を生成したいと思います。しかし、私にはその方法がわかりません。
これが私のニーズに応じて私がした完全な答えです。
#!/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に送られ、これを機能させる方法を理解するのに役立ちました。
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 ページを参照してください。