2012-01-04 9 views
6

मैं (base64 स्ट्रिंग द्वारा अपलोड) AAC ऑडियो फ़ाइलें प्राप्त करने और उन्हें ब्लॉब में स्टोर करने के लिए विंडोज Azure पर एक वेब भूमिका चलाते हैं। यह अब तक ठीक काम करता है।ffmpeg.exe कैसे फोन करने के लिए Windows Azure पर ऑडियो फ़ाइलें कन्वर्ट करने के लिए?

इसके बाद, मैं भी उन्हें एमपी 3 में कन्वर्ट और भी ब्लॉब में MP3s स्टोर करने के लिए किया है। मैंने ffmpeg.exe -i पथ .aac पथ .mp3 जैसे कुछ का उपयोग करने का निर्णय लिया।

समस्याएं हैं कि:

  1. कैसे करें कॉल बाहरी ffmpeg.exe एक वेब भूमिका की एक वेब सेवा के अंदर?
  2. पथ क्या होगा?

कृपया मेरी मदद करो अगर आप जानते हैं। पहले ही, आपका बहुत धन्यवाद।

उत्तर

9

मेरा सुझाव है कि आप अपने वेब्रोल के लिए Local Storage Resource का उपयोग करें जहां आप ब्लॉब स्टोरेज से एएसी फाइल डाउनलोड कर सकते हैं, और उन्हें एमपी 3 में परिवर्तित कर सकते हैं। फिर ब्लॉब स्टोरेज पर वापस अपलोड करें।

साइड नोट यह है कि आप अपने एएसी/एमपी 3 फ़ाइलों के लिए अस्थायी फ़ाइल नाम प्राप्त करने के लिए Path.GetTempFileName() का भी उपयोग कर सकते हैं, लेकिन मैं ऐसा करने के लिए प्रोत्साहित नहीं करता हूं (भले ही मैंने इसे पहले किया हो)।

actuall ffmpeg चलने के लिए, आप AzureVideoConv के लिए कोड ब्राउज़ करना चाहते हैं, जिसे मैंने कुछ समय पहले बनाया है। आपको वहां बहुत उपयोगी कोड मिलेगा।

