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.
Спасибо Стэнли за вашу помощь!