嘟嘟社区

自建视频源教程


本帖最后由 小猪佩奇 于 2022-8-15 22:30 编辑

个人的一点经验,写给需要的mjj,大佬轻喷
什么是视频源?
顾名思义,视频站的视频资源。不少网上流传的视频站源码,默认是不带视频源,拿到手后要么自建,要么采集。
为什么需要自建视频源?
毕竟天下没有免费的午餐,为了稳定和可控最终还是要走向自建。
那么如何自建?
这里默认站点已经搭好,至少为视频源准备一台大盘机,要求口子大,流量越多越好,回国线路可反代,对性能没什么要求,有条件可以上独服。准备一台高性能计算机(建议8c16t),用于视频压制,这里我用良心云448替代。
找资源
诸如RARBG、nyaa.si都是比较知名的bt站,根据需要尽可能找高质量的mp4,拉回来切片即可;如果还有加水印字幕的需求,那么我们还需要对视频进一步加工,继而我们选择高码率的BDrip,感兴趣还可以下BDMV(蓝光原盘)
自建视频源教程
找的资源没有字幕怎么办?没关系,相关字幕可以从伪射手获取,建议选择ass,字体和特效文件内指定,感兴趣的可以选择Aegisub进行调整。拿到字幕后别急着开工,先大致校对时间轴,无误后开始压制。
压制工具选择ffmpeg
下载和安装
前面的帖子讲过,将下载好的主程序放到任意文件夹,再把文件路径记录到环境变量中,就可以直接cmd调用ffmpeg了
解压程序包→复制ffmpeg主程序路径(一般在bin文件夹)→右键此电脑→属性→高级系统设置→环境变量→系统变量中的path,双击→新建→复制刚刚的路径

还是倾向于Linux?可以下载官方的静态文件,把主程序放到/usr/bin 文件夹内即可

最后在控制台输入ffmpeg,检查是否安装到位。

下载地址(选GPL且不建议10XXXX版)
WIN https://github.com/BtbN/FFmpeg-Builds/releases
Linux静态文件 https://johnvansickle.com/ffmpeg/

开始压制
将准备好的视频与字幕重命名,放在对应文件夹内。

win+r 打开cmd,复制文件夹路径,输入cd /d,然后右键粘贴路径,回车转到该目录。
根据需要进行测试
仅加字幕:

  1. ffmpeg -i test.mp4 -c:v libx264 -filter_complex "subtitles=test.ass" output.mp4

复制代码

加字幕与水印:

  1. ffmpeg -i test.mp4 -i logo.png -c:v libx264 -filter_complex "overlay=10:10,subtitles=test.ass" output.mp4

复制代码

#自备水印图片

解释下,libx264:使用avc编码,也就是所说的x264,为啥不用x265,当然也可以用,浏览器兼容性差些。
利用组合滤镜filter_complex,可以实现许多功能,比如新建幕布(color),叠加视频(overlay),导入视频(movie),拼接视频(concat)等。这里用到了overlay和subtitles,"overlay=10:10"即离左边界10像素,上边界10像素,坐标可自定。

  1. ffmpeg -i test.mp4 -ignore_loop 0 -i logo.gif -c:v libx264 -filter_complex "overlay=10:10,subtitles=test.ass" image_out.mp4

复制代码

#如果水印是动图,请加上"-ignore_loop 0"这个参数,否则动图播完一个循环就会停止。

优化参数
为了达到更理想的压制效果,仅用默认参数肯定是不够的。
转换色彩空间 -pix_fmt yuv420p,通通yuv420
设定压制速率为更慢 -preset:v slower 建议选慢,更慢,再不济也是中。画质将更好,压缩率也会更高。

设定等级-profile:v high -level 5.0 也就是high 5.0,等级越高支持的参数越多,理论压缩率越高,但兼容性越差。蓝光原盘,几乎都是main4.0。
接下来设定x264的详细参数,根据视频的具体情况设置,这里给个参考项。

  1. "cabac=1:ref=6:deblock=-2,-2,:me=tesa:me-range=32:subme=10:psy=1:bframes=8:b-adapt=2:keyint=300:keyint_min=1:scenecut=60:rc_lookahead=41:crf=19:qcomp=0.50:qpmin=0:qpmax=80:aq-mode=2:aq_strength=0.6"

复制代码

