萌咖大佬写出的一个视频转码切片后自动上传至国内cdn的脚本,脚本默认提供上传到语雀cdn的脚本、采用多线程上传,这里默认10线程,基本上可以很大程度上提高视频的播放速度。
教程来源:https://www.moerats.com/archives/1024/

项目源码
GitHub:https://github.com/MoeClub/Note/tree/master/ffmpeg

示例: 冰雪奇缘2 (无字幕视频源切片 + WebVTT格式外挂字幕 + 语雀CDN); 视频条可随意拖动.
示例地址: https://api.moeclub.org/Player/movie/Frozen.II.m3u8

1、安装ffmpeg

wget https://www.moerats.com/usr/down/ffmpeg/ffmpeg-git-$(getconf LONG_BIT)bit-static.tar.xz
tar xvf ffmpeg-git-*-static.tar.xz
mv ffmpeg-git-*/ffmpeg  ffmpeg-git-*/ffprobe /usr/local/bin/
rm -rf ffmpeg-git-*

2、安装脚本

#新建/opt/ffmpeg文件夹存放脚本等文件
mkdir /opt/ffmpeg && cd $_
#下载并运行脚本
wget https://raw.githubusercontent.com/MoeClub/Note/master/ffmpeg/Install.sh
bash Install.sh

3、启动播放器
由于切片生成m3u8文件后,需要播放器才能播放,而上传脚本也会自动推送m3u8文件到播放器根目录,所以这里可以配合一起用,当然自己会播放m3u8的也可以不用搭建,自行选择。

安装pip3:

#CenOS 7系统
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install python36 -y
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

安装依赖:

#进入到播放源码文件夹
cd /opt/ffmpeg/Player
pip3 install tornado

后台启动:

nohup python3 Player.py&

注意Player.py文件的MasterKey值需和publish.sh的Token值对应,别乱改就行。

4、脚本用法

#命令示例
bash /path/to/media.sh <不含特殊字符的文件名.mp4> [特殊选项]

#特殊选项: 数字;可选参数,默认为0
#0:自动根据文件比特率计算合适的切片大小。(目标文件大小小于20M,一般情况下没问题)
#1:强制重新编码,重新编码比特率为2400k。(一般用于非H264编码,文件切片,速度较慢)
#2:自定义切片时间,当为2时切片时间为3秒,当大于等于3时切片时间为特殊选项数字。

使用示例:

#进入视频所在目录
cd /root/movies
#默认模式切片
bash /opt/ffmpeg/media.sh rats.mp4
#强制重新编码
bash /opt/ffmpeg/media.sh rats.mp4 1
#极速模式, 设置2s一个切片(源文件为H264编码情况下)
bash /opt/ffmpeg/media.sh rats.mp4 2

5、播放示例

#查看推送到播放器这边的m3u8所有文件
http://ip:5866/Player/list

#播放list显示的根目录下的rats.m3u8文件
http://ip:5866/Player/rats.m3u8

上传到语雀CDN

提示:该方案可选,目前语雀默认免费10G,具体可参考官方说明。
先前往语雀官网注册一个账号→传送门,然后获取ctoken和session的值,这里说下大概获取方法,以谷歌浏览器为例。

登录后,F12进入控制台选择Network,随便点击一个以yuque开头的链接文件,再选择Cookies即可看到所需要的2个参数。
请输入图片描述

然后复制ctoken和session的值。

接下来查看语雀脚本→传送门,将脚本所有的内容复制替换到upload.sh脚本里面,并填入ctoken和session的值,保存即可,上传方法参考上面。

最后如果你是vps的话,就不建议强制转码,只切片就行了,不然长时间占用cpu的话,服务器可能会被ban,基本上大多数mp4都可以直接切片。

# 安装 ffmpeg .
# 上传: 修改 upload_xxxx.sh 文件并保存, 然后将文件重命名为 upload.sh 
# 发布: 修改 publish.sh 文件并保存.
# 限制: 修改 media.sh 文件头部 'MaxSize=N' (N 为单文件最大体积, 默认为: 5).
# 将 upload.sh, publish.sh, m3u8.sh, media.sh 放入同一个文件夹中.

# 用法 (相关文件设置好后,可以一键切片并发布到网站上.)
bash media.sh <不含特殊字符的文件名.mp4> [特殊选项]

# 特殊选项: 数字; 可选参数,默认为0;
# 0: 自动根据文件比特率计算合适的切片大小. (目标文件大小小于10M, 一般VBR编码方式下没问题.)
# 1: 强制重新编码. 重新编码比特率为 2400k .(一般用于非H264视频编码的文件切片,速度较慢)
# 2: 自定义切片时间. 当大于等于2时切片时间为特殊选项数字.
# 当在特殊选项前添加负号(如 -0, -1, -2)时: 强制清空切片目录及其他相关缓存, 否则当全部切片完成后再次运行时跳过切片步骤.

获取媒体文件时长

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 <File>

获取媒体文件大小

ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 <File>

获取媒体文件比特率

ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 <File>

获取视频文件编码

ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 <File>

视频文件直接切片

ffmpeg -i <File> -vcodec copy -acodec aac -bsf:v h264_mp4toannexb -map 0 -f segment -segment_list output.m3u8 -segment_time 10 output_%03d.ts

M3U8合成视频文件

ffmpeg -allowed_extensions ALL -i "meida.m3u8" -c copy "media.mp4"

分片时长计算(VBR, 大约)

分片时间 = (文件限制大小[M] * 1024 * 1024) / (媒体文件比特率[b] * 突发码率比率 / 8)
突发码率比率: 1.35 (视情况取值, 大于等于1) 

字幕格式转换(webvtt.org)

最后编辑:2021年05月05日

发表评论

正在加载 Emoji