作為一個(gè)輕度電影收藏愛好者筛严,看過的電影都會(huì)丟到硬盤里放著,但是網(wǎng)絡(luò)上有些電影資源并沒有內(nèi)嵌字幕忘巧,還需要外掛一個(gè)字幕恒界,但是這樣在保存的時(shí)候就需要保存兩個(gè)文件,就令我很不爽砚嘴,好在可以使用ffmpeg將字幕嵌入到視頻文件中十酣。
現(xiàn)在的大多電影都使用mkv格式,也有部分使用mp4际长,mkv格式本身支持字幕軌道耸采,而mp4則需要調(diào)用mov_text編碼器,在ffmpeg中可以很方便的將字幕和視頻進(jìn)行整合:
在我的硬盤內(nèi)有一個(gè)名為movie.mkv
的電影文件和一個(gè)名為sub.srt
的字幕文件工育,在終端輸入如下命令:
ffmpeg -i movie.mkv -i sub.srt -c:s copy -c:v copy -c:a copy output.mkv
等待程序運(yùn)行完成后虾宇,得到了一個(gè)名為output.mkv
的視頻文件,打開播放后翅娶,并沒有出現(xiàn)字幕文留,但是在播放器里可以看到一個(gè)字幕流,于是我使用ffprobe檢查了這兩個(gè)視頻文件:
movie.mkv:
MycBook:Downloads simon$ ffprobe moive.mkv
Input #0, matroska,webm, from 'movie.mkv':
...
...
Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 1920x1040, SAR 1:1 DAR 24:13, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(fre): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)
Metadata:
title : DTS 5.1
Stream #0:2(fre): Subtitle: subrip (default) (forced)
Metadata:
title : Forced
output.mkv:
MycBook:Downloads simon$ ffprobe output.mkv
Input #0, matroska,webm, from 'output.mkv':
...
...
Stream #0:1(fre): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s (default)
Metadata:
title : DTS 5.1
DURATION : 01:33:20.681000000
Stream #0:2(fre): Subtitle: subrip (default) (forced)
Metadata:
title : Forced
DURATION : 00:10:53.068000000
原來是原來的視頻有一個(gè)詭異的字幕流竭沫,只有10分鐘燥翅,顯然我在讓ffmpeg自動(dòng)選擇時(shí),程序自動(dòng)選擇了原視頻中的字幕流蜕提,而我的字幕文件根本沒有被加載森书。找到了問題,那就手動(dòng)指定要抽取的字幕流好了,這時(shí)就需要用到-map
參數(shù):
ffmpeg -i movie.mkv -i sub.srt -map 0:v -map 0:a -map 1:s -c copy output.mkv
其中movie.mkv
的編號(hào)為#0
凛膏,sub.srt
的是#1
杨名,v
代表視頻流,a
代表音頻流猖毫,s
則代表字幕流台谍,程序會(huì)從#0
中抽取視頻流和音頻流、從#1
中抽取字幕流吁断,復(fù)制到output.mkv
中趁蕊。
另外,最后的copy
參數(shù)一定要加上仔役,否則ffmpeg會(huì)對(duì)音視頻流進(jìn)行重新編碼掷伙,將極大增加處理時(shí)間。
但是這時(shí)問題又出現(xiàn)了又兵,在運(yùn)行上述命令后任柜,程序出現(xiàn)報(bào)錯(cuò):
sub.srt: Invalid data found when processing input
使用less命令查看srt文件,原來是缺了一行沛厨,好在ffmpeg可以對(duì)字幕進(jìn)行修復(fù)宙地,執(zhí)行命令:
ffmpeg -fix_sub_duration -i sub.srt sub2.srt
所有文件準(zhǔn)備妥當(dāng),再重新進(jìn)行合并俄烁,得到的output文件成功嵌入了字幕文件绸栅!
ffmpeg -i movie.mkv -i sub2.srt -map 0:v -map 0:a -map 1:s -c copy output.mkv