हेबर के सभी पाठकों को नमस्कार! मुझे उम्मीद है कि हर कोई नए साल की छुट्टियों से पहले ही दूर हो गया है और नए साल में उत्पादक काम शुरू करने के लिए तैयार है। मैं केवल इस मामले में सफलता की कामना कर सकता हूं।
आपको याद दिला दूं कि
पिछले साल मैंने माइक्रोसॉफ्ट और अमेज़ॅन से वीडियो क्लाउड प्रदाताओं के प्रसंस्करण के लिए सेवाओं की तुलना करने के लिए कार्य निर्धारित किया था। वैसे आज अमेजन इलास्टिक ट्रांसकोडर के साथ काम करने का वर्णन करने का समय है। तो चलिए!
इस तथ्य के बावजूद कि संस्करण 2.0 के साथ, .NET प्लेटफॉर्म पर अमेज़ॅन सेवाओं के साथ काम करने के लिए एसडीके ने सामान्य उपलब्धता स्थिति पर स्विच किया है, इसमें अभी भी कुछ कष्टप्रद कीड़े हैं। मैं उनके बारे में बताऊंगा जब हम इसी कार्यक्षमता के कार्यान्वयन में आते हैं। उनके आसपास जाने के लिए हमें UI या कमांड लाइन उपयोगिताओं के माध्यम से कई ऑपरेशन करने की आवश्यकता होती है। लेकिन सबसे पहली बात।
अमेज़न वेब सेवाएँ
इसलिए, स्टोरेज अकाउंट बनाने के लिए Amazon Elastic Transcoder का उपयोग करने से पहले हमें जो पहली चीज चाहिए वह है। यह रूपांतरण के लिए डाउनलोड की गई फ़ाइलों को संग्रहीत करेगा। विंडोज एज़्योर के समान, जहाँ फाइलें ब्लॉब्स में संग्रहीत की जाती हैं, अमेज़ॅन में, फ़ाइलों को बास्केट (बाल्टी) में संग्रहित किया जाता है। हमें एक बनाने की जरूरत है।
टोकरी बनाने के लिए, अमेज़न प्रबंधन कंसोल पर जाएँ और सेवाएँ -> संग्रहण और सामग्री वितरण -> S3 अनुभाग पर जाएँ।

इसके बाद, Create Bucket बटन पर क्लिक करके एक नई टोकरी बनाएं। दिखाई देने वाली विंडो में, हमें नई टोकरी (बकेट नाम) का नाम सेट करना होगा और डेटा सेंटर का चयन करना होगा जिसमें हमारे भंडारण की क्षमता आवंटित की जाएगी। Create बटन पर क्लिक करके टोकरी बनाना समाप्त करें।

साथ ही जब विंडोज एज़्योर के साथ काम करने के लिए, अमेज़ॅन सेवाओं के साथ काम करने के लिए, हमें खाता जानकारी की आवश्यकता होती है जो इन सेवाओं के साथ काम करने के अधिकार हैं। आइए एक नया उपयोगकर्ता बनाएं, जिसके पास अमेज़ॅन इलास्टिक ट्रांसकोडर के साथ काम करने की सुविधा होगी।
ऐसा करने के लिए, सेवाओं -> परिनियोजन और प्रबंधन -> IAM अनुभाग पर जाएं।

इसके बाद, Users -> Create New Users पर जाएँ।

दिखाई देने वाली विंडो में, हमें नए उपयोगकर्ता के नाम को इंगित करने के लिए कहा जाएगा। आप एक साथ कई उपयोगकर्ता बना सकते हैं। आपको यह भी सुनिश्चित करने की आवश्यकता है कि प्रत्येक उपयोगकर्ता चेकबॉक्स के लिए एक एक्सेस कुंजी उत्पन्न करें। हम Create बटन पर क्लिक करके आगे बढ़ते हैं।

फिर, दिखाई देने वाली विंडो में, हमें एक्सेस कुंजी आईडी और सीक्रेट एक्सेस कुंजी के मूल्यों की प्रतिलिपि बनाने की आवश्यकता है।

