在遇到视频项目时候,我们通常的做法是视频文件存储至本地服务器,并提供域名+文件名的方式提供给用户播放,在并发不大的情况下,是完全可以的,但是如果有10个人或者100个人访问时候,你的服务器一定会拖垮。
现在我来介绍一种大部分直播或者点播网站/app通用的HLS协议做法,如图:
必须条件:有自己的域名,七牛OSS与CDN,具体配置在本博客的网站加速之CDN与回源
第一步:
以七牛云举例:
当用户上传一段100秒的视频时,并不在本地存储,直传七牛云OSS存储
代码事例:
/*
*author:MJ.Shu
*time 2016/11/1 下午1:36
*All rights reserved
*/
public static function qiniu(Request $request){
$file = $request->file('file');
$auth = new Auth(self::$accessKey,self::$secretKey);
$token = $auth->uploadToken(self::$bucket);
$uploadMgr = new UploadManager();
$name = uniqid().'.'.$file->extension();
list($ret,$err) = $uploadMgr->putFile($token,$name,$file->getRealPath());
if($err !== null){
return ['code'=>1];
}else{
return self::transform($name);
}
}
这里负责上传具体文件
$uploadMgr->putFile($token,$name,$file->getRealPath());
如果成功开始调用转码服务,传入文件名
self::transform($name);
这里是具体的转码参数
public static function transform($fileName){
$auth = new Auth(self::$accessKey,self::$secretKey);
$pfop = new PersistentFop($auth,new Config());
$force = false;
$newName = date('Ymd').'/'.uniqid().'.m3u8';
$m3u8_cover = date('Ymd').'/'.uniqid().'.png';
$fops = "avthumb/m3u8/noDomain/1|saveas/".\Qiniu\base64_urlSafeEncode(self::$bucket.':'.$newName);
$fops = $fops.';vframe/png/offset/3/w/300/h/200|saveas/'.\Qiniu\base64_urlSafeEncode(self::$imgBucket.':'.$m3u8_cover);
list($id, $err) = $pfop->execute(self::$bucket,$fileName,$fops,self::$pip,self::$notifyUrl,$force);
if ($err != null) {
Log::info($err);
} else {
$m3u8_sign_url = $auth->privateDownloadUrl(self::$videoUrl.$newName.'?pm3u8/0/expires/43200',43200);
$video = new Video();
$video->old_url = $fileName;
$video->m3u8_url = $newName;
$video->q_id = $id;
$video->m3u8_cover = $m3u8_cover;
$video->m3u8_sign_url = $m3u8_sign_url;
$video->exp_time = time()+43000;
$video->save();
return ['code'=>0,'vid'=>$video->id];
}
}
定义转码后的m3u8索引文件名称
定义截图的名称
$newName = date('Ymd').'/'.uniqid().'.m3u8';
$m3u8_cover = date('Ymd').'/'.uniqid().'.png';
划重点:
这里要求七牛将视频转码,参数是要求是遵循HLS协议切片m3u8,100秒视频要求切成10段,每段10秒,产生10个TS文件,产生1个m3u8索引文件,当然七牛会根据关键帧位置切片
然后继续要求,在视频第三秒截图生产一个宽度300px,高度200的png文件作为缩略图
$fops = "avthumb/m3u8/noDomain/1|saveas/".\Qiniu\base64_urlSafeEncode(self::$bucket.':'.$newName);
$fops = $fops.';vframe/png/offset/3/w/300/h/200|saveas/'.\Qiniu\base64_urlSafeEncode(self::$imgBucket.':'.$m3u8_cover);
立即执行转码命令
$pfop->execute(self::$bucket,$fileName,$fops,self::$pip,self::$notifyUrl,$force);
算出加密的cdn链接,有效期为43200秒
$auth->privateDownloadUrl(self::$videoUrl.$newName.'?pm3u8/0/expires/43200',43200);
切完的m3u8文件,如图:
WechatIMG442.jpeg
m3u8索引文件继续定义ts文件
WechatIMG443.jpeg
网友评论