Pregunta

Estoy tratando de iniciar una instancia del programa VideoLAN desde una aplicación Java. Una de las maneras que he tratado de hacer esto se muestra aquí:

Process p = Runtime.getRuntime().exec("\"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe\" \"http://www.dr.dk/Forms/Published/PlaylistGen.aspx?qid=1316859&odp=true\" :sout=#std{access=udp,mux=ts,dst=127.0.0.1:63928}");

Si ejecuto el comando anterior se pondrá en marcha el programa VLC, y comenzará una operación de streaming (que pasa a través de conexión, almacenamiento temporal y fases después streaming).

Cuando la instrucción se ejecuta de tiempo de ejecución Exec (o inicio ProcessBuilder), el programa VLC se bloqueará cuando se llega al final de la fase de amortiguación. Si se terminan todas las discusiones en el programa java / correr a su fin, el programa VLC progresará a la fase de streaming. El proceso de Java no terminará hasta que el proceso VLC está cerrado, por lo que este comportamiento es, obviamente, el resultado de algún tipo de acoplamiento entre los procesos.

¿Ha intentado ejecutar el comando indirectamente por escribir en un archivo .cmd y luego ejecutarlo, pero los resultados en el mismo comportamiento.

¿Alguna idea de cómo puedo evitar el ahorcamiento proceso externo?

¿Fue útil?

Solución

Hmm, creo que ha de ser que VLC llena el búfer STDOUT y se cuelga en un comunicado printf porque STDOUT está esperando a que el buffer se vacíe.

Es necesario para obtener la corriente de salida del proceso y leerlo (incluso si que la descartes).

Te recomiendo que leas este artículo

En la página de cuarto es un buen ejemplo de cómo leer las corrientes en los hilos para que su proceso hijo no bloqueará.

Otros consejos

Este sitio es fantástico :). Por alguna razón, un enfoque que pensaba que ya se había tratado de pronto comenzó a trabajar.

El problema es que VLC escribe a su stdErrOut (que no es visible cuando se ejecuta en un sistema). A continuación, una vez que bloquea algunos buffer de salida está llena. Una solución es tener un stderr redirigido a stdout y luego tener un hilo vaciar el flujo de entrada del proceso objeto.

Sin embargo, no es una solución óptima, ya que necesito una buena cantidad de procesos externos, y no se puede hacer sin bloqueo de E / S en las corrientes de su entrada. Será experimentar un poco con tener un vacío de lectura de la unidad de servicio de temporizador para una serie de procesos. Otras sugerencias para que se disocie de los procesos para evitar este problema son muy bienvenidos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top