Mplayer Dump Audio из видео, хорошо работает только на жестком диске без C

Я использую Mplayer для извлечения аудио из видео через командную строку. Это команда, которую я использую:

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

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

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

Когда я выполняю форму X, дамп запускается с высокой скоростью (по запросу -ao pcm: fast audio driver) и файл 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 делать работу правильно... Мое приложение, к сожалению, нет. Я отредактировал манифест, чтобы предоставить права администратора, но это то же самое. Где-то здесь, в stackru, я прочитал кое-что о том, чтобы использовать helecuecute в true, но, к сожалению, таким образом (мне все равно нужно проверить) я теряю способность перенаправлять ввод / вывод / ошибку.

Мне нужно найти способ запустить процесс (затем mplayer.exe) из моего приложения, с правами администратора, без использования shellexecute...

Изменить 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 не может открыть аудио драйвер и сохранить файл..

Fail, снова.. 3° edit: я пытался использовать 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:-(

1 ответ

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

Это код:

    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. НЕТ необходимости в использовании hellexecute = true.

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

Другие вопросы по тегам