视频点播之流媒体切片与cdn加速

在遇到视频项目时候,我们通常的做法是视频文件存储至本地服务器,并提供域名+文件名的方式提供给用户播放,在并发不大的情况下,是完全可以的,但是如果有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

你可能感兴趣的:(视频点播之流媒体切片与cdn加速)