直播实时转码demo

最近更新时间: 2017-06-08 14:34:27

说明:

Q:如何开启实时转码?

A:开启实时转码, 前需要直接调 七 的API接 : 修改流转码配置 修改转码配置。 推流开始时如果有转码配置会触发转码,推流过程中修改转码配置 会 即 效,需要重新推流。 推流过程中,在直播地址后 添加 @ 即可播放转码流。 : 流的直播地址是 rtmp://live-rtmp.test.com/PiliSDKTest/streamkey, 是 720p,则对 应转码流的直播地址是 rtmp://live-rtmp.test.com/PiliSDKTest/streamkey@720p 规格 请求包:

POST /v2/hubs//streams/safeurlbase64encode(streamname)/converts
Host: pili.qiniuapi.com
Authorization:
Content-Type: application/json
{
“converts”: [“”, ...]
}
converts: 数组,转码配置。
返回包:
200 {}
400 {
“error”: “invalid stream key” // 只能修改原始流,包含@的流 允许
}
400 {
“error”: “invalid args” // 转码配置 存在
}
612 {
“error”: “stream not found”
}

实例 请求包:

POST /v2/hubs/9527/streams/dGVzdGNvbnZlcnRz/converts HTTP/1.1
Host: pili.qiniuapi.com
User-Agent: pili-sdk-go/v2 go1.6 darwin/amd64
Content-Length: 28
Authorization: Qiniu 9roGzeeJkZh4y5gHpzT7Uv1CIw0KiVV8K4dfXRY0:prhwnWzN8A3lHHcdKXOukHRSVuQ=
Content-Type: application/json
X-Reqid: 5ugAAHlh58T9i1wU
Accept-Encoding: gzip
{“converts”:[“720p”,“480p”]}
返回包:
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json
Date: Wed, 29 Jun 2016 11:58:20 GMT
X-Log: PILI:2;vs.i/vstream: stream already exists;ZEUSD:2/614;vs.u;ZEUSD:2;PILI-LINA:11
X-Reqid: 5ugAAHlh58T9i1wU
{}

Q:如何使 实时转码? A:如上述接 所示,每 次调 接 ,实际是上是针对你的 个具体的直播流。即在你直播推流之前,先调 上述接 ,指定 种转码的规格:即 ProfileName 前预设的ProfileName 有: 480p 、 720p 、 180p 、 90p

Q:转码后的流也可以 动存储以及回放吗? A:是的,转码后的流,也属于 新的流,和原始流享有相同的功能

Q:我想修改转码配置如何操作? A:即继续调 最开始提供的那个接 即可,最后针对你的单个流,提交完接 ,流就会适应最后提交接 的时候 所有的ProfileName (取消该 流转码的话,那么ProfileName为空数组即可) 第 条是 怎么修改php 直播sdk 去操作实时转码 第 条是请求格式及说明 说明: 实时转码只要触发单 流情况 所以针对的是流对象 在推流前触发 没有针对hub级别的操作 怎么查 流是否开启实时转码

