2

wma ストリームを mp3 ストリームにリアルタイムで変換できますか?

私はこのようなことを試みましたが、運がありません:



    WebRequest request = WebRequest.Create(wmaUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    int block = 32768;
    byte[] buffer = new byte[block];

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.ErrorDialog = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.FileName = "c:\\ffmpeg.exe";
    p.StartInfo.Arguments = "-i - -y -vn -acodec libspeex -ac 1 -ar 16000 -f mp3 ";

    StringBuilder output = new StringBuilder();

    p.OutputDataReceived += (sender, e) =>
    {
      if (e.Data != null)
      {
        output.AppendLine(e.Data);
        //eventually replace this with response.write code for a web request
      }
    };

    p.Start();
    StreamWriter ffmpegInput = p.StandardInput;

    p.BeginOutputReadLine();

    using (Stream dataStream = response.GetResponseStream())
    {
       int read = dataStream.Read(buffer, 0, block);

       while (read > 0)
       {
          ffmpegInput.Write(buffer);
          ffmpegInput.Flush();
          read = dataStream.Read(buffer, 0, block);
       }
    }

    ffmpegInput.Close();

    var getErrors = p.StandardError.ReadToEnd();

私がやろうとしていることさえ可能かどうか疑問に思っています(wmaのバイトブロックをmp3のバイトブロックに変換します)。他の可能な C# ソリューションが存在する場合は、それを受け入れます。

ありがとう

4

2 に答える 2

1

WMA ファイルを入力として取り、MP3 ファイルを出力として作成したいようです。さらに、標準入力/標準出力経由でこれを行いたいようです。コマンドラインからこれをテストしたところ、うまくいくようです:

ffmpeg -i - -f mp3 - < in.wma > out.mp3

これが目標である場合、コマンド ラインにはいくつかの問題があります。

p.StartInfo.FileName = "c:\\ffmpeg.exe";
p.StartInfo.Arguments = "-i - -y -vn -acodec libspeex -ac 1 -ar 16000 -f mp3 ";

「-f mp3」は MP3 ビットストリーム コンテナーを指定しますが、「-acodec libspeex」は Speex オーディオを指定します。私はあなたがこれを望んでいないと確信しています。このオプションを省略すると、FFmpeg は MP3 コンテナーに MP3 オーディオのみを使用します。また、16000 Hz のモノラルにリサンプリングしますか? それが「-ac 1 -ar 16000」オプションの機能だからです。

最後の 1 つの問題: ターゲットを提供していません。stdout をターゲットとして指定する場合は、おそらく「-f mp3 -」が必要です。

于 2012-08-04T01:12:15.157 に答える
0

ちょうど同じ問題がありました。

入力として、URL を直接含めることができます。-出力として、標準出力を表す を使用します。このソリューションは mp3 間の変換用なので、動画でも同じように機能することを願っています。

process.EnableRaisingEvents = true;フラグを含めることを忘れないでください。


private void ConvertVideo(string srcURL)
{
    string ffmpegURL = @"C:\ffmpeg.exe";
    DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\");

    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = ffmpegURL;
    startInfo.Arguments = string.Format("-i \"{0}\" -ar 44100 -f mp3 -", srcURL);
    startInfo.WorkingDirectory = directoryInfo.FullName;
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardError = true;
    startInfo.CreateNoWindow = false;
    startInfo.WindowStyle = ProcessWindowStyle.Normal;

    using (Process process = new Process())
    {
        process.StartInfo = startInfo;
        process.EnableRaisingEvents = true;
        process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
        process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
        process.Exited += new EventHandler(process_Exited);

        try
        {
            process.Start();
            process.BeginErrorReadLine();
            process.BeginOutputReadLine();
            process.WaitForExit();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            process.ErrorDataReceived -= new DataReceivedEventHandler(process_ErrorDataReceived);
            process.OutputDataReceived -= new DataReceivedEventHandler(process_OutputDataReceived);
            process.Exited -= new EventHandler(process_Exited);

        }
    }
}

void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
    {
        byte[] b = System.Text.Encoding.Unicode.GetBytes(e.Data);
        // If you are in ASP.Net, you do a 
        // Response.OutputStream.Write(b)
        // to send the converted stream as a response
    }
}


void process_Exited(object sender, EventArgs e)
{
    // Conversion is finished.
    // In ASP.Net, do a Response.End() here.
}

PS: この stdout スニペットを使用して URL から「ライブ」を変換できますが、「ASP」は疑似コードであり、まだ試していません。

于 2012-09-24T03:49:52.660 に答える