2012-01-04 7 views
6

Windows AzureでWebロールを実行して、AACオーディオファイル(base64文字列でアップロード)を受信し、blobに格納します。今はうまく動作します。Windows Azureでオーディオファイルを変換するffmpeg.exeを呼び出す方法は?

次に、これらのファイルをMP3に変換してMP3ファイルをblobに保存する必要があります。 ffmpeg.exe -i パス .aac パス .mp3のようなものを使用することにしました。

  1. どのように呼び出し外部ffmpeg.exeウェブロールのWebサービスの内部:

    問題があることがありますか?

  2. パス

知っておられると助けてください。前もって感謝します。

答えて

9

あなたのwebroleにはLocal Storage Resourceを使用し、AlobファイルをBlobストレージからダウンロードしてMP3に変換することをお勧めします。その後、ブロブストレージにアップロードし直します。

サイドノートでは、Path.GetTempFileName()を使用してAAC/MP3ファイルの一時ファイル名を取得することもできますが、これを行うことはお勧めしません。

実行中のffmpegに関しては、以前作成したAzureVideoConvのコードを参照することをお勧めします。そこにはたくさんの便利なコードがあります。

:ここ

は、実際のffmpegの呼び出し(外部EXEファイルと私の紺碧のパッケージを膨満感を避けるために、必要な時に簡単にffmpeg.exeを更新するために、私はブロブストレージから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); 
     } 
    } 

NOTEプロジェクトの中の最後のチェックは

+0

私はこれを1時間前に読んでいます、あなたの素晴らしい仕事に感謝します!しかし、私はC#で上手くいかないので、私は自分の文脈でそれを使う方法を知らない。私は自分のWebロール(ワーカーロールではない)のローカルストレージリソースを設定してから、blobから.exeと.aacをダウンロードする方法を教えてください。どのようにそれを実行するには?どのように.mp3をアップロードする? – Skyler

+0

私のコードを詳しく見てみてください:http://azurevideoconv.codeplex.com/SourceControl/changeset/view/5501これであまりにも多くの質問があり、それらのすべてが私のコードで回答されています:)あなたはCodePlexのプロジェクトサイトでの議論で追加の質問があります。 – astaykov

+0

OK。 3つのバージョンがあります。どちらを使うべきですか? – Skyler

8

1.3はあなたにたくさんの@astaykovありがとうのWindows AzureのSDKを使用しています。あなたは良い仕事をしました。それは私のケースに特化したものではありませんが(私は大規模なプロジェクト全体ではなく特定のコードを必要とします)、本当に私に影響を与えました。私の場合に指定するために、私は自分自身でこの質問に答えるつもりです.- これは@ astaykovのコードに基づいています。&の貼り付けに直接コピーしました。

  1. まず、ロールをLocal Storage Resourceで構成します。そして、これらのコードによって、そのパスを取得:

    string aac_path = rootPathName + "\\" + "fmwa-" + guidguid + ".aac"; 
        string mp3_path = rootPathName + "\\" + "fmwa-" + guidguid + ".mp3"; 
        string exe_path = rootPathName + "\\" + "ffmpeg.exe"; 
    
  2. LocalResource converter_path = 
          RoleEnvironment.GetLocalResource("AudioConvertSpace"); 
        string rootPathName = converter_path.RootPath; 
    
  3. は、ローカルストレージにffmpeg.exexxx.aacxxx.mp3のパスを取得書きます 。ローカルストレージへの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)についてコメントしたいと思います。ストレージは、VMが稼働している間は耐久性があることが保証されています。したがって、RoleEntryPoint descendandの "OnStart()"メソッドでEXEを1回だけダウンロードすることができます。役割のリサイクルにローカルストレージコンテンツを保持するオプション(チェックボックス)があります。コンテンツが抹消される唯一の時間は、ReImagingまたはHealingです(どちらの場合でもOnStart()を実行し、EXEをダウンロードできるようになります)。 – astaykov

+0

ありがとう!これは確かに私が確信している唯一のものです。私はそれが一度だけダウンロードされることをうれしく思っています。このように書く理由は、[document](http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx)によると**ローカルストレージリソースがインスタンスがリサイクルされたときに保持されます。ただし、仮想マシンのローカルファイルシステムに保存されたデータは、耐久性が保証されていません**。とにかく、それは動作し、ありがとう! – Skyler

+0

Skyler、紺碧のオーディオ変換のためのコードプロジェクトを共有できますか?これは本当に便利で、プロジェクトを試してみたいと思います。 –

関連する問題