在Jellyfin或其他相关媒体库中,若影片源文件的字幕及音频有多条轨道,在播放时,服务器会更倾向实时转码,即将字幕与音频轨道烧录进视频文件,再发送给客户端进行播放,在多人使用时,服务器将难以承受多条客户端的转码请求,出现卡顿等现象,且服务器上传带宽不充足的情况下,同样不支持多人使用。
因此,需要使用FFmpeg工具对视频文件提前进行转码,使其在客户端播放时,使用“直接播放”方式,缓解服务器计算压力。再用CDN内容分发网络对站点进行加速,使转码后的视频文件在CDN服务商的各个节点中分布缓存,用户播放时,将从CDN节点中获取资源,缓解服务器带宽压力。
以下是我常用的FFmpeg转码命令,兼顾视频质量与兼容性。
ffmpeg \
-i "文件名" \
# 输入文件
-filter_complex \
# 使用复杂滤镜
"[0:s:0]scale=iw*0.8:-1[sub]; \
# 取第1个输入的第1条字幕流,若是第二条字幕,则是[0:s:1],宽度缩放到80%,可在测试后自行调整,高度按比例自动计算,结果命名为[sub]
[0:v][sub]overlay=x='(W-w)/2':y='H-h':shortest=1[outv]" \
# 将[sub]叠加到视频[0:v]上,水平居中,垂直贴底,任一输入结束则停止,输出命名为[outv]
-map "[outv]" \
# 输出滤镜处理后的视频
-map 0:a:0 \
# 输出第1个输入中的第1条音频流,格式要求与字幕相同
-c:v libx264 \
# 视频编码器使用 H.264/x264
-crf 20 \
# 视频质量参数,数值越小质量越高、体积越大,(18-28)
-preset medium \
# 编码速度与压缩率平衡预设(ultrafast superfast veryfast faster fast medium slow slower veryslow)
-threads 0 \
# 自动使用合适的线程数
-c:a aac \
# 音频转码为 AAC
-map_metadata 0 \
# 复制输入文件的元数据到输出文件
-map_chapters 0 \
# 复制章节信息
-t 60 \
# 只输出前 60 秒,可预先测试字幕选择是否正确及大小是否合适,最终转码时删除此行即可
"输出文件"
# 输出文件名,不可与原文件名相同,文件后缀建议与源文件相同




