2013-07-25 1 views
0

Мне поручено перекодировать кучу видео файлов GoToMeeting каждый вечер. Как только видео было перекодировано, оно будет загружено на веб-сайт. Однако, прежде чем я зашел слишком далеко в проект, я хотел выяснить, возможно ли это.Синхронные команды C# при запуске внешних программ

Мой текущий образец сценария - это простой командный файл, в котором я могу перетащить несколько файлов в пакетный файл. Он перекодирует первый файл, отображает вывод и затем переходит ко второму файлу для перекодирования. Это ожидаемое поведение, которое я ищу.

@echo off 
C:\g2mtranscoder.exe source=%~1 
echo %~1 has completed. 
C:\g2mtranscoder.exe source=%~2 
echo %~2 has completed. 
C:\g2mtranscoder.exe source=%~3 
echo %~3 has completed. 
C:\g2mtranscoder.exe source=%~4 
echo %~4 has completed. 
pause 

Мой вопрос заключается в том, что если в C# (будет служба Windows, в конечном счете), это было бы так просто, как вызов внешней программы g2mtranscoder.exe сделать транскодирование, а затем положить мой сценарий загрузки сразу после этого? Очевидно, что я бы не захотел загружать видео, которое в настоящее время перекодировано, и я не хочу, чтобы видео было загружено, не будучи предварительно перекодированным.

Мое подзапрос будет помещать это в цикл (для каждого файла в каталоге), вызывают какие-либо проблемы, если содержимое каталога всегда является перекодированным видео в ожидании? Если в цикле попытаться выполнить цикл и начать транскодирование всех файлов в каталоге асинхронно или было бы более синхронным? Я хотел бы избежать цикла, выполняющегося асинхронно, поскольку он может перегружать машину, вызывая артефакты или проблемы синхронизации с синхронизацией аудио/видео. Самое главное, видео в середине перекодирования или нетранзированного видео не может быть загружено.

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

Я больше человек из Руби/Рельсов и Linux и не имею большого опыта работы на C#. Я знаю достаточно, чтобы быть опасным, но просто хочу убедиться, что то, что я ищу, возможно.

ответ

0

Я понял. Я могу создать процесс, а затем использовать флаг HasExited, чтобы дождаться завершения процесса. Закончив, я могу продолжить загрузку программы. Успешный выход будет иметь значение HasExited0, тогда как неудачный выход будет 1 или -1.

StartInfo.Arguments позволит мне передать source=<location of GTM video> для обработки видеофайла.

Console.WriteLine("Running"); 
Process pr = new Process(); 
pr.StartInfo.FileName = "Notepad.exe"; 
pr.StartInfo.Arguments = "test.dat"; 
pr.Start(); 
while (pr.HasExited == false) 
    if ((DateTime.Now.Second % 5) == 0) 
    { // Show a tick every five seconds. 
     Console.Write("."); 
     System.Threading.Thread.Sleep(1000); 
    } 

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

  • Нет связанных вопросов^_^