多碼率自適應轉(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
情況說明:
- 七牛云上有一批視頻(
mp4格式)所在空間名為A的bucket - 現(xiàn)在要將這批視頻轉(zhuǎn)為
流暢、標清、高清的三種m3u8文件格式并且將轉(zhuǎn)好的新文件存儲到空間名為B的bucket上 - 還要實現(xiàn)多碼率自適應(
隨著播放器(終端)網(wǎng)絡帶寬的變化動態(tài)選擇適應的碼率播放) - 還有要滿足用戶可以手動選擇是播放
流暢、標清、高清
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文件時,會選擇碼率高的流,當碼流達不到時會請求碼率低的流
這里要注意下:
- 七牛云同一個地區(qū)可以轉(zhuǎn)m3u8并且將
m3u8文件 、 TS切片文件一起另存到其它空間 - 七牛云多個操作的
pfop使用數(shù)組,如本文一次將三種格式都轉(zhuǎn)碼 - 這一步是生成二級m3u8文件、ts切片文件
- 轉(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];
- 這一步是生成并上傳頂級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",
]
];