001-視頻:m3u8多碼率自適應

多碼率自適應轉(zhuǎn)碼:隨著播放器(終端)網(wǎng)絡帶寬的變化動態(tài)選擇適應的碼率播放
視頻平臺:七牛云
說明:對已經(jīng)上傳到七牛云的視頻轉(zhuǎn)碼成包含多種碼率的HLS視頻流。以便能隨著終端網(wǎng)絡帶寬的變化動態(tài)選擇適應的碼率播放。

多碼率自適應轉(zhuǎn)碼:https://developer.qiniu.com/dora/manual/1245/multiple-rate-adaptive-transcoding-adapt
普通音視頻轉(zhuǎn)碼:https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb

情況說明:

  1. 七牛云上有一批視頻(mp4格式)所在空間名為Abucket
  2. 現(xiàn)在要將這批視頻轉(zhuǎn)為流暢、標清、高清三種m3u8文件格式并且將轉(zhuǎn)好的新文件存儲到空間名為Bbucket
  3. 還要實現(xiàn)多碼率自適應(隨著播放器(終端)網(wǎng)絡帶寬的變化動態(tài)選擇適應的碼率播放
  4. 還有要滿足用戶可以手動選擇是播放流暢、標清、高清

1. 前期準備:

        use Qiniu\Auth;
        use Qiniu\Processing\PersistentFop;

        //對已經(jīng)上傳到七牛的視頻發(fā)起異步轉(zhuǎn)碼操作
        $accessKey = getenv('QINIU_ACCESS_KEY');
        $secretKey = getenv('QINIU_SECRET_KEY');
        $auth = new Auth($accessKey, $secretKey);

        //源文件bucket
        $bucket = getenv('QINIU_TEST_BUCKET');
        //目標文件bucket
        $video51XlBucket = getenv('Qiniu51xlVideoBucket'); 

2. 提取源文件名(支持url格式、文件路徑)、設置目標文件名

        // 源文件名
        $sourceKey = 'http://out-001.yunfeng365.com/test-001.mp4';

        // 目標文件名
        $targetKey = pathinfo($sourceKey, PATHINFO_FILENAME);

        //要轉(zhuǎn)碼的文件所在的空間和文件名。從url中提取
        $info = pathinfo(ltrim(parse_url($sourceKey)['path'],'/'));
        $dirname = ltrim($info['dirname'], '.');
        $dirname = $dirname ? $dirname . '/' : null;
        // 成功提取目標文件名
        $key = $dirname . $info['basename']; // test-001.mp4

3. 轉(zhuǎn)碼操作

        $config = new \Qiniu\Config();
        //$config->useHTTPS=true;
        $pfop = new PersistentFop($auth, $config);
        //要進行轉(zhuǎn)碼的轉(zhuǎn)碼操作。 http://developer.qiniu.com/docs/v6/api/reference/fop/av/avthumb.html
        $saves480p = \Qiniu\base64_urlSafeEncode($video51XlBucket . ":480p/{$targetKey}.m3u8");
        $saves360p = \Qiniu\base64_urlSafeEncode($video51XlBucket . ":360p/{$targetKey}.m3u8");
        $saves180p = \Qiniu\base64_urlSafeEncode($video51XlBucket . ":180p/{$targetKey}.m3u8");
        $fops = [
            "avthumb/m3u8/noDomain/1/segtime/15/r/30/vb/780k/s/865x480|saveas/{$saves480p}",
            "avthumb/m3u8/noDomain/1/segtime/15/r/30/vb/380k/s/640x360|saveas/{$saves360p}",
            "avthumb/m3u8/noDomain/1/segtime/15/r/25/vb/200k/s/320x180|saveas/{$saves180p}",
        ];

        // 轉(zhuǎn)碼另存
        list($id, $err) = $pfop->execute($bucket, $key, $fops, $pipeline);
        if (!empty($err)) return ['status' => 500, 'err' => $err];

為什么使用m3u8文件?

m3u8分為兩種文件,一種是頂級m3u8文件,一種是二級m3u8文件
頂級m3u8文件來存放自適應的二級m3u8文件
二級m3u8文件來存放ts切片文件
客戶端在播放頂級m3u8文件時,會選擇碼率高的流,當碼流達不到時會請求碼率低的流

這里要注意下:

  1. 七牛云同一個地區(qū)可以轉(zhuǎn)m3u8并且將m3u8文件 、 TS切片文件一起另存到其它空間
  2. 七牛云多個操作的pfop使用數(shù)組,如本文一次將三種格式都轉(zhuǎn)碼
  3. 這一步是生成二級m3u8文件、ts切片文件
  4. 轉(zhuǎn)碼操作詳細手冊http://developer.qiniu.com/docs/v6/api/reference/fop/av/avthumb.html

4.多碼率自適應

        // 1. 多碼率自適應 https://developer.qiniu.com/dora/manual/1245/multiple-rate-adaptive-transcoding-adapt
//        $saves = \Qiniu\base64_urlSafeEncode($video51XlBucket . ":{$targetKey}.m3u8");
//        $fops = [
//            "adapt/m3u8/envBandWidth/200000,400000,800000/multiVb/200k,380k,780k/multiResolution/320:180,640:360,865:480/multiPrefix/{$targetKey}/hlstime/15"
//        ];

        // 2. 手動多碼率自適應
        // 生成上傳Token
        $token = self::$auth->uploadToken($video51XlBucket);
        $uploader = new UploadManager();

        $data = <<<EOF
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=200000
/180p/{$targetKey}.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000
/360p/{$targetKey}.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000
/480p/{$targetKey}.m3u8
EOF;
;
        list($ret, $err) = $uploader->put($token, "auto/{$targetKey}.m3u8", $data);
        if (!empty($err)) return ['status' => 500, 'err' => $err];
  1. 這一步是生成并上傳頂級m3u8文件,其內(nèi)容是上一步的二級m3u8文件

5. 結(jié)果處理

        $url = env('QiniuBucketFor51xlDomain', 'http://51xl-2.video.51nst.net/');
        return [
            'status' => 200,
            'data' => [
                'url' => $url,
                'auto' => $ret['key'],
                '180p' => "180p/{$targetKey}.m3u8",
                '360p' => "360p/{$targetKey}.m3u8",
                '480p' => "480p/{$targetKey}.m3u8",
            ]
        ];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容