C# 实现腾讯云点播之媒体上传常用接口

关于腾讯云点播媒体管理

腾讯云点播(Video On Demand)服务基于多年技术积累与基础设施建设,为有音视频应用相关需求的客户提供包括音视频存储管理、音视频转码处理、音视频加速播放、音视频加密、音视频AI能力的一站式解决方案,可通过云平台进行上传后的媒资管理。

目前云点播服务使用的是 API 3.0 版本,要使用腾讯云点播 API,需要先执行以下步骤:

  1. 在腾讯云 云点播控制台 开通腾讯云点播(VOD)服务。
  2. 在访问管理控制台中的 云 API 密钥 页面里获取 appid、secretid、secretkey 内容。
  3. 调用 API 执行操作。

本文将主要介绍如何使用云点播服务之媒体上传的常用接口实现。

开发前准备

(1)调用 API 之前,需要生成 HMAC-SHA1加密返回签名,请参考如下代码:

代码语言:javascript
复制
/// 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 类,创建及访问示例如下:

代码语言:javascript
复制
TCAcount tca = new TCAcount();
//应用ID
string secretId = tca.secretId;
//应用key
string secretKey = tca.secretKey;

(3) 用到两个时间戳函数,代码如下:

代码语言:javascript
复制
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 的功能,参考代码如下:

