C#結合JavaScript實現上傳視頻到騰訊云點播平臺

目錄

需求

關鍵代碼

界面元素布局

C# 實現服務端的簽名類

上傳視頻的JS實現

視頻演示

小結


需求

在云培訓系統里,制作視頻課件是我們的主要工作之一,制作完成后如果將這些素材存儲到服務器并進行分發播放,是擺在我們面前的一個問題。最終我們選擇了騰訊云點播服務,其加速分發播放幾乎適用所有需要展示圖片或音視頻媒體內容的在線場景,借助遍布全球的大量 CDN 加速節點,在復雜的網絡環境也能提供高質量的媒體內容訪問服務。

上傳視頻功能,主要要解決兩個問題:

1、在服務端通過C#生成簽名和SDKID

2、在客戶端通過JavaScript上傳視頻到騰訊云點播服務器。

關鍵代碼

界面元素布局

放置一個DIV容器,包括 file 上傳控件(id:file1)、一個上傳進度條的灰色背景層(id:ajax_uploadFiles_curbg)、一個傳進度條的進度圖片(id:ajax_uploadFiles_curprogress)、一個提示文字層(id:tip),圖片及層采用絕對定位,并在上傳過程中計算進度值以決定進度圖片的寬度。

示例代碼如下:

<div>
<input type="file" accept=".mp4,.mp3" id="file1"  onchange="vUpload()" />
<img id="ajax_uploadFiles_curprogress" style="z-index:1;position:absolute;left:0px;top:4px;width:0px;height:12px" alt="" src="win7progress.jpg" />
<div id="ajax_uploadFiles_curbg" style="display:none;z-index:0;position:absolute;left:0px;top:4px;width:203px;height:12px;background-color:Gray"></div>
<div id="tip" style="z-index:0;position:absolute; font-size:9pt;left:205px;top:2px;height:12px;"></div>
</div>

C# 實現服務端的簽名類

上傳之前需要提供您的開發APPID和開發密鑰,以生成有效的簽名,才可以進行上傳操作,示例代碼如下:

