骚操作!利用免费图床实现视频完美切片存储方案 —— 附自动化处理脚本
视频储存是很多人的一个难题,如果自己买个服务器又需要带宽有需要硬盘够大!@Kieng 利用免费图床实现视频切片完美存储,又是一个骚操作!
本文最后更新于 2020-04-21【1830 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!
视频储存是很多人的一个难题,如果自己买个服务器又需要带宽有需要硬盘够大!@Kieng 利用免费图床实现视频切片完美存储,又是一个骚操作!
操作思路
我也是偶然发现的。把视频切片成 m3u8
之后,视频会变成一段段的 ts
格式的视频。这个时候我想了一下。如果说某些图床有 bug
不验证文件格式,那么是不是就可以把切片视频放在他的服务器上进行播放了?
嘿嘿,没想到真的可以。当当当~ 他就是某里的“图床”。
这个其实不是什么图床,是某巴客服中一个漏洞,稳定几年了,很多什么图床网站就是用这个接口
具体实现
有了方案我们就试试吧。
直接上自动化脚本了:
<?php
$v_path = $argv[1]; //切片路径
$v_name = $argv[2]; //带切片的视频路径名称
$s = 5; //切片秒 ts 切片必须小于 5MB
if (empty($v_path) || empty($v_name)) {
echo "请填写完整参数";
exit;
}
if ($v_path == '/' || $v_path == '\\') {
$v_path = '';
} else {
mkFolder($v_path);
$v_path = $v_path . "/";
}
//这是 FFmpeg 处理命令大家自行更改
exec("ffmpeg -i $v_name -c copy -map 0 -f segment -segment_list " . $v_path . "playlist.m3u8 -segment_time $s " . $v_path . "player%03d.ts");
$m = file_get_contents('./' . $v_path . 'playlist.m3u8');
preg_match_all('/player(.*?)\.ts/', $m, $arr);
foreach ($arr[1] as $key => $value) {
echo "处理第" . $value . '个切片' . "\n";
$ali = upload('./' . $v_path . 'player' . $value . '.ts');
$m = str_replace('player' . $value . '.ts', $ali, $m);
file_put_contents('./' . $v_path . 'play.m3u8', $m);
}
echo "处理完毕" . "\n";
echo "播放链接为:/" . $v_path . 'play.m3u8';
function upload($file) {
$post['file'] = file_path($file);
$post['scene'] = 'aeMessageCenterV2ImageRule';
$post['name'] = 'player.jpg';
$rel = get_curl('https://kfupload.alibaba.com/mupload', $post, 'iAliexpress/6.22.1 (iPhone; iOS 12.1.2; Scale/2.00)');
$rel = json_decode($rel, true);
return $rel['url'];
}
function get_curl($url, $post = 0, $ua = 0) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 最大执行时间
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
$httpheader[] = "Accept:application/json";
$httpheader[] = "Accept-Encoding:gzip,deflate,sdch";
$httpheader[] = "Accept-Language:zh-CN,zh;q=0.8";
$httpheader[] = "Connection:close";
$ip = mt_rand(48, 140) . "." . mt_rand(10, 240) . "." . mt_rand(10, 240) . "." . mt_rand(10, 240); //随机 ip
$httpheader[] = 'CLIENT-IP:' . $ip;
$httpheader[] = 'X-FORWARDED-FOR:' . $ip;
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
if ($ua) {
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
} else {
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Linux; U; Android 4.0.4; es-mx; HTC_One_X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0");
}
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}
function mkFolder($path) {
if (!is_readable($path)) {
is_file($path) or mkdir($path, 0700);
}
}
function file_path($file) {
if (class_exists('CURLFile')) {
return $post['file'] = new \CURLFile(realpath($file));
} else {
return $post['file'] = '@' . realpath($file);
}
}
把这个另存为 m3u8.php
(什么名都成!这个就随便命名一下)
运行命令:
php m3u8.php 视频的储存路径 视频完整路径
如:
php m3u8.php mp4 wwwroot/test/test.mp4
注意: 这个接口只能上次小于 5MB 以下的图片(视频切片),所以切片完文件大小必须小于 5MB。
其次:PHP 本身就不适合写脚本,单线程处理,很慢。建议用 python 或者 java。
测试视频
<video id="video" controls="" preload="none">
<source id="mp4" src="https://www.imtqy.com/demo/ffmpeg-video-to-imgcdn/player.m3u8" type="application/x-mpegURL">
</video>
前往demo页进行观看效果以及播放速度吧:https://www.imtqy.com/demo/ffmpeg-video-to-imgcdn/
网站没安装视频插件,也没有使用 video.js、CKplayer、Dplayer 等 H5 视频播放器,视频无法播放,请至原博客查看播放效果~
m3u8 源文件下载:https://www.kieng.cn/player.m3u8
下载后可以利用 PotPlayer 进行播放
说明
- 优点:当然是速度快啊,都用了国内大厂的 CDN 加速了,能不快么
- 替代方案:即使这个方案不行了,只要有其他未对上传文件进行判断的图床都可以进行此操作
- 本文转载自:视频完美切片存储方案 附自动化处理脚本 - https://blog.kieng.cn/1844.html
- 其他参考:https://www.hostloc.com/thread-626638-1-1.html
本文作者:Quanyin Tang
本文链接:骚操作!利用免费图床实现视频完美切片存储方案 —— 附自动化处理脚本 - https://www.imtqy.com/ffmpeg-video-to-imgcdn.html
版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
评论审核?
好方法,顶一下
太牛了
测试视频并不能播放呀
文章里提了,网站没安装 H5 视频播放器,视频肯定无法播放,上面的那个就是装个样子而已,测试效果的话,到原博客查看吧~