Записывать данные в cmd в память вместо файла, ловить их с помощью C # - PullRequest
4 голосов
/ 05 июня 2010

Для проекта C # я экспериментирую с ffmpeg для извлечения файла .wav из видеофайла (в Windows). Вы можете сделать это, запустив его в командной строке следующим образом: «ffmpeg -i inputvid.avi +« дополнительные параметры »+ extract.wav». Это, очевидно, извлекает аудио из входного файла .avi в указанный файл .wav.

Теперь я могу легко запустить эту команду в C #, чтобы она создала нужный файл .wav. Тем не менее, мне не нужен этот файл WAV, чтобы остаться на жестком диске. По соображениям производительности было бы намного лучше, если бы ffmpeg мог временно сохранить этот файл в памяти, что может быть использовано в моей программе на C #. После выполнения моей программы файл .wav больше не нужен.

Таким образом, фактический вопрос: могу ли я перенаправить выходной файл из программы в память? И если это возможно, как я могу прочитать это в C #?

Я знаю, что это длинный выстрел, и я очень сомневаюсь в этом, если это возможно, но я всегда могу спросить ...

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 05 июня 2010

Вместо указания выходного имени файла в командной строке ffmpeg используйте '-'. '-' указывает ffmpeg отправлять вывод на stdout . Обратите внимание, что тогда вам, возможно, придется вручную указать ваш вывод format в командной строке, потому что ffmpeg больше не может выводить его из имени файла (для этого вам может понадобиться ключ -f).

Если у вас есть эта командная строка, обратитесь к любому количеству мест за помощью в чтении stdout в вашей программе на C # .

0 голосов
/ 05 июня 2010

Круто, звучит так просто!

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

    System.Diagnostics.ProcessStartInfo psi =
    new System.Diagnostics.ProcessStartInfo(@"ffmpeg.exe");
    psi.Arguments = @"-i movie.avi -vn -acodec pcm_s16le -ar 44100 -ac 1 -f wav -";
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    Process proc = Process.Start(psi);
    System.IO.StreamReader myOutput = proc.StandardOutput;
    proc.WaitForExit();
    string output;
    if (proc.HasExited)
    {
        output = myOutput.ReadToEnd();
    }
    MessageBox.Show("Done!");

Когда я выполняю это сейчас, черная коробка cmd просто всплывает и продолжает мигать на меня. Когда я открываю диспетчер задач, он показывает, что он ничего не делает.

Если, однако, я установил для свойства RedirectStandardOutput значение false, оно показывает правильный вывод на экране cmd.

Короче говоря: ffmpeg теперь перенаправляет вывод, но я не могу прочитать его с моим C # кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...