• 告诉大家一个小秘密.域名后面加上 /siwa 发现不一样的世界…
  • 缓存测试2
  • 看看缓存好使不…
  • 啥时候是个头啊
  • 这特么又是哪个臭弟弟DD我呢?2020-02-12 12:15
  • 难受啊 马飞
  • 曾经自己 像浮萍一样无依
  • 说尼玛发工资还没信呢
  • 快走了…不算今天出除去周日还有5天!\(^o^)/
  • 还有半个月就走了…挺好的.

视频完美切片存储方案 附自动化处理脚本

PHP KIENG 4个月前 (12-22) 106419次浏览 已收录 32个吐槽 扫描二维码

视频完美切片存储方案 附自动化处理脚本

视频储存是很多人的一个难题…自己买个服务器又需要带宽有需要硬盘够大!

看看怎么是一个完美的存储.

开始操作

我也是偶然发现的。把视频切片成 m3u8 之后,视频会变成一段段的 ts 格式的视频。这个时候我想了一下。如果说某些图床又 bug 不验证文件格式,那么是不是就可以把切片视频放在他的服务器上进行播放了?

嘿嘿,没想到真的可以。当当当~ :lol: 他就是某里的“图床”。

这个其实不是什么图床,是某巴客服中一个漏洞,稳定几年了,很多什么图床网站就是用这个接口

有了方案我们就试试吧。

我直接上自动化脚本了:

<?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 本身就不适合写脚本,单线程处理,很慢.建议用 PY 或者 java(我不会,希望有大佬写一下),其他的自己看代码就能懂,其实没啥.

测试视频:


