2016-06-30 3 views
0

Я использую Mplayer для вывода аудио из видео через командную строку. Это команда я использую:Mplayer Dump Аудио с видео, хорошо работает только на жестком диске не C

mplayer -ao pcm:fast:file=aaa.wav aaa.avi 

Я скопировал Mplayer.exe и aaa.avi как на окнах диск (C :) и в корневом каталоге внешнего жесткого диска (в моем случае X).

Когда я выполняю с C запуск сбрасывания с нормальной скоростью (я вижу видео в реальном времени), а aaa.wav не создается Mplayer.

Когда я выполняю форму X, запуск сбрасывается с быстрой скоростью (по просьбе -o pcm: быстрый аудиодрайвер), и aaa.wav правильно создан.

У меня есть один и тот же вопрос в моем приложении, здесь код я использую, чтобы сделать это:

public static string DumpWav_ConsoleOutput = ""; 
 
     public static int DumpWav_ProcessID = 0; 
 
     Process DumpWav_Process = null; 
 

 
     private void DumpWav(string SourceFileName, string DestinationFileName, bool NeedToCut, TimeSpan Start, TimeSpan End) 
 
     { 
 
      //cancelliamo le variabili 
 
      DumpWav_ConsoleOutput = ""; 
 
      //Handle della finestra di Media Player 
 
      Variables.MediaPlayerHandle = 0; 
 
      Variables.MediaPlayerHandle = (int)MediaPlayer.Handle; 
 
      Thread thread = new Thread(() => _DumpWav(SourceFileName, DestinationFileName, NeedToCut,Start, End)); //il thread principale di Dump Wav 
 
      thread.Start(); 
 
      while (thread.IsAlive) //aspettiamo il suo completamento 
 
      { 
 
       Application.DoEvents(); 
 
      } 
 
      var myForm = new Output(); 
 
      myForm.SetOutputText = Variables.ConsoleOutputMP; 
 
      myForm.Show(); 
 
      Variables.MediaPlayerExit = true; 
 
      // ok il processo è terminato 
 
     } 
 

 
     private void _DumpWav(string SourceFileName, string DestinationFileName, bool NeedToCut, TimeSpan Start, TimeSpan End) 
 
     { 
 
      string Output; 
 
      Output = RunDumpWav((output) => { }, SourceFileName, DestinationFileName, NeedToCut, Start, End); 
 
     } 
 

 

 
     // Media Player avviato da questa funzione 
 
     public string RunDumpWav(Action<string> output, string SourceFileName, string DestinationFileName, bool NeedToCut, TimeSpan Start, TimeSpan End) 
 
     { 
 
      if (output == null) 
 
       throw new ArgumentNullException("output"); 
 
      string args; 
 
      ProcessStartInfo ps = new ProcessStartInfo(); 
 
      ps.FileName = FindMediaPlayerPath("mplayer.exe"); 
 
      ps.UseShellExecute = false; 
 
      ps.RedirectStandardInput = true; 
 
      ps.RedirectStandardError = true; 
 
      ps.RedirectStandardOutput = true; 
 
      ps.CreateNoWindow = true; 
 
      ps.WorkingDirectory = @"x:\"; 
 
      args = "-wid "; 
 
      args += Variables.MediaPlayerHandle; 
 
      args += " -ao pcm:fast:file="; 
 
      args += DestinationFileName; 
 
      if (NeedToCut == true) 
 
      { 
 
       args += " -ss " + Start + " -endpos " + End; 
 
      } 
 
      //args += " -vo null -vc null -quiet "; 
 
      //-wid will tell MPlayer to show output inisde our panel 
 
      args += " " + SourceFileName; 
 
      ps.Arguments = args; 
 

 
      using (DumpWav_Process = Process.Start(ps)) 
 

 

 
      using (ManualResetEvent mreOut = new ManualResetEvent(false), 
 
      mreErr = new ManualResetEvent(false)) 
 
      { 
 
       DumpWav_Process.OutputDataReceived += (o, e) => { if (e.Data == null) mreOut.Set(); else output(e.Data); }; 
 
       DumpWav_Process.BeginOutputReadLine(); 
 

 
       DumpWav_Process.ErrorDataReceived += (o, e) => { if (e.Data == null) mreErr.Set(); else output(e.Data); }; ; 
 
       DumpWav_Process.BeginErrorReadLine(); 
 

 
       output = s => DumpWav_ElaborateOutput(s); 
 

 
       DumpWav_ProcessID = DumpWav_Process.Id; 
 
       //processMP.StandardInput.Close(); 
 
       DumpWav_Process.WaitForExit(); 
 
       mreOut.WaitOne(); 
 
       mreErr.WaitOne(); 
 
       //stringa di ritorno (tutto il contenuto della console) 
 
       return DumpWav_ConsoleOutput; 
 
      } 
 
     } 
 

 
     //controlliamo l'output della console 
 
     private void DumpWav_ElaborateOutput(string output) 
 
     { 
 
      Variables.ConsoleOutputMP = Variables.ConsoleOutputMP + output + Environment.NewLine; 
 
      if (output.IndexOf("A:") != -1) 
 
      { 
 
//some check here 
 
      } 
 

 
     }

Недавно я добавил это:

ps.WorkingDirectory = @"x:\"; 

Но результат не изменяется, скорость видео не быстрая, и WAV-файл не создается Mplayer.

