過去ログはアリクラウドメディアトランスコーディングサービスを呼び出します

同社は、後者が多くの問題を使用しているが、そう後で使用するために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直接呼び出されるメソッドを使用している場合。

おすすめ

転載: www.cnblogs.com/weisenz/p/11308806.html