同社は、後者が多くの問題を使用しているが、そう後で使用するためにmp3ファイルを変換する必要があり、AMRオーディオファイルの種類あるうちのいくつかのファイルアリ雲OSSの一部にプロジェクトを置きます。ffmpegのプロセスを使用したいと考えていましたが、ファイルはトランスコーディング後に、リモートからダウンロードしたファイルする必要があり、アリクラウド上のリターンを再ますffmpegのを使用して、アリクラウドOSSに保存されている、だけでなく、メッセージコンポーネント通知およびトランスコーディングを使用する必要がありますこれは、サーバー上の大きな圧力となります。アリ迅速にメディアトランスコーディングサービスの直接の使用など、クラウド、アリ雲が唯一のOSS DotNetのライブラリを提供し、MTSを提供していない、それだけで開発し、独自のAPIライブラリや他の言語を参照することができますが、幸いMTS APIは、取得するためのいくつかの試みの後、非常に複雑ではありません。
関連パラメータはアリクラウドコンソールから取得する必要があります。
アリクラウドメディアトランスコーディングサービスカテゴリ:
/// <要約> ///阿里云媒体转码服务助手类。 /// </要約> パブリッククラスMediaTranscodeHelper { プライベート静的読み取り専用エンコードエンコードタイプ= Encoding.UTF8。 プライベート静的読み取り専用文字列アルゴリズム=「HmacSHA1」。 プライベート静的読み取り専用文字列HTTP_METHOD =「GET」。 プライベート静的な読み取り専用の文字列SEPARATOR =「&」; EQUAL =「=」プライベート静的読み取り専用文字列。 プライベート静的な読み取り専用の文字列ISO8601_DATE_FORMAT = "YYYY-MM-dd'T'HH:MM:ss'Z」"。 RegionId =「CN-北京」プライベート静的読み取り専用文字列。 プライベート静的な読み取り専用の文字列バージョン= " プライベート静的な読み取り専用の文字列アクション=「SubmitJobs」; プライベート静的な読み取り専用の文字列フォーマット=「JSON」。 MtsDomain =「mts.cn-beijing.aliyuncs.com」プライベート静的読み取り専用文字列。 プライベート静的読み取り専用int型MaxRetryNumber = 3; プライベート静的読み取り専用のブール自動再試行=はtrue。 プライベート静的読み取り専用int型TimeoutInMilliSeconds = 100000; プライベート静的読み取り専用文字列AccessKeyId =「あなたAccessKeyId」。 プライベート静的な読み取り専用の文字列AccessKeySecret =「あなたAccessKeySecret」。 プライベート静的な読み取り専用の文字列PipelineId =「あなたPipelineId」。 /// <要約> ///提交转码任务。 /// </要約> /// <PARAM NAME = "で、inputFile"> /// <戻る>输出文件</戻り> パブリック静的文字列SubmitTranscodeJob(文字列で、inputFile、 列outputJob = String.Emptyを。 outputJob返します。 } /// <要約> ///提交转码任务。 /// </要約> 公共のタスク非同期<(BOOL成功、ストリング応答)> SubmitTranscodeJob() { ストリングSignatureNonce = Guid.NewGuid()。ToStringメソッド() ; VaRのparamers =新しい辞書<文字列、文字列> { { "アクション"、アクション}、 { "バージョン"、 "2014年6月18日"}、 { "AccessKeyId"、AccessKeyId}、 { "タイムスタンプ"、 { "のSignatureMethod"、 "HMAC-SHA1"}、 {" { "SignatureNonce"、SignatureNonce}、 { "フォーマット"、フォーマット}、 { "PipelineId"、PipelineId}、 { "入力"、 "{\"バケット\ "\ "\ OSS-CN-北京" \ \ "オブジェクト\": "ロケーション\" \ "charlesbeijngの\"、 "3.amr \"} \ "}、 { "OutputBucket"、 "charlesbeijng"}、 {" OutputLocation」、 "OSS-CN-北京"}、 { "出力"、 "[{\" OutputObject \ "\" "れるtemplateId \" \ "+ Guid.NewGuid()のToString()+" .MP3の\ ": "1a94dc364cec44708f00367938a0122f \"、\"場所\ \ ":[{\ "INPUTFILE \":{\ "バケット\":\ "charlesbeijngの\"、\ "場所\":\ "OSS-CN透かし\" \": "\" OSS-CN-北京\ -beijing \ "\ "オブジェクト\ ":\ "1.png \ "}、\" WaterMarkTemplateId \" \" c473de87d0504f44be7ebdac1667ab13 \"}]}]"} }。 試す { VAR応答=待つHttpGetAsync(URL); 文字列のURL = GetSignUrl(paramers、AccessKeySecret)。 int型retryTimes = 1; URL = GetSignUrl(paramers、AccessKeySecret)。 返信=が待つHttpGetAsync(URL); retryTimes ++; } IF(!string.IsNullOrEmpty(reply.response)) { VAR RES = JsonConvert.DeserializeObject <辞書<文字列、文字列>>(reply.response)。 IF(!RES = NULL && res.ContainsKey( "コード")&& "OK" .Equals(RES [ "コード"])) { リターン(真、reply.response)。 } リターン(偽、reply.response)。 リターン(偽、応答:ex.Message); } } /// <要約> ///同步请求。 /// </要約> /// <PARAM NAME = "URL"> </ param>の /// <リターン> </リターン> プライベート静的な文字列HTTPGET (文字列URL) { HttpWebRequestのREQ =(HttpWebRequestの)WebRequest.Create(URL)。 req.Method = HTTP_METHOD。 req.KeepAlive =はtrue。 req.UserAgent = "idui1"。 req.Timeout = TimeoutInMilliSeconds。 req.ContentType = "アプリケーション/ x-www-form-urlencodedで;のcharset = UTF-8"; HttpWebResponseのRSP = NULL; 試す { RSP =(HttpWebResponseの)req.GetResponseを(); { IF(rsp.CharacterSet = NULL!) { エンコーディングエンコーディング= Encoding.GetEncoding(rsp.CharacterSet)。 } キャッチ(WebExceptionのWebEx) { IF(webEx.Status == WebExceptionStatus.Timeout) { rsp.Close()。 } } (!RSP = NULL)場合 GetResponseAsString(RSP、エンコーディング)を返します。 } 他 { String.Emptyをを返します。 } } 他 { String.Emptyをを返します。 } } /// <要約> ///异步请求。 /// </要約> /// <PARAM NAME = "URL"> </ param>の /// <リターン> </リターン> 民間の非同期タスク< > HttpGetAsync(文字列のURL()のStatusCode、ストリング応答INT) { HttpClientHandlerハンドラ=新しいHttpClientHandler()。 handler.Proxy = NULL; handler.AutomaticDecompression = DecompressionMethods.GZip。 使用して(VARのhttp =新しいHttpClientを(ハンドラ)) { http.Timeout =新しいのTimeSpan(TimeSpan.TicksPerMillisecond * TimeoutInMilliSeconds)。 HttpResponseMessage応答= http.GetAsync(URL)を待ちます。 リターン((int型)response.StatusCode、待つresponse.Content.ReadAsStringAsync()); /// <まとめ> ///応答ストリームがテキストに変換されます。 /// </要約> /// <PARAM NAME = "RSP">応答ストリームオブジェクト</ PARAM> /// <PARAM NAME = "符号化">コード</ PARAM> /// <戻り値>応答テキスト</リターン> GetResponseAsString静的な文字列プライベート(HttpWebResponseのRSP、エンコーディングエンコーディング) { StringBuilderのStringBuilderの新しい新しい結果=(); ストリームストリーム= NULL; StreamReaderをリーダー= NULL; 試み { //は仕方のHTTP応答で文字ストリームを読み込む ストリーム= rsp.GetResponseStream() ; //rsp.Close(); リーダー新しい新しい= StreamReaderを(ストリーム、エンコーディング)が、 超えない256の各文字を読み取り、書き込む//文字列 のchar [] =新しい新しいチャーバッファー[256]; int型readBytes = 0; 一方((readBytes = reader.Read(バッファ、0、buffer.Length))> 0) { result.Append(バッファ、0、readBytes)。 } } キャッチ(WebExceptionのWebEx) { IF(webEx.Status == WebExceptionStatus.Timeout) { 結果=新規のStringBuilder(); } } 最後に { //释放资源 場合(リーダ= NULL!)reader.Close(); (もし!ストリーム=ヌル)stream.Close(); (もし!RSP =ヌル)rsp.Close(); } )(result.ToString返します。 } /// <要約> ///处理消息。 /// </要約> /// <PARAM NAME = "メッセージ">消息内容</ PARAM> パブリック静的ボイドHandlingMessage(ストリングメッセージ) { } /// <要約> /// /// </要約> /// <PARAM NAME = "のdateTime"> </ PARAM> /// <戻り> </戻り> プライベート静的文字列FormatIso8601Date(日時のdateTime) { datetimeオブジェクトを返します。 ToUniversalTime()ToStringメソッド( "YYYY-MM-dd'T'HH:MM:ss'Z""。、CultureInfo.CreateSpecificCulture( "EN-US" } /// <要約> ///签名 /// </要約> パブリック静的文字列SignString(ストリングのソース、列accessSecret) { 使用(VARアルゴリズム=新しいHMACSHA1(Encoding.UTF8.GetBytes(accessSecret.ToCharArray()))) { Convert.ToBase64Stringを返す(algorithm.ComputeHash(エンコード。 UTF8.GetBytes(source.ToCharArray())))。 } } プライベート文字列GetSignUrl(辞書<文字列、文字列>パラメータは、文字列accessSecret) { VAR imutableMap =新しい辞書<文字列、文字列>(パラメータ) { // { "タイムスタンプ"、FormatIso8601Date(DateTime.Now)} // { "のSignatureMethod"、 " // { "SignatureVersion"、 "1.0"}、 // { "SignatureNonce"、Guid.NewGuid()。ToStringメソッド()} // { "アクション"、アクション} // { "バージョン"、バージョン} // { "フォーマット"、フォーマット} // { "RegionId"、RegionId} }。 IDictionaryを<文字列、文字列> sortedDictionary =新しいSortedDictionary <文字列、文字列>(imutableMap、StringComparer.Ordinal)。 StringBuilderのcanonicalizedQueryString =新しいStringBuilderの(); foreachの(sortedDictionaryでのvar P) { canonicalizedQueryString.Append( "&" .Append(PercentEncode(p.Value))。 } のStringBuilder stringToSign =新規のStringBuilder(); stringToSign.Append(HTTP_METHOD)。 stringToSign.Append(セパレータ)。 stringToSign.Append(PercentEncode( "/")); stringToSign.Append(セパレータ)。 stringToSign.Append(PercentEncode(canonicalizedQueryString.ToString()サブストリング(1))。)。 文字列署名= SignString(stringToSign.ToString()、accessSecret + "&"); imutableMap.Add( "シグネチャ"、署名)。 ComposeUrl(MtsDomain、imutableMap)を返します。 } プライベート静的ストリングComposeUrl(列エンドポイント、辞書<文字列、文字列>パラメータ) { StringBuilderのurlBuilder =新しいStringBuilderの( "")。 urlBuilder.Append( "のhttp://").Append(エンドポイント)。 IF( "?" -1 == urlBuilder.ToString()IndexOfメソッド()) { urlBuilder.Append( "/?")。 } 文字列のクエリ= ConcatQueryString(パラメータ)。 urlBuilder.Append(クエリ).ToString()を返します。 } プライベート静的文字列ConcatQueryString(辞書<文字列、文字列>パラメータ) { IF(ヌル==パラメータ) { ヌルを返します。 } StringBuilderのSB =新規のStringBuilder(); sb.ToStringを返します(); } { 文字列キー= entry.Key。 文字列のval = entry.Value。 sb.Append(HttpUtility.UrlEncode(キー、Encoding.UTF8)); (!ヴァル= null)の場合は 、{ 。sb.Append( "=")アペンド(HttpUtility.UrlEncode(ヴァル、Encoding.UTF8)); } sb.Append( "&")。 } INT strIndex = sb.Length。 (parameters.Count> 0)であれば sb.Remove(strIndex - 1、1)。 パブリック静的文字列PercentEncode(文字列値) { StringBuilderのStringBuilderの=新規のStringBuilder(); 文字列text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -_〜。"; バイト[]バイト= Encoding.GetEncoding( "UTF-8")GetBytesメソッド(値)。 foreachの(文字Cでバイト) { IF(text.IndexOf(C)> = 0) { stringBuilder.Append(C); } 他 { 。stringBuilder.Append( "%")追加( String.Formatの(CultureInfo.InvariantCulture、 "{0:X2}"、 } } 戻りstringBuilder.ToString(); } /// <要約> /// HMAC-SHA1加密算法 /// </要約> /// <PARAM NAME = "キー">密钥</ param>の /// <PARAM NAME = "入力">要加密的串</ param>の /// <リターン> </リターン> パブリック静的文字列HmacSha1 (文字列キー、文字列入力) { バイト[] keyBytes = Encoding.UTF8.GetBytes(キー)。 バイト[] inputBytesの=のEncoding.UTF8.GetBytes(入力)。 HMACSHA1 HMAC =新しいHMACSHA1(keyBytes)。 バイト[] hashBytes = hmac.ComputeHash(inputBytes)。 Convert.ToBase64String(hashBytes)を返します。 } /// <要約> /// </要約> /// <PARAM NAME = "EncryptStr「>無地</ param>の /// <PARAM NAME = "キー">密钥</ param>の /// <リターン>加密后base64で编码的密文</リターン> 公共の静的な文字列の暗号化(文字列EncryptStr、文字列キー) { しようと { //バイト[] keyArray = Encoding.UTF8.GetBytes(キー); バイト[] keyArray = Convert.FromBase64String(KEY)。 バイト[] toEncryptArray = Encoding.UTF8.GetBytes(EncryptStr)。 RijndaelManaged RDEL =新しいRijndaelManaged { キー= keyArray、 モード= CipherMode.ECB、 パディング= PaddingMode。 ICryptoTransform cTransform = rDel.CreateEncryptor()。 バイト[] resultArray = cTransform.TransformFinalBlock(toEncryptArray、0、toEncryptArray.Length)。 Convert.ToBase64String(resultArray、0、resultArray.Length)を返します。 } キャッチ(例外) { NULLを返します。 } } パブリック静的文字列復号化(文字列toDecrypt、文字列キー) { バイト[] keyArray = Convert.FromBase64String(キー)。//将TestGenAESByteKey类输出的字符串转为バイト数组 バイト[] toEncryptArray = Convert.FromBase64String(toDecrypt)。 RijndaelManaged RDEL =新しいRijndaelManaged { キー= keyArray、 MODE = CipherMode.ECB、//必须设置为ECB パディング= PaddingMode.PKCS7 //必须设置为PKCS7 }。 ICryptoTransform cTransform = rDel.CreateDecryptor()。 バイト[] resultArray = cTransform.TransformFinalBlock(toEncryptArray、0、toEncryptArray.Length)。 Encoding.UTF8.GetString(resultArray)を返します。 } プライベート静的文字列BuildCanonicalizedQueryString(辞書<文字列、文字列>パラメータ) { //对参数进行排序 リストの<string> sortedKeys =新しいリスト<ストリング>(parameters.Keys)。 sortedKeys.Sort(); StringBuilderの温度=新しいStringBuilderの(); foreachの(sortedKeysにおけるVARキー) { //此处需要对キー和値进行编码 ストリング値=パラメーター[キー]。 temp.Append(セパレータ).Append(PercentEncode(キー))追加(EQUAL).Append(PercentEncode(値))。 } 。temp.ToString()サブストリング(1)を返します。 } プライベート静的ストリングBuildRequestURL(文字列署名、辞書<文字列、文字列>パラメータ) { //生成请求URL StringBuilderの動作温度=新しいStringBuilderの( "mts.cn-beijing.aliyuncs.com")。 temp.Append(HttpUtility.UrlEncode( "シグネチャ"、エンコードタイプ))、追加( "=")追加(署名)。 foreachの(パラメータのVARアイテム) { temp.Append( "&")追加(PercentEncode(item.Key))追加( "=")追加(PercentEncode(item.Value))。。。。 } )(temp.ToStringを返します。 } }
それにSubmitTranscodeJob直接呼び出されるメソッドを使用している場合。