我有一个文件夹在一堆MP4文件和字幕文件,每个下面的模式episode[num].mp4
和episode[num].ass
。
我编写了一个小的Shell脚本来自动将它们组合到MKV文件中:
for i in *.mp4; do
name=`echo $i | cut -d'.' -f1`;
mp4name="$name.mp4";
subname="$name.ass";
mkvname="$name.mkv";
ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
done
echo "Done";
打开生成的MKV文件之一后,VLC显示两个字幕轨道:
谁应该在这里责怪?FFmpeg,VLC还是我的又快又脏的脚本?我该如何解决这个问题?
FFmpeg不会两次添加字幕,但是VLC会自动检测.ass
目录中的文件并将其添加到可用字幕列表中。VLC查找与视频文件名称完全相同的资产(例如字幕文件),并将其加载到播放器窗口中以进行播放。
所以,如果你在玩GreatMovie.mkv
你有一个GreatMovie.ass
目录中的文件并播放,VLC将显示嵌入MKV文件字幕以及那GreatMovie.ass
被坐在旁边的该目录中的文件MKV。
现在我说这取决于您的最终目标。如果最终目标只是一个包含所有资产的合并MKV文件,则需要.ass
在完成后删除该文件。因此,我将通过rm -f "$subname";
在ffmpeg
命令后添加一个权限来修改您的脚本,如下所示:
for i in *.mp4; do
name=`echo $i | cut -d'.' -f1`;
mp4name="$name.mp4";
subname="$name.ass";
mkvname="$name.mkv";
ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
rm -f "$subname";
done
echo "Done";
或者,也许要创建一个completed_subs/
目录,然后在完成后将字幕移动到该目录。
for i in *.mp4; do
name=`echo $i | cut -d'.' -f1`;
mp4name="$name.mp4";
subname="$name.ass";
mkvname="$name.mkv";
ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
mkdir -p "completed_sub";
mv $subname "completed_sub/$subname";
done
echo "Done";
这样,您就可以从处理目录中删除字幕,因此查看MKV文件将仅显示嵌入在MKV文件中的字幕资产,而独立的字幕.ass
文件现在位于中completed_sub/
。因此,您不仅可以查看完成的内容,还可以保留独立的字幕文件(如果将来以某种方式需要它们)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句