美文网首页
视频点播之流媒体切片与cdn加速

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

作者: 隔岸坐看云卷云舒 | 来源:发表于2019-03-26 12:52 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/izlgvqtx.html