यहाँ वास्तविक ffmpeg कॉल (ध्यान दें कि मैं एक ब्लॉब भंडारण से exe डाउनलोड, बाहरी exe फ़ाइलों के साथ मेरी नीला पैकेज सूजन से बचने के लिए, और आसानी से ffmpeg.exe अद्यतन करने के लिए जब आवश्यक) का एक नमूना है:

 internal void ConvertFile(string inputFileName, Guid taskID) 
    { 
     string tmpName = string.Format(
      "{0}\\{1}.flv", 
      Path.GetTempPath(), inputFileName.Substring(inputFileName.LastIndexOf("\\")+1)); 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = this._processorExecutable; 
     psi.Arguments = string.Format(@"-i ""{0}"" -y ""{1}""", inputFileName, tmpName); 
     psi.CreateNoWindow = true; 
     psi.ErrorDialog = false; 
     psi.UseShellExecute = false; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.RedirectStandardOutput = true; 
     psi.RedirectStandardInput = false; 
     psi.RedirectStandardError = true; 
     try 
     { 
      // Start the process with the info we specified. 
      // Call WaitForExit and then the using statement will close. 
      using (Process exeProcess = Process.Start(psi)) 
      { 
       exeProcess.PriorityClass = ProcessPriorityClass.High; 
       string outString = string.Empty; 
       // use ansynchronous reading for at least one of the streams 
       // to avoid deadlock 
       exeProcess.OutputDataReceived += (s, e) => { 
        outString += e.Data; 
       }; 
       exeProcess.BeginOutputReadLine(); 
       // now read the StandardError stream to the end 
       // this will cause our main thread to wait for the 
       // stream to close (which is when ffmpeg quits) 
       string errString = exeProcess.StandardError.ReadToEnd(); 
       Trace.WriteLine(outString); 
       Trace.TraceError(errString); 
       byte[] fileBytes = File.ReadAllBytes(tmpName); 
       if (fileBytes.Length > 0) 
       { 
        this._sSystem.SaveOutputFile(
         fileBytes, 
         tmpName.Substring(tmpName.LastIndexOf("\\")+1), 
         taskID 
         ); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Trace.TraceError(e.Message); 
     } 
    } 

नोट परियोजना के अंतिम चेक इन विंडोज Azure SDK का उपयोग कर रहा है 1.3

+0

मैंने इसे 1 घंटे पहले पढ़ा है, आपके महान काम के लिए धन्यवाद! लेकिन मैं सी # में अच्छा नहीं हूं इसलिए मुझे नहीं पता कि मेरे संदर्भ में इसका उपयोग कैसे किया जाए। मैंने अपनी वेब भूमिका (कार्यकर्ता भूमिका नहीं) के स्थानीय संग्रहण संसाधन को कॉन्फ़िगर किया है, फिर ब्लॉब से .exe और .aac को कैसे डाउनलोड करें? इसे कैसे चलाएं? एमपी 3 वापस कैसे अपलोड करें? – Skyler

+0

कृपया मेरे कोड पर एक नज़र डालें: http://azurevideoconv.codeplex.com/SourceControl/changeset/view/5501 becasue अब बहुत सारे प्रश्न हैं और उन सभी को मेरे कोड में उत्तर दिया गया है :) आप इसका उपयोग कर सकते हैं अतिरिक्त प्रश्न पूछने के लिए कोडप्लेक्स की परियोजना साइट पर चर्चाएं। – astaykov

+0

ठीक है। तीन संस्करण हैं। मुझे किसका उपयोग करना चाहिए? – Skyler

8

आप एक बहुत @astaykov धन्यवाद। आपने अच्छा काम किया। हालांकि यह मेरे मामले के लिए विशिष्ट नहीं है (मुझे पूरी बड़ी परियोजना के बजाय कोड का एक विशिष्ट टुकड़ा चाहिए), लेकिन यह वास्तव में मुझे प्रेरित करता है। मेरे मामले में निर्दिष्ट करने के लिए, मैं अपने खुद के द्वारा इस सवाल का जवाब करने जा रहा हूँ - ध्यान दें कि मैं इस कहीं साथ @ astaykov के कोड के आधार पर सीधे & पेस्ट कॉपी किया था।

  1. सबसे पहले, Local Storage Resource के साथ भूमिका को कॉन्फ़िगर करें।

    LocalResource converter_path = 
          RoleEnvironment.GetLocalResource("AudioConvertSpace"); 
        string rootPathName = converter_path.RootPath; 
    
  2. ffmpeg.exe के मार्ग मिलता है, xxx.aac और xxx.mp3 स्थानीय भंडारण में:

    string aac_path = rootPathName + "\\" + "fmwa-" + guidguid + ".aac"; 
        string mp3_path = rootPathName + "\\" + "fmwa-" + guidguid + ".mp3"; 
        string exe_path = rootPathName + "\\" + "ffmpeg.exe"; 
    
  3. फिर इन कोड से अपने रास्ते मिल लिखना ।स्थानीय संग्रहण में aac फ़ाइल:

    System.IO.File.WriteAllBytes(aac_path, decoded_audio_byte_array); 
    
  4. ध्यान रखें कि स्थानीय भंडारण स्थिर या टिकाऊ होना है, तो ffmpeg.exe के अस्तित्व की जाँच करने की गारंटी नहीं है में रखना - अगर यह मौजूद नहीं है, इसे डाउनलोड ब्लॉब से

    if (System.IO.File.Exists(exe_path) == false) 
        { 
         var exeblob = _BlobContainer.GetBlobReference("ffmpeg.exe"); 
         exeblob.DownloadToFile(exe_path, null); 
        } 
    
  5. प्रारंभिक और चलाने ffmpeg.exe प्रक्रिया:

    byte[] mp3_audio_byte_array = System.IO.File.ReadAllBytes(mp3_path); 
        var mp3blob = _BlobContainer.GetBlobReference("fmwa-"+guidguid+".mp3"); 
        mp3blob.Properties.ContentType = "audio/mp3"; 
        mp3blob.UploadByteArray(mp3_audio_byte_array); 
    
  6. साफ अस्थायी फ़ाइलें:

    ProcessStartInfo psi = new ProcessStartInfo(); 
        psi.FileName = exe_path; 
        psi.Arguments = string.Format(@"-i ""{0}"" -y ""{1}""", 
                 aac_path, mp3_path); 
        psi.CreateNoWindow = true; 
        psi.ErrorDialog = false; 
        psi.UseShellExecute = false; 
        psi.WindowStyle = ProcessWindowStyle.Hidden; 
        psi.RedirectStandardOutput = true; 
        psi.RedirectStandardInput = false; 
        psi.RedirectStandardError = true; 
        Process exeProcess = Process.Start(psi); 
        exeProcess.PriorityClass = ProcessPriorityClass.High; 
        string outString = string.Empty; 
        exeProcess.OutputDataReceived += (s, e) => { 
           outString += e.Data; 
          }; 
        exeProcess.BeginOutputReadLine(); 
        string errString = exeProcess.StandardError.ReadToEnd(); 
        Trace.WriteLine(outString); 
        Trace.TraceError(errString); 
        exeProcess.WaitForExit(); 
    
  7. ब्लॉब भंडारण में ffmpeg.exe के उत्पादन में अपलोड करें:

    System.IO.File.Delete(aac_path); 
        System.IO.File.Delete(mp3_path); 
    
+1

बढ़िया! मुझे खुशी है कि मैं मदद कर सकता हूं। मैं केवल स्टोरेज की स्थायित्व के बारे में (4) पर टिप्पणी करना चाहता हूं। आपके वीएम यूपी के समय भंडारण टिकाऊ होने की गारंटी है। तो आप अपने RoleEntryPoint descendand की "ऑनस्टार्ट()" विधि पर केवल एक बार अपने EXE डाउनलोड कर सकते हैं। स्थानीय रीसाइक्लिंग सामग्री को रोल रीसाइक्लिंग पर रखने के लिए एक विकल्प (चेकबॉक्स) है। एकमात्र समय जब सामग्री मिटा दी जाएगी, रीइमेजिंग या हीलिंग पर है (दोनों मामलों में आप ऑनस्टार्ट() के माध्यम से जाएंगे और EXE डाउनलोड कर पाएंगे)। – astaykov

+0

धन्यवाद! यह वही चीज है जो मैं सुनिश्चित करना चाहता हूं। मुझे खुशी है कि यह केवल एक बार डाउनलोड किया जाएगा। मैं इसे इस तरह लिखने का कारण यह है कि [दस्तावेज़] (http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx) ने कहा ** आप निर्दिष्ट कर सकते हैं कि स्थानीय संग्रहण संसाधन होना चाहिए संरक्षित जब एक उदाहरण पुनर्नवीनीकरण किया जाता है। हालांकि, वर्चुअल मशीन की स्थानीय फ़ाइल सिस्टम में सहेजा गया डेटा टिकाऊ होने की गारंटी नहीं है **। वैसे भी, यह काम करता है और धन्यवाद! – Skyler

+0

स्काईलर, क्या आप एज़ूर ऑडियो रूपांतरण के लिए अपना कोड प्रोजेक्ट साझा कर सकते हैं? यह वास्तव में उपयोगी है और मैं परियोजना को आजमा देना चाहता हूं। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^