हम अमेज़ॅन इलास्टिक ट्रांसकोडर के साथ काम करने वाले हमारी कक्षा के स्थिरांक में कॉपी किए गए मानों को परिभाषित करेंगे, जैसा कि हमने विंडोज एज़्योर मीडिया सेवाओं के साथ काम करते समय किया था:
सार्वजनिक वर्ग ElasticTranscoderClient: IVideoConverter
{ private const string AccessKey = "ACCESS_KEY_ID"; private const string SecretKey = "SECRET_KEY"; }
अमेज़ॅन इलास्टिक ट्रांसकोडर
इसलिए, इससे पहले कि हम संबंधित वर्ग के लिए कोड लिखने के लिए सीधे जाएं, हमें अमेज़ॅन एसडीके विधानसभाओं को जोड़ने की आवश्यकता है। ऐसा करने के लिए, NuGet पैकेज मैनेजर का उपयोग करें। हमारी परियोजना के संदर्भ मेनू में, "NuGet संकुल प्रबंधित करें ..." का चयन करें। हम उचित पैकेज की तलाश कर रहे हैं:

प्रत्येक अमेज़ॅन सेवा के साथ काम करने के लिए, हमें एक उपयुक्त ग्राहक की आवश्यकता है। आइए ElasticTranscoderClient वर्ग के कंस्ट्रक्टर में संबंधित वस्तुओं के निर्माण की घोषणा करते हैं।
private readonly AmazonElasticTranscoderClient _elasticTranscoder; private readonly AmazonS3Client _s3Client; private readonly AmazonSQSClient _sqsClient; private readonly AmazonIdentityManagementServiceClient _iamClient; private readonly AmazonSimpleNotificationServiceClient _snsClient; public ElasticTranscoderClient() { var amazonRegion = RegionEndpoint.USWest2; _elasticTranscoder = new AmazonElasticTranscoderClient(AccessKey, SecretKey, amazonRegion); _s3Client = new AmazonS3Client(AccessKey, SecretKey, amazonRegion); _sqsClient = new AmazonSQSClient(AccessKey, SecretKey, amazonRegion); _iamClient = new AmazonIdentityManagementServiceClient(AccessKey, SecretKey, amazonRegion); _snsClient = new AmazonSimpleNotificationServiceClient(AccessKey, SecretKey, amazonRegion); ... }
आइए उन ग्राहकों की सूची दें जिनकी हमें अमेज़न सेवाओं की आवश्यकता है।
- लोचदार ट्रांसकोडर - आउटपुट के लिए इनपुट वीडियो फ़ाइल को एन्कोडिंग।
- सरल भंडारण सेवा (S3) - भंडारण के साथ काम करते हैं। मूल / प्राप्त वीडियो फ़ाइल को अपलोड / डाउनलोड करें।
- सरल कतार सेवा (SQS) - संदेश कतार। SNS से प्राप्त अग्रेषण संदेश।
- पहचान और पहुंच प्रबंधन (IAM) - इलास्टिक ट्रांसकोडर अपने काम के लिए एक विशिष्ट भूमिका का उपयोग करता है। यही है, संक्षेप में, यह अमेज़ॅन सेवाओं के साथ काम करने के लिए एक खाते का उपयोग करता है जिसे इसकी आवश्यकता है। आपको उचित अधिकारों के साथ एक ऐसा खाता बनाना होगा।
- सरल अधिसूचना सेवा (एसएनएस) - एन्कोस्टिक स्थिति को सूचित करने के लिए इलास्टिक ट्रांसकोडर इस सेवा का उपयोग करता है। अमेज़ॅन एसडीके का उपयोग करके प्रसंस्करण के लिए एसएनएस को भेजे गए संदेश एसक्यूएस को भेजे जाने चाहिए।
कृपया इस तथ्य पर भी ध्यान दें कि सभी सेवाओं के डिजाइनरों में हम उस क्षेत्र को इंगित करते हैं जिसके साथ वे काम करेंगे। हमारे मामले में, यह यूएसवेस्ट 2 है - उर्फ ओरेगन।
SQS: सरल कतार सेवा
सबसे पहले, हम एक संदेश कतार बनाएंगे जो हमारे ग्राहक एप्लिकेशन एन्कोडिंग स्थिति के बारे में संदेशों के लिए सुनेंगे। ऐसा करने के लिए, उपयुक्त विधि घोषित करें:
private const string QueueName = "QUEUE_NAME"; private readonly string _queueUrl; private string CreateQueue() {
यह कोड मौजूदा कतारों की सूची में आवश्यक कतार की तलाश करता है, अगर कोई नहीं है, तो इसे बनाता है। कृपया ध्यान दें कि एक कतार बनाते समय, हम इसे एक्सेस करने की अनुमति देते हैं और सभी अमेज़ॅन सेवाओं द्वारा कोई भी ऑपरेशन करते हैं।
यहाँ हम अमेज़ॅन एसडीके में पहले बग पर आते हैं। लेख लिखने के समय मेरे स्थान पर कम से कम संस्करण 2.0.5.0 स्थापित किया गया था। बात यह है कि एसडीके के माध्यम से बनाई गई कतार के अधिकारों को एसएनएस द्वारा ध्यान नहीं दिया जाएगा। यानी, एसएनएस सेवा कतार में संदेश नहीं भेज पाएगी। हालांकि, यदि आप प्रबंधन कंसोल में जाते हैं और सेट एक्सेस अधिकारों को देखते हैं, तो सब कुछ सही लगेगा।
इस बग के चारों ओर जाने के लिए, हमें प्रबंधन कंसोल में जाने की आवश्यकता है। सेवाओं का चयन करें -> ऐप सेवाएँ -> SQS।

बनाई गई कतार का चयन करें और अनुमतियाँ टैब पर जाएं। आपको एसडीके (वास्तव में आवश्यक नहीं) के माध्यम से बनाए गए एक्सेस अधिकारों को हटाने और मैन्युअल रूप से ऐड परमिशन बटन के माध्यम से सटीक एक ही जोड़ने की आवश्यकता है।


चलो हमारे कोड पर वापस आते हैं। CreateQueue पद्धति क्रिएट कतार का URL लौटाएगी। इसलिए, ElasticTranscoderClient वर्ग के निर्माता में, हम संबंधित फ़ील्ड की आरंभीकरण को जोड़ते हैं:
public ElasticTranscoderClient() { ... _queueUrl = CreateQueue(); ... }
IAM: पहचान और पहुंच प्रबंधन
अब वह भूमिका बनाएं जिसके तहत हमारा इलास्टिक ट्रांसकोडर निष्पादित करेगा। ऐसा करने के लिए, उपयुक्त विधि बनाएं:
private const string IamRoleName = "IAM_ROLE_NAME"; private Role CreateIamRole() { foreach (var role in _iamClient.ListRoles().Roles) { if (role.RoleName == IamRoleName) { return role; } } var trustRelationships = new Policy { Statements = { new Statement(Statement.StatementEffect.Allow) { Actions = { SecurityTokenServiceActionIdentifiers.AssumeRole }, Principals = { Principal.AllUsers } } } }.ToJson(); var permissions = new Policy { Statements = { new Statement(Statement.StatementEffect.Allow) { Actions = { new ActionIdentifier("*") }, Resources = { new Resource("*") } } } }.ToJson(); var newRole = _iamClient.CreateRole( new CreateRoleRequest { RoleName = IamRoleName, AssumeRolePolicyDocument = trustRelationships } ).Role; _iamClient.PutRolePolicy( new PutRolePolicyRequest { PolicyName = "Default", RoleName = IamRoleName, PolicyDocument = permissions } ); return newRole; }
यहाँ सिद्धांत बिल्कुल वैसा ही है जैसे कतार बनाते समय। यदि पहले से ही नहीं है तो एक भूमिका बनाएँ। और हम सभी अमेज़ॅन सेवाओं तक पहुंचने के लिए उसके अधिकारों को जोड़ते हैं। आप विशिष्ट सेवाएं निर्दिष्ट कर सकते हैं। IAM भूमिका बनाते समय, मैंने देखा कि SDK में कोई बग नहीं है (शायद मैं गलत हूं)।
निर्मित विधि रोल ऑब्जेक्ट का एक उदाहरण देता है।
एसएनएस: सरल अधिसूचना सेवा
जैसा कि मैंने ऊपर कहा, इलास्टिक ट्रांसकोडर एसएनएस सेवा का उपयोग एन्कोडिंग स्थिति के बारे में सूचित करने के लिए करता है। भविष्य में, संदेश अन्य सेवाओं को भेजे जा सकते हैं। SQS उनमें से सिर्फ एक है। सभी संभावित विकल्पों का विवरण
यहां पाया जा सकता
है ।
लोचदार ट्रांसकोडर से सभी संदेश संबंधित विषय पर भेजे जाते हैं। जिसकी सदस्यता कई श्रोता ले सकते हैं। हमें श्रोता SQS संदेश कतार निर्दिष्ट करने की आवश्यकता है।
private const string TopicName = "TOPIC_NAME"; private string CreateTopic() { var topicArn = _snsClient.CreateTopic(new CreateTopicRequest(TopicName)).TopicArn;
यहां हम SNS की ख़ासियत को URL के साथ नहीं, बल्कि तथाकथित Amazon Resource Names (ARN) के साथ नोट कर सकते हैं। यही है, एसएनएस से संदेशों को सुनने के लिए कतार पर हस्ताक्षर करने के लिए, हमें इसके एआरएन की आवश्यकता है, URL की नहीं। इसलिए, पहले से बनाई गई कतार के URL का उपयोग करके, हम संबंधित ARN प्राप्त करते हैं।
विधि बनाई गई विषय का ARN लौटाता है।
कोडिंग
वीडियो फ़ाइलों (नौकरी) के प्रसंस्करण के लिए सभी कार्य एक विशिष्ट पाइपलाइन के ढांचे के भीतर किए जाते हैं। इस पाइपलाइन से कार्य अमेज़ॅन इलास्टिक ट्रांसकोडर द्वारा लिया जाता है और इसे समानांतर किया जा सकता है।
पाइपलाइन बनाने के लिए एक विधि घोषित करें।
private const string PipelineName = "PIPELINE_NAME"; private Pipeline CreatePipeline(Role iamRole, string topicArn) { foreach (var pipeline in _elasticTranscoder.ListPipelines().Pipelines) { if (pipeline.Name == PipelineName) { return pipeline; } } var pipelineResponse = _elasticTranscoder.CreatePipeline( new CreatePipelineRequest { Name = PipelineName, InputBucket = BucketName, Role = iamRole.Arn, Notifications = new Notifications { Completed = topicArn, Error = topicArn, Progressing = topicArn, Warning = topicArn }, ContentConfig = new PipelineOutputConfig { Bucket = BucketName, Permissions = { new Permission { GranteeType = "Group", Grantee = "AllUsers", Access = {"Read"} } } }, ThumbnailConfig = new PipelineOutputConfig { Bucket = BucketName } } ); return pipelineResponse.Pipeline; }
कहीं और के रूप में, हम एक पाइपलाइन का निर्माण केवल तभी करते हैं जब वह पहले नहीं बनाई गई हो। इनपुट मापदंडों के रूप में, आपको उस टोकरी को निर्दिष्ट करना होगा, जिसके साथ इलास्टिक ट्रांसकोडर काम करेगा, यानी इनपुट डेटा (InputBucket), IAM भूमिका (भूमिका), पाइपलाइन नाम (नाम), संबंधित टॉपिक का ARN (नोट नहीं) और टोकरी में आउटपुट फ़ाइलों तक पहुंच अधिकार। (अनुमतियां)।
यह विधि एक प्रकार की पाइपलाइन लौटाती है, जिसका उपयोग हम वीडियो फ़ाइलों को संसाधित करने के लिए नए कार्य बनाने के लिए करेंगे। इसलिए, हम ElasticTranscoderClient कंस्ट्रक्टर के संगत फ़ील्ड को जोड़ते हैं:
private readonly Pipeline _pipeline; public ElasticTranscoderClient() { ... _pipeline = CreatePipeline(iamRole, topicArn); }
और अंत में, आखिरी चीज जिसे हमें लिखना है, वह वीडियो प्रसंस्करण के लिए कार्य (नौकरी) बनाने की एक विधि है।
private void CreateJob(string inputFile, string outputFile) { var inputKey = Path.GetFileName(inputFile); var outputKey = Path.GetFileName(outputFile); _elasticTranscoder.CreateJob( new CreateJobRequest { PipelineId = _pipeline.Id, Input = new JobInput { AspectRatio = "auto", Container = "auto", FrameRate = "auto", Interlaced = "auto", Resolution = "auto", Key = inputKey }, Outputs = { new CreateJobOutput { ThumbnailPattern = "", Rotate = "0", PresetId = PresetId, Key = outputKey } } }); }
जैसा कि विंडोज एज़्योर के मामले में, हम मानते हैं कि प्रोसेसिंग के लिए वीडियो फाइलें हमारी बाल्टी की जड़ में हैं, इसलिए फ़ाइल तक पहुंचने की कुंजी फ़ाइल नाम है।
हम वीडियो फ़ाइल के मूल (ऑटो) के इनपुट मापदंडों को छोड़ देते हैं, और आउटपुट स्वरूप के रूप में हम 480p में एन्कोडिंग के लिए वांछित प्रीसेट की आईडी सेट करते हैं। सभी प्रीसेट की सूची
यहां प्राप्त की जा सकती
है , या प्रबंधन कंसोल -> सेवा -> ऐप सेवाएँ -> इलास्टिक ट्रांसकोडर -> प्रीसेट पर जाकर प्राप्त की जा सकती
है ।

अब हम IVideoConverter इंटरफ़ेस में वर्णित विधियों को लागू करते हैं: WaitForConversionToComplete, UploadFile, DownloadFile, Convert।
UploadFile और DownloadFile का कार्यान्वयन काफी सरल है। भंडारण के लिए / से वीडियो फ़ाइलों को अपलोड / डाउनलोड करने के लिए हमें S3 के साथ काम करने के लिए क्लाइंट का उपयोग करने की आवश्यकता है।
public void UploadFile(string localFile) { _s3Client.PutObject( new PutObjectRequest { FilePath = localFile, BucketName = BucketName } ); } public void DownloadFile(string localFile) { var objectKey = Path.GetFileName(localFile); var response = _s3Client.GetObject( new GetObjectRequest { Key = objectKey, BucketName = BucketName, } ); response.WriteResponseStreamToFile(localFile); }
अगला, हम WaitForConversionToComplete विधि को लागू करते हैं। यहां आपको अधिक विस्तार से रहने की आवश्यकता है। तथ्य यह है कि अमेज़ॅन इलास्टिक ट्रांसकोडर केवल विंडोज एज़्योर मीडिया सर्विसेज के विपरीत, अतुल्यकालिक मोड में काम कर सकता है। अर्थात, हमारे पास एक संदेश हैंडलर नहीं है जिसे हम संदेश के इंतजार के दौरान सदस्यता दे सकते हैं कि प्रसंस्करण पूरा हो गया है।
चूंकि इलास्टिक ट्रांसकोडर एसएनएस का उपयोग करके स्थिति संदेश भेजता है, इसलिए उन्हें एसक्यूएस में भेजना चाहिए, इसलिए हमें इस पद्धति को लागू करने की आवश्यकता है ताकि यह इसमें संदेशों के लिए कतार को सुने।
public void WaitForConversionToComplete() { while (true) { var message = _sqsClient.ReceiveMessage( new ReceiveMessageRequest { QueueUrl = _queueUrl, MaxNumberOfMessages = 1, WaitTimeSeconds = 20 } ).Messages.FirstOrDefault(); if (message != null) { var jsonSerializer = new DataContractJsonSerializer(typeof(TranscodingNotificationEvent)); var sqsEvent = (TranscodingNotificationEvent) jsonSerializer.ReadObject( new MemoryStream( Encoding.Unicode.GetBytes( message.Body .Replace("\n", "") .Replace("\\n", "") .Replace("\\", "") .Replace("\"{", "{") .Replace("}\"", "}")) ) ); _sqsClient.DeleteMessage( new DeleteMessageRequest { QueueUrl = _queueUrl, ReceiptHandle = message.ReceiptHandle }); if (string.Compare(sqsEvent.Message.State, "COMPLETED", true, CultureInfo.InvariantCulture) == 0) break; } Thread.Sleep(2000); } }
आइए कोड के इस टुकड़े पर करीब से नज़र डालें। SQS क्लाइंट का उपयोग करके, हमें कतार से एक संदेश मिलता है। अधिकतम संभव संदेश प्रतीक्षा अंतराल 20 सेकंड है, जिसके बाद एसक्यूएस क्लाइंट नियंत्रण वापस कर देगा।
अमेज़न इलास्टिक ट्रांसकोडर 4 प्रकार के संदेश भेजता है जो प्रसंस्करण स्थिति को दर्शाता है: प्रगति, पूर्ण, चेतावनी और त्रुटि। हमें पूर्ण जैसे संदेश की प्रतीक्षा करनी होगी। हम कतार से अन्य सभी संदेश हटाते हैं।
SNS या SQS के सभी संदेश JSON प्रारूप में आते हैं। चूंकि .NET ऑब्जेक्ट्स में JSON ऑब्जेक्ट्स पार्स करने के लिए .NET के लिए Amazon SDK में कोई तैयार-निर्मित कक्षाएं नहीं हैं, इसलिए हमें प्राप्त संदेश को स्वयं पार्स करने की आवश्यकता है। आप इसके लिए
json2charp सेवा का उपयोग कर सकते हैं।
हालाँकि, जब मैंने SQS से तैयार संदेश को पार्स करने की कोशिश की, तो यहाँ मुझे एक और समस्या आई। अमेज़ॅन से आने वाली JSON ऑब्जेक्ट में वे वर्ण होते हैं जिन्हें .NET ऑब्जेक्ट में सामान्य परिवर्तन के लिए हटाया जाना चाहिए। नतीजतन, संदेशों को प्राप्त करने के लिए डिज़ाइन में ऐसे पात्रों के सेट के लिए रिप्लेसमेंट विधि के लिए कॉल शामिल होने लगे। कोड में इस पर ध्यान दें!
खैर, वास्तव में, हमारे लिए जो कुछ भी है वह सभी संबंधित वस्तुओं के वर्गों को लागू करना है।
[DataContract] public class TranscodingNotificationEvent { [DataMember] public string Type { get; set; } [DataMember] public string MessageId { get; set; } [DataMember] public string TopicArn { get; set; } [DataMember] public string Subject { get; set; } [DataMember] public TranscodingMessage Message { get; set; } [DataMember] public string Timestamp { get; set; } [DataMember] public string SignatureVersion { get; set; } [DataMember] public string Signature { get; set; } [DataMember] public string SigningCertUrl { get; set; } [DataMember] public string UnsubscribeUrl { get; set; } } [DataContract] public class TranscodingMessage { [DataMember(Name = "state")] public string State { get; set; } [DataMember(Name = "version")] public string Version { get; set; } [DataMember(Name = "jobId")] public string JobId { get; set; } [DataMember(Name = "pipelineId")] public string PipelineId { get; set; } [DataMember(Name = "input")] public TranscodingInput Input { get; set; } [DataMember(Name = "outputs")] public List<TranscodingOutput> Outputs { get; set; } } [DataContract] public class TranscodingInput { [DataMember(Name = "key")] public string Key { get; set; } [DataMember(Name = "frameRate")] public string FrameRate { get; set; } [DataMember(Name = "resolution")] public string Resolution { get; set; } [DataMember(Name = "aspectRatio")] public string AspectRatio { get; set; } [DataMember(Name = "interlaced")] public string Interlaced { get; set; } [DataMember(Name = "container")] public string Container { get; set; } } [DataContract] public class TranscodingOutput { [DataMember(Name = "id")] public string Id { get; set; } [DataMember(Name = "presetId")] public string PresetId { get; set; } [DataMember(Name = "key")] public string Key { get; set; } [DataMember(Name = "thumbnailPattern")] public string ThumbnailPattern { get; set; } [DataMember(Name = "rotate")] public string Rotate { get; set; } [DataMember(Name = "status")] public string Status { get; set; } }
इस प्रकार, अधूरी छोड़ी गई एकमात्र विधि है कन्वर्ट। यह विधि अनिवार्य रूप से उचित क्रम में पहले से लागू तरीकों को कॉल करेगी। इसका कार्यान्वयन:
public void Convert(string sourceFile, string destinationFile) { Console.WriteLine("Uploading the source file..."); UploadFile(sourceFile); Console.WriteLine("Creating processing job..."); CreateJob(sourceFile, destinationFile); Console.WriteLine("Waiting for conversion results..."); WaitForConversionToComplete(); Console.WriteLine("Downloading converted file..."); DownloadFile(destinationFile); }
जैसा कि हम देख सकते हैं, सब कुछ काफी सरल है:
- एक फ़ाइल अपलोड की गई;
- एक कोडिंग कार्य बनाया;
- एन्कोडिंग परिणामों के लिए प्रतीक्षा की जा रही है;
- परिणामी फ़ाइल डाउनलोड करें।
परिणामस्वरूप, कंसोल एप्लिकेशन में कन्वर्ट विधि को कॉल करके, हमें निम्न परिणाम मिलता है:

और निश्चित रूप से हम प्राप्त फाइलों की तुलना करते हैं।

यह अमेज़ॅन इलास्टिक ट्रांसकोडर के साथ काम करने के लिए क्लाइंट के कार्यान्वयन को पूरा करता है। अगली बार हमारे पास सबसे दिलचस्प होगा, अर्थात् - दो प्रदाताओं की तुलना करने के लिए। स्विच मत करो!
जारी रखने के लिए ...