192.168.200.033.61877-123.059.063.003.00080: GET /v2/hubs/panda- xingyan/streams/MjI5OGU3OGFjOTQxM2EyZDBhOWJjMmFkNWI4NTkyNWI= HTTP/1.1
Host: pili.qiniuapi.com
Accept: */*
Accept-Encoding: deflate, gzip
User-Agent: pili-sdk-php/2.0.0 curl/7.45.0 PHP/7.0.2
Authorization: Qiniu F3tyZTX-Eit5GgD59iWo-lYXcp2kL1nTe8rXPqv-:rBKeF-HYKazZ7wDLo2g-e3hgIQo=
123.059.063.003.00080-192.168.200.033.61877: HTTP/1.1 200 OK Server: nginx/1.8.0
Date: Tue, 27 Dec 2016 03:18:11 GMT
Content-Type: application/json
Content-Length: 214
Connection: keep-alive
X-Log: PILI:1;vs.f;PILI-ZEUSD;PILI-LINA:3 X-Reqid: ZccmauVec91hWF9O
X-Reqid: ZccmauVec91hWF9O
{"createdAt":1482373425,"updatedAt":1482801409,"expireAt":1490663809,"disabledTill":0,"converts": ["panda_480p","panda_720p"],"publishSecurity":"pandaMd5","publishKey":"5BD2DED19C3C57E5-159A1083D99D74DA-XINYANPUSH"}

php

phpV2版本

php 的源码 在/Lib/Qiniu/Pili/stream.php 修改PHP的源码加下这个函数

public function gettran(){
$url = $this->_baseUrl . "/converts";
$a = array("converts"=>array("720p","480p")); //请求的参数
$body = json_encode($a);
return $this->_transport->send(HttpRequest::POST, $url, $body); }

外部的调用

require(join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)), 'lib', 'Pili_v2.php'))); $ak = "Ib4CRWyIRVGHilI8ECRjlilTUsrUUvVah5jjtVPg";
$sk = "nUEVMeT9xVhwOZdb2nKQc2jno7hyAM_0nf26LEbC";
$hubName = "hugofortest";
$mac = new Qiniu\Pili\Mac($ak, $sk);
$client = new Qiniu\Pili\Client($mac);
$hub = $client->hub($hubName); $streamKey ="57c7fed7b1d1ff829c00459c"; $stream = $hub->stream($streamKey); var_dump($stream);
$stream->gettran();

V1的sdk的改写 /Lib/Pili/Api.php 添加函数

public static function gettrans($transport,$body,$key,$hub)
{
$url = sprintf("%s://%s/%s/hubs/%s/streams/%s", "http", "pili.qiniuapi.com", "v2”,$hub, Utils::base64UrlEncode($key));
return $transport->send(HttpRequest::POST, $url."/converts", $body); }

/Lib/Pili/Stream.php 添加函数

public function gettrans($convertsdata){ $url = $this->_baseUrl . "/converts";
$body = json_encode($convertsdata);
$ids = explode(".", $this->id);
return Api::gettrans($this->_transport,$body,$ids[2],$this->hub);
}

外部调用

$a = array("converts"=>array("720p","480p")); 
$stream->gettrans($a);

java

package com.qiniu.pili;
import com.qiniu.pili.utils.UrlSafeBase64; import okhttp3.*;
import java.io.IOException; import java.net.URL;
/**
* Created by Misty on 16/11/16. */
public class Convert {
private static String ak = "";
private static String sk = "";
private static OkHttpClient client ;
private String host = "http://pili.qiniuapi.com";
private static MediaType mediaType = MediaType.parse("application/json"); public static void main(String[] args){
Mac mac = new Mac(ak,sk); client = new OkHttpClient(); try {
URL url = new URL("http://pili.qiniuapi.com/v2/hubs/<hub>/streams/"+ UrlSafeBase64.encodeToString("firstStream".getBytes())+"/converts");
byte[] bodycontent = "{\"converts\":[\"720p\",\"480p\"]}".getBytes();
String token = "Qiniu "+mac.signRequest(url,"POST",bodycontent,"application/json"); System.out.println(token);
RequestBody requestBody = RequestBody.create(mediaType,bodycontent);
Request request = new Request.Builder().url(url).addHeader("Authorization",token).post(requestBody).build(); client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println(e.toString()); }
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body().toString());
response.body().close(); }
});
}catch (Exception e){ e.printStackTrace();
} }
}

go 语言使用

package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"net/http" "github.com/pili-engineering/pili-sdk-go.v2/pili" "strings"
)
const ( ACCESS_KEY = "" SECRET_KEY = "" HUB_NAME = ""
)
func main() { converts("mytest002")
}
func converts(title string) (errCode int) { errCode = -1
b64str := base64.URLEncoding.EncodeToString([]byte(title)) //http://pili.qiniuapi.com/v2/hubs/athmlive/streams/b64str_of_stream/converts
url := fmt.Sprintf("http://pili.qiniuapi.com/v2/hubs/%s/streams/%s/converts", HUB_NAME, b64str)
fmt.Printf("--> converts, url[%s]\n", url)
body := "{\"converts\":[\"720p\",\"480p\"]}" fmt.Printf("--> converts, body[%s]\n", body)
req, reqErr := http.NewRequest("POST", url, strings.NewReader(body)) if reqErr != nil {
fmt.Printf("--> saveFlv, request error, %s\n", reqErr.Error()) errCode = -1
return errCode
}
mac := pili.MAC{ACCESS_KEY, []byte(SECRET_KEY)} req.Header.Add("Content-Type", "application/json")
token, _ := mac.SignRequest(req)
//accessToken := fmt.Sprintf("QBox %s", token) accessToken := fmt.Sprintf("Qiniu %s", token) req.Header.Add("Authorization", accessToken)
resp, respErr := http.DefaultClient.Do(req)
if respErr != nil {
fmt.Printf("--> converts, response error, %s\n", respErr.Error()) errCode = -1
return errCode
}
defer resp.Body.Close()
rbody, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("--> converts, resp[%s]\n", string(rbody))
errCode = 0
return errCode }

shell

下载url 使 说明 档: var vI2xPIjOoh7udcRw4GdYNvf3o_gKsCx9wdZaC- ja76Ne-wCvo-YSc88D3TwKM5O3JtBym5is-YqjN z1.huxicongPili.586f51c910138599a82c3447 480p.720p 1 var AK SK 流id 转码参数 1

AK/SK 转码参数 流id
七的公钥秘钥 如果是两个值以点隔开 如 480p.720p 单 个的话 480p z1.hub名.流名 如 z1.huxicongPili.586f51c910138599a82c3447
以上内容是否对您有帮助?