代码语言:javascript
复制
public static string SendRequest(string url, string completeUrl)
{
              ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
          request.Method = &#34;POST&#34;;
          request.ContentType = &#34;application/x-www-form-urlencoded&#34;;
          request.ProtocolVersion = HttpVersion.Version10;
          request.Host = url.Replace(&#34;https://&#34;, &#34;&#34;).Replace(&#34;/&#34;, &#34;&#34;);
          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

申请上传

ApplyUpload 方法用于申请媒体文件的上传,获取文件上传到云点播的元信息(包括上传路径、上传签名等),用于后续上传接口。其关键属性方法说明如下:

序号

参数

类型

说明

1

MediaType

string

媒体格式,包括: 视频:WMV、RM、MOV、MPEG、MP4、3GP、FLV、AVI、RMVB、TS、ASF、MPG、WEBM、MKV 、M3U8、WM、ASX、RAM、MPE、VOB、DAT、MP4V、M4V、F4V、MXF、QT、OGG。 音频:MP3、M4A、FLAC、OGG、WAV、RA、AAC、AMR。

2

MediaName

string

媒体名称,如 test.mp4

实现代码如下:

代码语言:javascript
复制
public string ApplyUpload(string MediaType, string MediaName)
{
string medianame = "";
if (MediaName != "")
{
medianame = "&MediaName=" + MediaName;
}
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=ApplyUpload{4}&MediaType={3}&Nonce={0}&Region=ap-beijing&SecretId={1}&SignatureMethod=HmacSHA1&Timestamp={2}&Version=2018-07-17",
nonce, secretId, timesTamp, MediaType,medianame);
//生成签名参数
// string requestText = settingUrl + "?" + paramsStr;
string requestText = "POST" + settingUrl.Replace("https://", "") + "?" + paramsStr;
//获得请求签名
string signText = GetHmacSha1Sign(secretKey, requestText);
//这里一定要进行URL编码,不然调用API会报错
signText = HttpUtility.UrlEncode(signText, Encoding.UTF8);
paramsStr = string.Format(@"Action=ApplyUpload{5}&MediaType={4}&Nonce={0}&Region=ap-beijing&SecretId={1}&Signature={2}&SignatureMethod=HmacSHA1&Timestamp={3}&Version=2018-07-17",
nonce, secretId, signText, timesTamp, MediaType,medianame);

            string resultStr = SendRequest(settingUrl, paramsStr);
            if (resultStr.IndexOf(&#34;VodSessionKey&#34;) != -1)
            {
                Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(resultStr);
                return jsonObj[&#34;Response&#34;][&#34;VodSessionKey&#34;].ToString();
            }
            return &#34;&#34;;

} //applyupload

确认上传

CommitUpload 方法用于确认媒体文件上传到腾讯云点播的结果,并存储媒体信息,返回文件的播放地址和文件 ID,其关键属性方法说明如下:

序号

参数

类型

说明

1

VodSessionKey

string

点播会话,取申请上传接口的 ApplyUpload 方法返回值 VodSessionKey。

实现代码如下:

代码语言:javascript
复制
public string CommitUpload(string VodSessionKey)
{
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=CommitUpload&Nonce={0}&Region=ap-beijing&SecretId={1}&SignatureMethod=HmacSHA1&Timestamp={2}&Version=2018-07-17&VodSessionKey={3}",
nonce, secretId, timesTamp, VodSessionKey);
//生成签名参数
// string requestText = settingUrl + "?" + paramsStr;
string requestText = "POST" + settingUrl.Replace("https://", "") + "?" + paramsStr;
//获得请求签名
string signText = GetHmacSha1Sign(secretKey, requestText);
//这里一定要进行URL编码,不然调用API会报错
signText = HttpUtility.UrlEncode(signText, Encoding.UTF8);

            paramsStr = string.Format(@&#34;Action=CommitUpload&amp;Nonce={0}&amp;Region=ap-beijing&amp;SecretId={1}&amp;Signature={2}&amp;SignatureMethod=HmacSHA1&amp;Timestamp={3}&amp;Version=2018-07-17&amp;VodSessionKey={4}&#34;,
                  nonce, secretId, signText, timesTamp, VodSessionKey);
            
            string resultStr = SendRequest(settingUrl, paramsStr);
            return resultStr;

} //CommitUpload

拉取上传

PullUpload 方法用于将一个网络上的视频拉取到云点播平台,其关键属性方法说明如下:

序号

参数

类型

说明

1

MediaUrl

string

要拉取的媒体 URL,暂不支持拉取 Dash 格式(可以支持 HLS)。 支持的扩展名如下: 视频:WMV、RM、MOV、MPEG、MP4、3GP、FLV、AVI、RMVB、TS、ASF、MPG、WEBM、MKV 、M3U8、WM、ASX、RAM、MPE、VOB、DAT、MP4V、M4V、F4V、MXF、QT、OGG。 音频:MP3、M4A、FLAC、OGG、WAV、RA、AAC、AMR。 请确保媒体 URL 可以访问,示例 :http://www.test.com/test.mp4

实现代码如下:

代码语言:javascript
复制
public string PullUpload(string MediaUrl)
{
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=PullUpload&MediaUrl={3}&Nonce={0}&SecretId={1}&SignatureMethod=HmacSHA1&Timestamp={2}&Version=2018-07-17",
nonce, secretId, timesTamp, MediaUrl);
//生成签名参数
// string requestText = settingUrl + "?" + paramsStr;
string requestText = "POST" + settingUrl.Replace("https://", "") + "?" + paramsStr;
//获得请求签名
string signText = GetHmacSha1Sign(secretKey, requestText);
//这里一定要进行URL编码,不然调用API会报错
signText = HttpUtility.UrlEncode(signText, Encoding.UTF8);

            paramsStr = string.Format(@&#34;Action=PullUpload&amp;MediaUrl={4}&amp;Nonce={0}&amp;SecretId={1}&amp;Signature={2}&amp;SignatureMethod=HmacSHA1&amp;Timestamp={3}&amp;Version=2018-07-17&#34;,
                  nonce, secretId, signText, timesTamp, MediaUrl);
            
            string resultStr = SendRequest(settingUrl, paramsStr);
            
            if (resultStr.IndexOf(&#34;TaskId&#34;) != -1)
            {
                Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(resultStr);
                return jsonObj[&#34;Response&#34;][&#34;TaskId&#34;].ToString();
            }
            return &#34;&#34;;

} //pullupload

小结

腾讯云点播服务 API 提供了非常丰富与完善的管理功能列表,在这里我们仅是以满足自身应用需要而提取的常用媒体上传管理功能,更多详情请参照如下链接:

https://cloud.tencent.com/document/product/266/31753

本文代码仅供您参考使用,您可以参照官方文档开发出更加贴合自身需求的应用,感谢您的阅读,希望本文能够对您有所帮助。