您的位置:首页 > 其它

使用ffmpeg生成硬字幕视频

2013-11-06 17:36 1266 查看
  一,框架

  (1)原视频解码:ffmpeg

  (2)ass字幕文件:自己找字幕,如果不是ass格式可以使用“Subtitle Workshop”软件进行转换(ass字幕可以自己控制字体、大小、位置等,感觉比在做硬字幕时比srt方便)

  (3)硬字幕滤镜:ffmpeg自带的ass字幕滤镜(前提是ffmpeg在编译时支持该字幕,试一下就知道支持不支持了)

  (4)视频压缩软件:x264(使用--profile high参数,可以提高视频兼容性)

  (5)视频打包:使用ffmpeg的mp4封装格式

  二,准备工作

  (1)安装ffmpeg、neroAacEnc、x264软件

  (2)配置ffmpeg的fonts.conf文件,即在ffmpeg安装目录下新建个空的fonts.conf文件,将如下内容拷贝进去。

<?xml version="1.0"?>
<fontconfig>

<dir>C:\WINDOWS\Fonts</dir>

<match target="pattern">
<test qual="any" name="family"><string>mono</string></test>
<edit name="family" mode="assign"><string>monospace</string></edit>
</match>

<match target="pattern">
<test qual="all" name="family" mode="not_eq"><string>sans-serif</string></test>
<test qual="all" name="family" mode="not_eq"><string>serif</string></test>
<test qual="all" name="family" mode="not_eq"><string>monospace</string></test>
<edit name="family" mode="append_last"><string>sans-serif</string></edit>
</match>

<alias>
<family>Times</family>
<prefer><family>Times New Roman</family></prefer>
<default><family>serif</family></default>
</alias>
<alias>
<family>Helvetica</family>
<prefer><family>Arial</family></prefer>
<default><family>sans</family></default>
</alias>
<alias>
<family>Courier</family>
<prefer><family>Courier New</family></prefer>
<default><family>monospace</family></default>
</alias>
<alias>
<family>serif</family>
<prefer><family>Times New Roman</family></prefer>
</alias>
<alias>
<family>sans</family>
<prefer><family>Arial</family></prefer>
</alias>
<alias>
<family>monospace</family>
<prefer><family>Andale Mono</family></prefer>
</alias>
<match target="pattern">
<test name="family" mode="eq">
<string>Courier New</string>
</test>
<edit name="family" mode="prepend">
<string>monospace</string>
</edit>
</match>
<match target="pattern">
<test name="family" mode="eq">
<string>Courier</string>
</test>
<edit name="family" mode="prepend">
<string>monospace</string>
</edit>
</match>

</fontconfig>


  此处需注意的是fonts.conf文件在存的时候使用ANSI编码(windows下如此,Linux下没有试过)

  然后配置环境变量(按我电脑上ffmpeg的安装目录是这样的):

    FC_CONFIG_DIR=C:\Program Files\ffmpeg

    FONTCONFIG_PATH=C:\Program Files\ffmpeg

    FONTCONFIG_FILE=fonts.conf

  (3)修改字幕文件,此处假设已经有现成的ass字幕文件,ass字幕文件格式可以去网上搜,我们可以得到我们想要的字体和大小。此处需要注意的是ass文件中PlayResX、PlayResY参数和字体大小联合作用决定最终绘制的图像上的字体大小。具体实现时可以使用ffmpg的-ss和-t参数先压缩一小段视频看下效果。

  此处最重要的是(至少在我的电脑上是这样的)要将ass文件变为UTF-8的编码格式,否则ffmpeg识别不出来,可以使用记事本另存为。

  三,开始压缩

  假设此处有原始视频src.avi,对应字幕sub.ass,我们要生成视频dst.mp4,使用x264进行两遍压缩,命令参数具体含义可能参考对应程序的help,实现处理时可能需要根据具体情况进行改变。

  ffmpeg -i "src.avi" -vf "ass=sub.ass" -f yuv4mpegpipe -an -v 0 - | x264 --bitrate 1536 --pass 1 --tune film --profile high --stats "01_pass1.stats" --demuxer y4m -o NUL -

  ffmpeg -i "src.avi" -vf "ass=sub.ass" -f yuv4mpegpipe -an -v 0 - | x264 --bitrate 1536 --pass 2 --tune film --profile high --stats "01_pass1.stats" --demuxer y4m -o 01_video.mkv -

  ffmpeg -i "src.avi" -vn -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -if - -br 192000 -ignorelength -of 01_audio.mp4

  ffmpeg -i 01_video.mkv -i 01_audio.mp4 -map 0:0 -map 1:0 -acodec copy -vcodec copy -f mp4 "dst.mp4"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息