2016-06-30 1 views
0

J'utilise Mplayer pour extraire l'audio de la vidéo via la ligne de commande. Ceci est la commande i utilise:Mplayer Dump Audio à partir de la vidéo, fonctionne bien uniquement sur un disque dur non C

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

je copiais à la fois Mplayer.exe et aaa.avi sur les fenêtres du lecteur (C :) et le répertoire racine d'un disque dur externe (dans mon cas X). Lorsque j'exécute à partir de C, le démarrage à la vitesse normale (je vois la vidéo en temps réel) et aaa.wav n'est pas créé par Mplayer.

Lorsque j'exécute le formulaire X, le démarrage à la vitesse rapide (comme demandé par le pilote audio -ao pcm: fast audio) et aaa.wav est correctement créé.

J'ai le même problème dans mon application, voici le code que j'utiliser pour le faire:

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 
 
      } 
 

 
     }

J'ai récemment ajouté ceci:

ps.WorkingDirectory = @"x:\"; 

Mais le résultat ne change pas, la vitesse de la vidéo n'est pas rapide et le fichier wav n'est pas créé par Mplayer.

Dans mon application, comme le test C, je reçois des erreurs:

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

une question, quand j'utilise mPlayer pour encapsuler vidéos dans mon application le processus de démarrage d'environ une minute après je l'ai lancé. .. peut-être concaténer avec problème de dumping?

Pour toute suggestion?

Modifier: Je viens de découvrir: Si je démarre l'invite de commande avec les droits d'administrateur, puis aussi dans C Drive Mplayer faire le travail dans le bon sens ... Mon application malheureusement pas. J'ai édité le manifeste pour accorder des droits d'administrateur, mais c'est la même chose. Quelque part ici à stackoverflow j'ai lu quelque chose à propos de useshellexecute à vrai mais malheureusement de cette façon (j'ai besoin de tester de toute façon) je perds la capacité de rediriger entrée/sortie/erreur.

Je dois trouver un moyen de commencer le processus (alors mplayer.exe) à partir de mon application, avec des droits d'administrateur, sans utiliser shellexecute ...

Edit 2 ° J'ai créé un bouton simple ce code:

  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);

:-(même résultat, Mplayer ne peut pas ouvrir pilote audio et d'enregistrer le fichier ..

Fail, encore une fois .. 3 ° modifier: Je essayé d'utiliser 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(); 
 
     }

Maintenant, je vois la première image de la vidéo et le gel Mplayer ...

Je perds mon espoir d'utiliser mplayer :-(

+0

Que diriez-vous de démarrer vos applications en utilisant "Exécuter en tant qu'administrateur"? Parce que le lecteur C est très protecteur. –

+0

J'ai juste essayé de démarrer Visual Studio en tant qu'admin (rien n'a changé) et après la version release (même résultat). J'essaye maintenant d'élever l'application entière avec un manifeste (UAC) –

+0

Je veux dire, si vous utilisez Process.Start, vous devez également ajouter "runas" dedans. Voir cet exemple: http://stackoverflow.com/questions/4106628/start-process-with-administrator-right-in-c-sharp –

Répondre

0

Enfin je ... résolu

Voici le code:

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; 

Comme je comprends que je dois déplacer le Process.WorkingDirectory dans le même dossier que le fichier de destination (dans mon cas, le fichier wav)

Maintenant, il bascule :-)

AUCUN besoin de UAC AUCUN besoin de useshellexecute = true

Merci stanley pour votre aide!