В моем приложении, как тест C, я получаю некоторые ошибки:

[AO PCM] Failed to open aaa.wav for writing! 
Failed to initialize audio driver 'pcm:fast:file=aaa.wav' 

Еще один вопрос, когда я использую MPLAYER инкапсулировать видео внутри моего приложения процесс запуска около одной минуты после того, как я начал его. .. может быть, конкатенация с демпинговой проблемой?

Пожалуйста, любое предложение?

Редактировать: Я обнаружил, что сейчас: Если я запустил командную строку с правами администратора, то также в C Drive Mplayer выполните задание правильно ... Мое приложение, к сожалению, этого не делает. Я отредактировал манифест, чтобы предоставить права администратора, но это то же самое. Где-то здесь, в stackoverflow, я читал что-то о том, чтобы использовать hellexecute для истины, но, к сожалению, таким образом (мне все равно нужно протестировать), я теряю возможность перенаправлять ввод/вывод/ошибку.

мне нужно найти способ, чтобы начать процесс (то Mplayer.exe) внутри моего приложения с правами администратора, без использования ShellExecute ...

Edit 2 ° Я создал простую кнопку с этот код:

  string args; 
 
      //Handle della finestra di Media Player 
 
      Variables.MediaPlayerHandle = 0; 
 
      Variables.MediaPlayerHandle = (int)MediaPlayer.Handle; 
 
      ProcessStartInfo psi = new ProcessStartInfo(); 
 
      psi.FileName = FindMediaPlayerPath("mplayer.exe"); 
 
      //psi.FileName = @"x:\mplayer.exe"; 
 
      psi.UseShellExecute = true; 
 
      psi.CreateNoWindow = true; 
 
      psi.WindowStyle = ProcessWindowStyle.Hidden; 
 
      psi.WorkingDirectory = Environment.CurrentDirectory; ; 
 
      psi.Verb = "runas"; 
 
      args = "-wid "; 
 
      args += Variables.MediaPlayerHandle; 
 
      args += " -ao pcm:fast:file="; 
 
      args += @"x:\aaa.wav"; 
 
      args += @" x:\aaa.avi"; 
 
      psi.Arguments = args; 
 
      Process.Start(psi);

:-(тот же результат, Mplayer не может открыть аудио драйвер и сохранить файл ..

Нормально, снова .. 3 ° редактировать: Я попытался с помощью CMD:

 private void button2_Click(object sender, EventArgs e) 
 
     { 
 
      ProcessStartInfo processInfo; 
 
      Process process; 
 
      Variables.MediaPlayerHandle = 0; 
 
      Variables.MediaPlayerHandle = (int)MediaPlayer.Handle; 
 
      string args = ""; 
 
      args = @"x:\mplayer.exe -wid " + Variables.MediaPlayerHandle + @" -ao pcm:fast:file=x:\aaa.wav x:\aaa.avi"; 
 
      MessageBox.Show(args); 
 
      processInfo = new ProcessStartInfo("cmd.exe", "/c " + args); 
 
      processInfo.CreateNoWindow = true; 
 
      processInfo.UseShellExecute = true; 
 
      processInfo.Verb = "runas"; 
 
      process = Process.Start(processInfo); 
 
      process.WaitForExit(); 
 
      MessageBox.Show("terminato"); 
 

 
      process.Close(); 
 
     }

Теперь я вижу первый кадр видео и Mplayer замораживанию ...

Я теряю надежду использовать MPlayer :-(

+0

Как насчет запуска приложений с помощью «Запуск от имени администратора»? Потому что диск C очень защищен. –

+0

Я просто попытался запустить сначала Visual Studio в качестве администратора (ничего не изменилось) и после сборки релиза (тот же результат). Я пытаюсь поднять все приложение с манифестом (UAC) –

+0

Я имею в виду, если вы используете Process.Start, вы также должны добавить в него «runas». См. Этот пример: http://stackoverflow.com/questions/4106628/start-process-with-administrator-right-in-c-sharp –

ответ

0

Наконец я решил ...

Это код:

if (output == null) 
     throw new ArgumentNullException("output"); 
    string args; 
    ProcessStartInfo psi = new ProcessStartInfo(); 
    psi.FileName = FindMediaPlayerPath("mplayer.exe"); 
    //psi.FileName = @"x:\mplayer.exe"; 
    psi.UseShellExecute = false; 
    psi.RedirectStandardInput = true; 
    psi.RedirectStandardError = true; 
    psi.RedirectStandardOutput = true; 
    psi.CreateNoWindow = true; 
    psi.WorkingDirectory = Path.GetDirectoryName(DestinationFileName); 
    psi.Verb = "runas"; 
    args = "-wid "; 
    args += Variables.MediaPlayerHandle; 
    args += " -ao pcm:fast:file="; 
    args += Path.GetFileName(DestinationFileName); 
    if (NeedToCut == true) 
    { 
     args += " -ss " + Start + " -endpos " + End; 
    } 
    //args += " -vo null -vc null -quiet "; 
    //-wid will tell MPlayer to show output inisde our panel 
    args += " " + SourceFileName; 
    psi.Arguments = args; 

Как я понимаю, мне нужно переместить Process.WorkingDirectory в той же папке, что и файл назначения (в моем случае wav).

Теперь это камни :-)

Нет необходимости в UAC NO need for useshellexecute = true

Спасибо, Стэнли за вашу помощь!

Смежные вопросы