使用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文件,将如下内容拷贝进去。
此处需注意的是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"
(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"
相关文章推荐
- 使用ffmpeg快速生成视频截图
- [.NET]c#.net程序中使用ffmpeg.exe来处理视频并生成上传视频的截图
- php 使用 ffmpeg 转换视频,截图,并生成缩略图
- 如何使用 FFmpeg 进行视频转码:字幕
- 使用ffmpeg快速生成视频截图
- 使用ffmpeg可以生成视频截图
- 使用ffmpeg可以生成视频截图
- php使用ffmpeg向视频中添加文字字幕的实现方法
- 使用ffmpeg快速生成视频截图
- php使用ffmpeg向视频中添加文字字幕
- php使用ffmpeg向视频中添加文字字幕
- [FFmpeg] Windows下使用ffmpeg为视频添加字幕
- 使用ffmpeg快速生成视频截图
- 使用ffmpeg快速生成视频截图
- PHP使用ffmpeg给视频增加字幕显示的方法
- php 使用 ffmpeg 转换视频,截图,并生成缩略图
- ubuntu使用ffmpeg把图片生成视频
- php 使用 ffmpeg 转换视频,截图,并生成缩略图
- php 使用 ffmpeg 转换视频,截图,并生成缩略图
- 使用ffmpeg快速生成视频截图