public class Signature{public string m_strSecId;public string m_strSecKey;public int m_iRandom;public long m_qwNowTime;public int m_iSignValidDuration;public static long GetIntTimeStamp(){TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1);return Convert.ToInt64(ts.TotalSeconds);}private byte[] hash_hmac_byte(string signatureString, string secretKey){var enc = Encoding.UTF8; HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(secretKey));hmac.Initialize();byte[] buffer = enc.GetBytes(signatureString);return hmac.ComputeHash(buffer);}public string GetUploadSignature(){string strContent = "";strContent += ("secretId=" + Uri.EscapeDataString((m_strSecId)));strContent += ("&currentTimeStamp=" + m_qwNowTime);strContent += ("&expireTime=" + (m_qwNowTime + m_iSignValidDuration));strContent += ("&random=" + m_iRandom);byte[] bytesSign = hash_hmac_byte(strContent, m_strSecKey);byte[] byteContent = System.Text.Encoding.Default.GetBytes(strContent);byte[] nCon = new byte[bytesSign.Length + byteContent.Length];bytesSign.CopyTo(nCon, 0);byteContent.CopyTo(nCon, bytesSign.Length);return Convert.ToBase64String(nCon);}public string getSign(int SignValidSeconds){Signature sign = new Signature();sign.m_strSecId = secretId;   //開發IDsign.m_strSecKey = secretKey; //開發密鑰sign.m_qwNowTime = Signature.GetIntTimeStamp();sign.m_iRandom = new Random().Next(0, 1000000);sign.m_iSignValidDuration = SignValidSeconds;return rv = "{\"errcode\":0,\"sign\":\"" + sign.GetUploadSignature() + "\",\"sdkid\":\"1111111111\"}";    }}

調用 Signature類的 getSign(int SignValidSeconds) 方法生成簽名,參數為簽名有效期的秒數。?

上傳視頻的JS實現

實現功能之前需要引用一些必要的JS文件,我的資源下載鏈接地址:https://download.csdn.net/download/michaelline/88555774

//引用必要的三個js
<script src="jquery-3.2.1.min.js"></script><script src="es6-promise.auto.js"></script><script src="vod-js-sdk-v6.js"></script><script type="text/javascript">var sign = "";var sdkid="";var tcVod = null;var timer=null;var ws=0;var fileobj=document.getElementById('file1');var curbg=document.getElementById('ajax_uploadFiles_curbg');var progressBarWidth=parseInt(curbg.style.width,10);
//重新或嘗試獲取signfunction resign() {return sign;}
//與服務器API地址交互獲得簽名值和SDKID,有效時間為3600秒function getsign() {$.ajax({type: "Post",url: '<%=ViewState["apiurl"].ToString()%>',contentType: "application/x-www-form-urlencoded;charset=utf-8",data: {validSeconds: 3600},dataType: "json",success: function (res) {//返回的數據用data.d獲取內容   if (res.errcode == 0) {sign = res.sign;sdkid=res.sdkid;initTcVod();} else {alert('上傳暫時無法使用。');}},error: function (err) {alert(err);}});}getsign();  //獲取一次簽名值function timetip(off) {var z = parseInt(off / 60, 10);var y = off % 60;var mtip='';var stip='';if(z==0&&y!=0){stip=y+'秒';} else if (z != 0 && y == 0) {mtip = z +'分鐘';} else if (z != 0 && y != 0) {mtip = z + '分';stip = y + '秒';}  return mtip+stip;}//初始化騰訊上傳組件function initTcVod() {tcVod = new TcVod.default({getSignature: resign});}
//上傳視頻function vUpload(){ws=0;curbg.style.display='';timer=window.setInterval(function(){ws++},1000);var mediaFile = document.getElementById('file1').files[0];var uploader = tcVod.upload({mediaFile: mediaFile,mediaName:sdkid+mediaFile.name,});uploader.on('media_progress', function (info) {fileobj.style.display='none';document.getElementById('tip').innerHTML='已上傳'+ Math.round(info.percent*100)+'%(耗時'+timetip(ws)+')';document.getElementById('ajax_uploadFiles_curprogress').style.width=(progressBarWidth*info.percent)+'px';})uploader.on('media_upload', function (info) {window.clearInterval(timer);document.getElementById('tip').innerHTML='上傳成功!';執行后續操作...}else{}})}</script>
視頻演示

JS上傳視頻到騰訊云點播

小結

以上提供的代碼僅供參考,在實際的應用中,服務端 API URL 程序還需要身份驗證或即時令牌訪問等安全機制。

另外騰訊云媒體上傳還提供了多種上傳方式的SDK,具體可參考網址:https://cloud.tencent.com/document/product/266/9760

以上就是自己的一些分享,時間倉促,不妥之處還請大家批評指正!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM垃圾回收相關算法

目錄 一、前言 二、標記階段&#xff1a;引用計數算法 三、標記階段&#xff1a;可達性分析算法 &#xff08;一&#xff09;基本思路 &#xff08;二&#xff09;GC Roots對象 四、對象的finalization機制 五、MAT與JProfiler的GC Roots溯源 六、清除階段&#xff1a;…

基于PCA算法的點云平面擬合

平面擬合 1、平面擬合2、參考文獻3、相關代碼 1、平面擬合 PCA 是一種數學變換的方法&#xff0c;利用降維的思想在變換中保持變量的總方差不變&#xff0c;將給定的一組變量線性變換為另一組不相關的變量&#xff0c;并且使變換后的第一變量的方差最大&#xff0c;即第一主成分…

OpenCV將兩張圖片拼接成一張圖片

OpenCV將兩張圖片拼接成一張圖片 示例代碼1示例代碼2 可以用opencv或者numpy的拼接函數&#xff0c;直接將兩張圖拼接到一起&#xff0c;很簡單方便&#xff0c;參考代碼2&#xff0c;推薦此方式。新建圖片&#xff0c;將兩張圖片的像素值填充到新圖片對應位置上即可&#xff0…

leetcode 32最長有效括號 34在排序數組中查找元素的第一個和最后一個位置

32. 最長有效括號 給你一個只包含 ( 和 ) 的字符串&#xff0c;找出最長有效&#xff08;格式正確且連續&#xff09;括號子串的長度。 示例 1&#xff1a; 輸入&#xff1a;s "(()" 輸出&#xff1a;2 解釋&#xff1a;最長有效括號子串是 "()" 示例 2&a…

python 二分查找函數應用——bisect_left(nums,target),bisect_right(nums,target)

bisect_left(nums,target),bisect_right(nums,target)是python內置的函數&#xff0c;可以便捷的幫我們完成一些有序序列的查找工作&#xff0c;現在將用三個樣例進行講解演示 前提注意事項&#xff1a; 導入函數模塊 待處理序列必須有序&#xff01;&#xff01;&#xff0…

淺談WPF之各種Template

前幾天寫了一篇文章【淺談WPF之控件模板和數據模板】&#xff0c;有粉絲反饋說這兩種模板容易弄混&#xff0c;不知道什么時候該用控件模塊&#xff0c;什么時候該用數據模板&#xff0c;以及template和itemtemplate之間的關系等&#xff0c;今天專門寫一篇文章&#xff0c;簡述…

26 - 原型模式與享元模式:提升系統性能的利器

原型模式和享元模式&#xff0c;前者是在創建多個實例時&#xff0c;對創建過程的性能進行調優&#xff1b;后者是用減少創建實例的方式&#xff0c;來調優系統性能。這么看&#xff0c;你會不會覺得兩個模式有點相互矛盾呢&#xff1f; 其實不然&#xff0c;它們的使用是分場…

TC397 EB MCAL開發從0開始系列 之 [15.1] Fee配置 - 雙扇區demo

一、Fee配置1、配置目標2、目標依賴2.1 硬件使用2.2 軟件使用2.3 新增模塊3、EB配置3.1 配置講解3.2 模塊配置3.2.1 MCU配置3.2.2 PORT配置3.2.3 Fls_17_Dmu配置3.2.4 Fee配置3.2.5 Irq配置3.2.6 ResourceM配置4、ADS代碼編寫及調試4.1 工程編譯4.2 測試結果4.3 測例源碼->

2023年學習Go語言是否值得?探索Go語言的魅力

關注公眾號【愛發白日夢的后端】分享技術干貨、讀書筆記、開源項目、實戰經驗、高效開發工具等&#xff0c;您的關注將是我的更新動力&#xff01; 作為一門流行且不斷增長的編程語言&#xff0c;Go語言在2023年是否值得學習呢&#xff1f;讓我們來看看學習Go語言的好處以及為何…

Java使用Maven打包jar包的全部方式

1. spring-boot-maven-plugin插件&#xff08;在springboot項目中使用&#xff09; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals>…

1410.HTML 實體解析器

??題目來源&#xff1a; leetcode題目&#xff0c;網址&#xff1a;1410. HTML 實體解析器 - 力扣&#xff08;LeetCode&#xff09; 解題思路&#xff1a; 使用map存放特殊字符串及其應被替換為的字符串。然后遍歷字符串替換 map 中的字符串即可。 解題代碼&#xff1a; …

ubuntu 手動清理內存cache

/proc是一個虛擬文件系統&#xff0c;我們可以通過對它的讀寫操作來做為與kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件&#xff0c;來對當前kernel的行為做出調整。 那么我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。操作如下&#xff1a; …

富士康轉移產線和中國手機海外設廠,中國手機出口減少超5億部

富士康和蘋果轉移生產線對中國手機制造造成了巨大的影響&#xff0c;除此之外&#xff0c;中國手機企業紛紛在海外設廠也在減少中國手機的出口&#xff0c;2022年中國的手機出口較高峰期減少了5.2億部。 手機是中國的大宗出口商品&#xff0c;不過公開的數據顯示2022年中國的手…

每日OJ題_算法_雙指針_力扣202. 快樂數

力扣202. 快樂數 202. 快樂數 - 力扣&#xff08;LeetCode&#xff09; 難度 簡單 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為…

RT-Thread 線程間同步【信號量、互斥量、事件集】

線程間同步 一、信號量1. 創建信號量2. 獲取信號量3. 釋放信號量4. 刪除信號量5. 代碼示例 二、互斥量1. 創建互斥量2. 獲取互斥量3. 釋放互斥量4. 刪除互斥量5. 代碼示例 三、事件集1. 創建事件集2. 發送事件3. 接收事件4. 刪除事件集5. 代碼示例 簡單來說&#xff0c;同步就是…

PDF轉成圖片

使用開源庫Apache PDFBox將PDF轉換為圖片 依賴 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version> </dependency> <dependency><groupId>org.apache…

DockerHub 無法訪問 - 解決辦法

背景 DockerHub 鏡像倉庫地址 https://hub.docker.com/ 突然就無法訪問了,且截至今日(2023/11)還無法訪問。 這對我們來說,還是有一些影響的: ● 雖然 DockerHub 頁面無法訪問,但是還是可以下載鏡像的,只是比較慢而已 ● 沒法通過界面查詢相關鏡像,或者維護相關鏡像了…

JAVA 使用stream流將List中的對象某一屬性創建新的List

JAVA 使用stream流將List中的對象某一屬性創建新的List 1.stream流介紹 Java Stream是Java 8引入的一種新機制&#xff0c;它可以讓我們以聲明式方式操作集合數據&#xff0c;提供了更加簡潔、優雅的集合處理方式。Stream是一個來自數據源的元素隊列&#xff0c;并支持聚合操…

【Rxjava詳解】(二) 操作符的妙用

文章目錄 接口變化操作符mapflatmapdebouncethrottleFirst()takeconcat RxJava 是一個基于 觀察者模式的異步編程庫&#xff0c;它提供了豐富的操作符來處理和轉換數據流。 操作符是 RxJava 的核心組成部分&#xff0c;它們提供了一種靈活、可組合的方式來處理數據流&#xf…