七牛云视频在线转码 - 持久化处理

更新日期: 2020-11-14 阅读次数: 15496 字数: 657 分类: CDN

最近在微信小程序上遇到一个诡异的问题,上传到七牛云的视频文件在所有手机上都能正常播放,但是在小米手机上,播放一段时间之后就会卡住不动,大概在 2:30 秒左右,100% 必现。然后,就在那里转圈,无法自动加载并播放视频。

同事试出一个解决方案,就是把视频在本地进行转码,然后再上传,就能解决。

但是,近一百个视频,每个视频转码需要 30 分钟,非常麻烦。所以想尝试一下七牛云的在线转码服务

七牛云的视频在线转码服务,即持久化处理。

持久化处理使用说明

https://developer.qiniu.com/dora/manual/3686/pfop-directions-for-use

持久化数据处理(pfop)机制用于满足这种处理时间较长的场景。开发者可使用该功能对音视频进行异步转码,并将转码结果永久存储于空间中,从而大幅提升访问体验。持久化数据处理功能还提供即时的处理状态通知和查询功能,因此开发者在开始执行音视频转码后还能随时获取转码进度信息。

持久化数据处理功能可以在以下两种场景触发:

  • 在资源上传过程中,自动触发处理流程。
  • 针对已存在空间中的资源,手动触发处理流程。

持久化的参数

工单咨询了一下七牛的官方工作人员,什么格式的视频能够在微信小程序上正常播放。

官方的回复是:

您好,如果您使用代码操作转码的话,建议直接 avthumb/mp4 即可。

找了个有问题的视频,转码之后,测试了一下,确实在小米手机上再也没有出现过卡住不动的情况。

七牛配置

在配置文件 config/filesystems.php 中

'notify_url'=> '',  //持久化处理回调地址

手动触发处理流程,修正已存在的问题视频

https://github.com/zgldh/qiniu-laravel-storage

// 注意,文件名需要 urldecode
$persistent_fop_id = $disk->persistentFop('yantai.mp4', 'avthumb/mp4');    //执行持久化数据处理
$disk->persistentStatus($persistent_fop_id);        //查看持久化数据处理的状态。

查询持久化处理状态,也可以使用 HTTP 链接的形式

http://api.qiniu.com/status/get/prefop?id=xxxx

{
  "code": 4,
  "desc": "Callback failed,url:xxx",
  "id": "xxx",
  "inputBucket": "test",
  "inputKey": "0.1.mp4",
  "items": [
    {
      "cmd": "avthumb/mp4",
      "code": 0,
      "desc": "The fop was completed successfully",
      "hash": "xxx",
      "key": "xxx",
      "returnOld": 0
    }
  ],
  "pipeline": "0.default",
  "reqid": "xxx"
}

上传过程中,自动触发处理流程

参考: https://github.com/qiniu/php-sdk/blob/4c4f9b819f420b77bc7313b7d5ee6d33f1139df6/examples/upload_tokens.php

$policy = array(
    'persistentOps' => $avthumbMp4Fop . ";" . $vframeJpgFop,
    'persistentPipeline' => "video-pipe",
    'persistentNotifyUrl' => "http://api.example.com/qiniu/pfop/notify",
);
$upToken = $auth->uploadToken($bucket, null, $expires, $policy, true);

所以,生成 uptoken 时,需要传入 persistentOps 和 persistentNotifyUrl 即可。

'uptoken' => QiniuStorage::disk('qiniu')->uploadToken(
    null, 60*60*24,
    $policy=array(
        'persistentOps' => 'avthumb/mp4',
        'persistentNotifyUrl' => env('APP_URL') . '/api/qiniu_pfop_callback'
    ))

注意,图片上传 token 跟视频上传 token 最好分开。

处理速度

1080P 的 10 分钟视频,基本10秒内就能处理完。速度还不错。

转码服务的收费标准

按照视频播放时长收费,我觉得还算合理。

七牛云视频在线转码 - 持久化处理

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式