具体每个参数不一一解释,个人能力有限,难以科普到位。
了解下比较重要的几个选项:
crf=19,一般前面会接rc=crf(软件经常报错干脆不加了)CRF:恒定质量,只需知道由x264按需分配码率。默认23,值越大体积越小平均码率越低,值越小体积越大平均码率越高。
bframes=8,b帧也是影响体积的重要因素,数量越多压缩率越高,针对画面变动幅度小的视频,比如动画/人文/记录,应当尽量提高。画面波动越大,比如动作片科幻片,应当慎重使用,尽量调低。
keyint=300:keyint_min=1,即最大关键帧(I帧)与最小关键帧距,帧距越大压缩率越高,体积越小,但兼容性/流畅性可能越差,对于动画而已keyint_min可以设置为1,但真人电影,尤其是动作片,建议23(依具体效果而定)
me=tesa:me-range=32:subme=10,高质高压参数,就是非常慢
最后音频,统一设定为aac即可,质量按需调整 -c:a aac -q:a 6
整理成win下的批量脚本

  1. for %%a in ("*.mkv") do ffmpeg -i "%%~a" -i mjj.png -filter_complex "overlay=10:10,subtitles=’%%~na.ass’" -pix_fmt yuv420p -c:v libx264 -preset:v slower -profile:v high -level 5.0 -x264-params "cabac=1:ref=6:deblock=-2,-2,:me=tesa:me-range=32:subme=10:psy=1:bframes=8:b-adapt=2:keyint=300:keyint_min=1:scenecut=60:rc_lookahead=41:crf=19:qcomp=0.50:qpmin=0:qpmax=80:aq-mode=2:aq_strength=0.6"  -c:a aac -q:a 6 "%%~na.mp4"

复制代码

新建记事本,把代码粘贴上去,保存为xx.bat,放在视频文件夹双击运行即可。建议输出视频为绝对路径,"%%~na.mp4"可以改成"D:完成/%%~na.mp4"

上面的绿色的内容,提示字幕中字体的调用情况,左边为设定字体,右边为实际调用字体(系统中缺少相应字体)
最下方则是进度,依次为:帧数;当前帧率;当前质量;体积;已用时间;码率;速率(参考播放速率)

硬件编码
上述软件编码对CPU性能要求很高,想快也不是不可以,只不过得牺牲点画质和体积。
基本套路不变
编码器由libx264改为h264_qsv(英特尔核显),色彩空间换成nv12,代码如下

  1. for %%a in ("*.mkv") do ffmpeg -i "%%~a" -i mjj.png -filter_complex "overlay=10:10,subtitles=’%%~na.ass’" -pix_fmt nv12 -c:v h264_qsv -preset:v slower -q:v 19  -c:a aac -q:a 6 "%%~na.mp4"

复制代码

如果是英伟达,则调用h264_nvenc,应该大差不差(手上没卡,你们跑下吧):

  1. for %%a in ("*.mkv") do ffmpeg -i "%%~a" -i mjj.png -filter_complex "overlay=10:10,subtitles=’%%~na.ass’" -pix_fmt nv12 -c:v h264_nvenc -preset slow -quality best -rc vbr -cq 18 -c:a aac -q:a 6 "%%~na.mp4"

复制代码

N卡支持情况,有必要看下
https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new

切片
切片的优势:方便回源,节省流量,有助于应对网络波动,甚至可以加密防盗链(需要程序支持)
切片的劣势:不利于兼容,不方便管理,增加调用频率,增加工作量
切片不会影响画质(体积略微增大)
代码比较简单(代码简单,不是切片简单)

  1. ffmpeg -i input.mp4 -c:v copy -c:a copy -hls_time 6 -hls_list_size 0 -f hls "output/video.m3u8"

复制代码

-c:v copy -c:a copy:复制音视频流,故不影响画质
-hls_time 6 时长为6秒
-hls_list_size 0 设置0可以包含所有片段
建议写两个脚本,执行会方便些
先根据文件名新建文件夹

  1. for %%a in ("*.mp4") do md "%%~na"

复制代码

同样的,将脚本保存在压制好的视频目录执行
执行完后再切片

  1. for %%a in ("*.mp4") do ffmpeg -i "%%~a" -c:v copy -c:a copy -hls_time 6 -hls_list_size 0 -f hls "%%~na/video.m3u8"

复制代码

切出的ts文件与video.m3u8放在同一个目录。

后续流程
打包压缩,建议直接zip/tar,win端od同步,rclone到大盘机,解压到相应位置。
没有特别的需要,建个默认站点,签个证书,把视频资源放进去。
视频站直接调用目标m3u8即可播放。
利用手中线路好的小鸡反代,开缓存,时间设置为12小时以上,过期删除,访问量不大对磁盘的要求也不高。有条件的还可以分线解析,有的小鸡对移动友好,有的对电信友好,用户体验又会好些。

只不过这些流程已经跟不上时代了,压制也好,切片也罢权当了解下吧。

前排占位,M
顶一顶
mark
帮顶
支持技术分享   大家一起吃饭
收藏了,谢楼主分享
感谢分享
这些都容易,视频站点难点在于带宽和负载均衡,如果像netflix一样能够自适应设备播放高画质的更难