目录
关于腾讯云点播媒体管理
腾讯云点播(video on demand)服务基于多年技术积累与基础设施建设,为有音视频应用相关需求的客户提供包括音视频存储管理、音视频转码处理、音视频加速播放、音视频加密、音视频ai能力的一站式解决方案,可通过云平台进行上传后的媒资管理。
目前云点播服务使用的是 api 3.0 版本,要使用腾讯云点播 api,需要先执行以下步骤:
本文将主要介绍如何使用云点播服务之媒体管理相关的常用接口实现。
开发前准备
(1)调用 api 之前,需要生成 hmac-sha1加密返回签名,请参考如下代码:
/// hmac-sha1加密返回签名
<param name="secret">密钥</param>
<param name="strorgdata">源文</param>
public static string gethmacsha1sign(string secret, string strorgdata)
{
var hmacsha1 = new hmacsha1(encoding.utf8.getbytes(secret));
var databuffer = encoding.utf8.getbytes(strorgdata);
var hashbytes = hmacsha1.computehash(databuffer);
return convert.tobase64string(hashbytes);
}
(2)secretid 及 secretkey 的获取在后续范例中均封装为 tcacount 类,创建及访问示例如下:
tcacount tca = new tcacount();
//应用id
string secretid = tca.secretid;
//应用key
string secretkey = tca.secretkey;
(3) 用到两个时间戳函数,代码如下:
public string gettimestamp(int seconds)
{
timespan ts = datetime.utcnow - new datetime(1970, 1, 1, 0, 0, 0, 0);
return convert.toint64(ts.totalseconds + seconds).tostring();
}
public string gettimestamp(datetime dtime)
{
timespan tspan = dtime.touniversaltime() - new datetime(1970, 1, 1, 0, 0, 0, 0);
return convert.toint64(tspan.totalseconds).tostring();
}
(4) sendrequest 方法实现访问 api url 地址并 post 数据,以获取返回结果 json 的功能,参考代码如下:
public static string sendrequest(string url, string completeurl)
{
servicepointmanager.securityprotocol = (securityprotocoltype)192 | (securityprotocoltype)768 | (securityprotocoltype)3072;
httpwebrequest request = (httpwebrequest)webrequest.create(url);
request.method = "post";
request.contenttype = "application/x-www-form-urlencoded";
request.protocolversion = httpversion.version10;
request.host = url.replace("https://", "").replace("/", "");
byte[] data = encoding.utf8.getbytes(completeurl);
request.contentlength = data.length;
stream newstream = request.getrequeststream();
newstream.write(data, 0, data.length);
newstream.close();
httpwebresponse response = null;
string content;
try
{
response = (httpwebresponse)request.getresponse();
streamreader reader = new streamreader(response.getresponsestream(), encoding.utf8);
content = reader.readtoend();
}
catch (webexception e)
{
response = (httpwebresponse)e.response;
using (stream errdata = response.getresponsestream())
{
using (streamreader reader = new streamreader(errdata))
{
content = reader.readtoend();
}
}
}
return content;
}
(5) 需要引用 newtonsoft.json.dll 动态链接库。
范例运行环境
操作系统: windows server 2019 datacenter
.net版本: .netframework4.0 或以上
开发工具:vs2019 c#
常用媒体管理api
删除媒体
deletemedia 方法用于删除媒体及其对应的视频处理文件(原始文件、如转码视频、雪碧图、截图、微信发布视频等),可单独删除指定 id 的视频文件下的原文件、转码视频、微信发布视频等(注意:原文件删除后,无法发起转码、微信发布等任何视频处理操作),方法返回字符串,为空则表示成功,否则返回 “error”,其关键属性方法说明如下:
序号 | 参数 | 类型 | 说明 |
---|---|---|---|
1 | fileid | string | 媒体文件的唯一标识。如:7447398156998994860 |
实现代码如下:
public string deletemedia(string fileid)
{
arraylist data = new arraylist();
tcacount tca = new tcacount("");
//请求地址
string settingurl = "https://vod.tencentcloudapi.com/";
//应用id
string secretid = tca.secretid;
//应用key
string secretkey = tca.secretkey;
//时间戳
string timestamp = gettimestamp();
//nonce
var nonce = new random().next(10000, 99999);
//拼接参数
string paramsstr = string.format(@"action=deletemedia&fileid={3}&nonce={0}®ion=ap-guangzhou&secretid={1}&signaturemethod=hmacsha1×tamp={2}&version=2018-07-17",
nonce, secretid, timestamp, fileid);
//生成签名参数
string requesttext = "post" + settingurl.replace("https://", "") + "?" + paramsstr;
//获得请求签名
string signtext = gethmacsha1sign(secretkey, requesttext);
//这里一定要进行url编码,不然调用api会报错
signtext = httputility.urlencode(signtext, encoding.utf8);
string text = httputility.urlencode(fileid, encoding.utf8);
paramsstr = string.format(@"action=deletemedia&fileid={4}&nonce={0}®ion=ap-guangzhou&secretid={1}&signature={2}&signaturemethod=hmacsha1×tamp={3}&version=2018-07-17",
nonce, secretid, signtext, timestamp, text);
string resultstr = sendrequest(settingurl, paramsstr);
if (resultstr.indexof("error") != -1)
{
return "error";
}
return "";
} //delete media
禁播媒体
forbidmediadistribution 方法对媒体禁播,除了点播控制台可以预览,其他场景访问视频各种资源的 url(原始文件、转码输出文件、截图等)均会返回 403,禁播/解禁操作全网生效时间约 5~10 分钟,该方法返回 arraylist,列表返回的是不成功或不存在的fileid,如果为0则表示禁播都已成功,其关键属性方法说明如下:
序号 | 参数 | 类型 | 说明 |
---|---|---|---|
1 | fileids | string | 要提交的禁播或恢复播放的 fileid 列表,每次最多可提交 20 个,以逗号进行分隔 示例值:"7447398156998994860,7447398156998994861" |
2 | stop | bool | 为 true 则表示禁播,为 false 则表示恢复播放 |
实现代码如下:
//禁播媒体,列表以逗号分隔,stop为true,则禁播,反之恢复,该操作可能有5到10分钟延迟,列表返回的是不成功或不存在的fileid,如果为0则都成功
public arraylist forbidmediadistribution(string fileids,bool stop)
{
arraylist data = new arraylist();
string operation = stop == true ? "forbid" : "recover";
if (fileids == "")
{
return data;
}
string[] fs = fileids.split(',');
string paras = "";
for (int p = 0; p < fs.length; p++)
{
paras += "&fileids." + p + "=" + fs[p];
}
tcacount tca = new tcacount("");
//请求地址
string settingurl = "https://vod.tencentcloudapi.com/";
//应用id
string secretid = tca.secretid;
//应用key
string secretkey = tca.secretkey;
//时间戳
string timestamp = gettimestamp();
//nonce
var nonce = new random().next(10000, 99999);
//拼接参数
string paramsstr = string.format(@"action=forbidmediadistribution{3}&nonce={0}&secretid={1}&signaturemethod=hmacsha1×tamp={2}&version=2018-07-17",
nonce, secretid, timestamp, paras);
//生成签名参数
string requesttext = "post" + settingurl.replace("https://", "") + "?" + paramsstr;
//获得请求签名
string signtext = gethmacsha1sign(secretkey, requesttext);
//这里一定要进行url编码,不然调用api会报错
signtext = httputility.urlencode(signtext, encoding.utf8);
paramsstr = string.format(@"action=forbidmediadistribution{4}&nonce={0}&secretid={1}&signature={2}&signaturemethod=hmacsha1×tamp={3}&version=2018-07-17",
nonce, secretid, signtext, timestamp, paras);
string resultstr = sendrequest(settingurl, paramsstr);
if (resultstr.indexof("notexistfileidset") != -1)
{
newtonsoft.json.linq.jobject jsonobj = newtonsoft.json.linq.jobject.parse(resultstr);
int total = jsonobj["response"]["notexistfileidset"].count();
for (int i = 0; i < total; i++)
{
data.add(jsonobj["response"]["notexistfileidset"][i].tostring());
}
return data;
}
return data;
} //stop media
获取媒体详细信息
describemediainfos 方法可以获取多个媒体文件的多种信息,每一个媒体文件表示一个mediafile 类,该类的说明和实现代码如下:
public class mediafile
{
public string fileid = ""; //fileid
public string mediaurl = ""; //媒体播放url
public string name = ""; //媒体名称
public string type = ""; //媒体分类
public string createtime = ""; //媒体创建时间
public string expiretime = ""; //媒体有效时间
public string vid = ""; //媒体vid
public string size=""; //媒体文件尺寸
public string duration=""; //媒体时间
public string bitrate=""; //媒体比特率
public string height=""; //媒体高像素
public string width=""; //媒体宽像素
public string rotate = ""; //媒体旋转角度
public mediafile()
{
}
}
describemediainfos方法的关键属性方法说明如下:
序号 | 参数 | 类型 | 说明 |
---|---|---|---|
1 | fileids | string | 要获以详情的 fileid 列表,每次最多可提交 20 个,以逗号进行分隔 |
实现代码如下:
public arraylist describemediainfos(string fileids)
{
arraylist data = new arraylist();
if (fileids == "")
{
return data;
}
string[] fs=fileids.split(',');
string paras = "";
for(int p=0;p<fs.length;p++)
{
paras += "&fileids."+p+"=" + fs[p];
}
tcacount tca = new tcacount("turing");
//请求地址
string settingurl = "https://vod.tencentcloudapi.com/";
//应用id
string secretid = tca.secretid;
//应用key
string secretkey = tca.secretkey;
//时间戳
string timestamp = gettimestamp();
//nonce
var nonce = new random().next(10000, 99999);
//拼接参数
string paramsstr = string.format(@"action=describemediainfos{3}&nonce={0}®ion=ap-guangzhou&secretid={1}&signaturemethod=hmacsha1×tamp={2}&version=2018-07-17",
nonce, secretid, timestamp, paras);
//生成签名参数
string requesttext = "post" + settingurl.replace("https://", "") + "?" + paramsstr;
//获得请求签名
string signtext = gethmacsha1sign(secretkey, requesttext);
//这里一定要进行url编码,不然调用api会报错
signtext = httputility.urlencode(signtext, encoding.utf8);
paramsstr = string.format(@"action=describemediainfos{4}&nonce={0}®ion=ap-guangzhou&secretid={1}&signature={2}&signaturemethod=hmacsha1×tamp={3}&version=2018-07-17",
nonce, secretid, signtext, timestamp,paras);
string resultstr = sendrequest(settingurl, paramsstr);
if (resultstr.indexof("metadata") != -1)
{
newtonsoft.json.linq.jobject jsonobj = newtonsoft.json.linq.jobject.parse(resultstr);
//"response":{"mediainfoset":[],"totalcount":0, "requestid":"85f181fc-d76f-42bb-82d8-7ac4d5ff432a"}}
int total = jsonobj["response"]["mediainfoset"].count();
for (int i = 0; i < total; i++)
{
mediafile mf = new mediafile();
try
{
mf.fileid = jsonobj["response"]["mediainfoset"][i]["fileid"].tostring();
mf.mediaurl = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["mediaurl"].tostring();
mf.name = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["name"].tostring();
mf.type = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["type"].tostring();
mf.vid = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["vid"].tostring();
mf.createtime = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["createtime"].tostring();
mf.expiretime = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["expiretime"].tostring();
mf.size = jsonobj["response"]["mediainfoset"][i]["metadata"]["size"].tostring();
mf.duration = jsonobj["response"]["mediainfoset"][i]["metadata"]["duration"].tostring();
mf.bitrate = jsonobj["response"]["mediainfoset"][i]["metadata"]["bitrate"].tostring();
mf.height = jsonobj["response"]["mediainfoset"][i]["metadata"]["height"].tostring();
mf.width = jsonobj["response"]["mediainfoset"][i]["metadata"]["width"].tostring();
mf.rotate = jsonobj["response"]["mediainfoset"][i]["metadata"]["rotate"].tostring();
data.add(mf);
}
catch (exception e) { }
}
return data;
}
return data;
} //detail media
查询媒体
searchmedia 方法可对已上传的媒体列表进行查询,可以获取多个媒体文件的多种信息,每一个媒体文件表示一个mediafile 类,类的设计请参照上节获取媒体详细信息,searchmedia 方法返回 arraylist,列表返回的查询到的 mediafile 类,其关键属性方法说明如下:
序号 | 参数 | 类型 | 说明 |
---|---|---|---|
1 | searchtext | string | 搜索文本,模糊匹配媒体文件名称或描述信息,匹配项越多,匹配度越高,排序越优先。长度限制:64个字符。 |
2 | starttime | string | 创建时间的开始时间,大于等于开始时间。格式按照 iso 8601标准表示,示例值:2020-09-07t00:00:00+08:00 |
3 | endtime | string | 创建时间的结束时间,小于等于结束时间。格式按照 iso 8601标准表示,示例值:2020-09-09t00:00:00+08:00 |
实现代码如下:
public arraylist searchmedia(string searchtext)
{
return searchmedia(searchtext, "", "");
}
public arraylist searchmedia(string searchtext, string starttime,string endtime)
{
string starttime = "";
if (starttime != "")
{
starttime = "&starttime=" + starttime;
}
string endtime = "";
if (endtime != "")
{
endtime = "&endtime=" + endtime;
}
arraylist data = new arraylist();
tcacount tca = new tcacount("");
//请求地址
string settingurl = "https://vod.tencentcloudapi.com/";
//应用id
string secretid = tca.secretid;
//应用key
string secretkey = tca.secretkey;
//时间戳
string timestamp = gettimestamp();
//nonce
var nonce = new random().next(10000, 99999);
//拼接参数
string paramsstr = string.format(@"action=searchmedia{4}&limit=5000&nonce={0}®ion=ap-guangzhou&secretid={1}&signaturemethod=hmacsha1{5}&text={3}×tamp={2}&version=2018-07-17",
nonce, secretid, timestamp,searchtext,endtime,starttime);
//生成签名参数
string requesttext = "post" + settingurl.replace("https://", "") + "?" + paramsstr;
//获得请求签名
string signtext = gethmacsha1sign(secretkey, requesttext);
//这里一定要进行url编码,不然调用api会报错
signtext = httputility.urlencode(signtext, encoding.utf8);
string text = httputility.urlencode(searchtext, encoding.utf8);
paramsstr = string.format(@"action=searchmedia{5}&limit=5000&nonce={0}®ion=ap-guangzhou&secretid={1}&signature={2}&signaturemethod=hmacsha1{6}&text={4}×tamp={3}&version=2018-07-17",
nonce, secretid, signtext, timestamp, text,endtime,starttime);
string resultstr = sendrequest(settingurl, paramsstr);
resultjson = resultstr;
if (resultstr.indexof("totalcount") != -1)
{
newtonsoft.json.linq.jobject jsonobj = newtonsoft.json.linq.jobject.parse(resultstr);
int total = int.parse(jsonobj["response"]["totalcount"].tostring());
for (int i = 0; i < total; i++)
{
mediafile mf = new mediafile();
try
{
mf.fileid = jsonobj["response"]["mediainfoset"][i]["fileid"].tostring();
mf.mediaurl = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["mediaurl"].tostring();
mf.name = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["name"].tostring();
mf.type = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["type"].tostring();
mf.vid = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["vid"].tostring();
mf.createtime = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["createtime"].tostring();
mf.expiretime = jsonobj["response"]["mediainfoset"][i]["basicinfo"]["expiretime"].tostring();
data.add(mf);
}
catch (exception e){ }
}
return data;
}
return data;
} //search media
请注意 searchmedia 方法 最多返回5000个查询结果,而且在查询时请尽量提供查询关键字。开始时间和结束时间可以为空字符串,这里用到了一次重载。
小结
腾讯云点播服务 api 提供了非常丰富与完善的管理功能列表,在这里我们仅是以满足自身应用需要而提取的常用媒体上传管理功能,更多详情请参照如下链接:
https://cloud.tencent.com/document/product/266/31753
本文代码仅供您参考使用,您可以参照官方文档开发出更加贴合自身需求的应用,感谢您的阅读,希望本文能够对您有所帮助。
发表评论