KIENG , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权
转载请注明出处:视频完美切片存储方案 附自动化处理脚本
本文章链接:https://blog.kieng.cn/1844.html
喜欢 (41)
KIENG
关于作者:
一个热衷网络的Man
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 快速获取昵称
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(32)个小伙伴在吐槽
  1. 大佬六六六。。。
    dforel2019-12-22 19:28 回复 Windows 10 | Chrome 79.0.3945.88
  2. php m3u8.php mp4 wwwroot/test/test.mp4前一个mp4是指的视频格式 后面的是指视频存放的路径吧?
    寒夜方舟2019-12-22 20:20 回复 Windows 10 | Chrome 79.0.3945.88
    • KIENG
      那个是文件的储存路径 把切片文件储存在 /mp4/切片文件.ts 这个意思
      KIENG2019-12-22 20:46 回复 Windows 10 | Chrome 79.0.3945.79
  3. 大佬 这个借口在哪里找的, 我用易语言写一个自动处理的程序
    熊猫2019-12-22 20:45 回复 Windows 7 | 搜狗浏览器 2.X
    • KIENG
      那个PHP处理脚本里有啊 你看看
      KIENG2019-12-22 20:53 回复 Windows 10 | Chrome 79.0.3945.79
    • KIENG
      写完发我一份.
      KIENG2019-12-22 20:55 回复 Windows 10 | Chrome 79.0.3945.79
      • OK可以
        熊猫2019-12-22 20:56 回复 Windows 7 | 搜狗浏览器 2.X
  4. i.loli.net/2019/12/22/lTyi4sOEMLZ2DXm.png大佬 我处理失败了 就centos7 yum install php和编译安装完ffmpeg ,请问有哪不对的吗?
    寒夜方舟2019-12-22 21:19 回复 Windows 10 | Chrome 79.0.3945.88
    • KIENG
      FFmpeg处理命令的问题,你可能没有安装对应的编码插件.建议百度一下FFmpeg安装插件
      KIENG2019-12-22 21:53 回复 Windows 10 | Chrome 79.0.3945.79
  5. 搞定了,谢谢博主
    寒夜方舟2019-12-23 01:04 回复 Windows 10 | Chrome 79.0.3945.88
  6. 求问 wp 用什么方法播放 m3u8 视频呢 试了几个插件,只是手机端可以播放,电脑端就黑屏了
    yu yan2019-12-23 13:26 回复 Windows 10 | Chrome 76.0.3809.87
    • KIENG
      我用的是DPlayer
      KIENG2019-12-23 13:41 回复 Linux | Chrome 57.0.2987.108
      • 大佬,图片上传的包在哪里抓的, 我易语言写的时候有点问题, 我要重新抓一下包
        熊猫2019-12-23 13:44 回复 Windows 10 | 搜狗浏览器 2.X
  7. 这个post 的数据转换成易语言怎么试都不行,博主您那有原始的抓包数据吗
    熊猫2019-12-23 16:57 回复 Windows 10 | 搜狗浏览器 2.X
  8. 大佬牛逼,会玩,可以转载么?
    Quanyin2019-12-23 18:19 回复 Windows 10 | Chrome 78.0.3904.108
    • KIENG
      可以 写下转载就行
      KIENG2019-12-23 18:23 回复 Windows 10 | Chrome 79.0.3945.79
  9. 能按大小切片就好了。
    心灵博客2019-12-26 20:22 回复 Mac OS X | Chrome 75.0.3770.80
  10. 请问怎么解决跨域,
    神秘人865奥本2020-01-19 00:44 回复 Windows 10 | Chrome 79.0.3945.88
  11. 为什么在浏览器不能正 常执行呢..上传那里 不能返回阿里地址.用命令行执行是正常的
    神秘人7262020-02-01 03:46 回复 Windows 10 | Chrome 78.0.3904.108
    • KIENG
      参数不对被
      KIENG2020-02-01 15:23 回复 Linux | Chrome 34.0.1847.114
  12. 现在是调整到正常了.但有个问题 切成3000文件 好像只能上传一半就503出错.如果切大点 只有300多个就正常那个最大执行时间调整成3000了.大佬能指导一下吗?
    ������인q��2020-02-01 15:47 回复 Windows 10 | Chrome 78.0.3904.108
    • KIENG
      这个文件大小有限制,必须小于5MB,所以切片大小必须小于5MB才行.这个我也没啥好思路.最好是用软件按照指定大小切片.我写的这个脚本是有这个问题的.
      KIENG2020-02-01 16:21 回复 Linux | Chrome 34.0.1847.114
  13. 友情提示, 第18行的命令不太友好哦~!会丢帧,不信的朋友可以测试下~!
    btjson2020-02-10 13:24 回复 Windows 7 | Chrome 77.0.3865.90
    • KIENG
      = =.PHP就不合适写脚本的. exec是危险函数. 就要就是思路和方法.
      KIENG2020-02-10 15:58 回复 Windows 10 | Chrome 79.0.3945.130
      • 哈哈,说的也是,不过这个可以用易语言制作出来多线程操作,会更快,但是不能频繁使用会被封IP :smile:
        btjson2020-02-11 14:27 回复 Windows 7 | Chrome 77.0.3865.90
    • 我自己测试的情况是,丢帧应该是文件大于5mb的情况下会丢帧,博主把源码共享出来以后很不错了,自己要排查问题
      牛逼plus2020-02-11 18:44 回复 Windows 10 | Chrome 76.0.3809.132
  14. 大佬,发现一个新问题,就是php文件里面那个控制秒数的没有用,导致跟多文件都大于5MB
    牛逼plus2020-02-11 22:43 回复 Windows 10 | Chrome 76.0.3809.132
  15. 看看
    clon2020-02-12 15:43 回复 Mac OS X | Chrome 80.0.3987.87
  16. 麻烦问一下博主,切片的时候提示下面这个有解决方法吗H.264 bitstream malformed, no startcode found, use the video bitstream filter 'h264_mp4toannexb' to fix it ('-bsf:v h264_mp4toannexb' option with ffmpeg)av_interleaved_write_frame(): Invalid data found when processing input
    明月清风2020-02-23 09:50 回复 Windows 10 | Chrome 69.0.3947.100
    • KIENG
      我这只是个思路而已.我没有进行过多的测试.可能会有很多的问题.希望您自己改改学习一下吧
      KIENG2020-02-23 16:07 回复 Windows 10 | Chrome 70.0.3538.25
  17. ffmpeg至少需要VPS吧?
    荔乡根子genzi.win2020-03-07 12:42 回复 Windows 7 | Chrome 80.0.3987.132
    • KIENG
      win也有ffmpeg啊.
      KIENG2020-03-07 15:59 回复 Windows 10 | Chrome 70.0.3538.25