Pergunta

Estou tentando lançar uma instância do programa de videolan a partir de um aplicativo Java. Uma das maneiras pelas quais tentei fazer isso é mostrado aqui:

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}");

Se eu executar o comando acima, o programa VLC será iniciado e iniciará uma operação de streaming (ele passa por fases de conexão, buffer e streaming).

Quando o comando é executado pelo executivo de execução (ou partida do ProcessBuilder), o programa VLC ficará pendurado quando chegar ao final da fase de buffer. Se todos os threads no programa Java for encerrado/executado até o fim, o programa VLC progredirá para a fase de streaming. O processo Java não será encerrado até que o processo VLC seja fechado, portanto esse comportamento é obviamente o resultado de algum tipo de acoplamento entre os processos.

Tentaram executar o comando indiretamente, escrevendo -o em um arquivo .cmd e executando -o, mas resulta no mesmo comportamento.

Alguma idéia de como posso evitar o processo externo pendurado?

Foi útil?

Solução

Hmm, meu palpite seria que o VLC encheu seu buffer de stdout e está pendurado em uma instrução Printf porque o stdout está esperando que esse buffer esvazie.

Você precisa obter o fluxo para a saída do processo e lê -lo (mesmo se você o descartar).

Eu recomendo que você leia isso artigo

Na 4ª página, há um bom exemplo de como ler os fluxos nos threads para que seu processo filho não bloqueie.

Outras dicas

Este site é fantástico :). Por alguma razão, uma abordagem que eu pensei que já havia sido tentada de repente começou a trabalhar.

O problema é que o VLC grava no seu stderRout (que não é visível quando executado em um prompt). Em seguida, ele bloqueia quando algum buffer de saída está cheio. Uma solução é redirecionar um stderr para o stdout e, em seguida, ter um thread esvaziar o fluxo de entrada do objeto de processo.

No entanto, não é uma solução ideal, pois preciso de uma quantidade razoável de processos externos e você não pode fazer E/S não bloqueando seus fluxos de entrada. Experimá-lo um pouco com a leitura vazia de uma unidade de serviço do timer para vários processos. Outras sugestões de como descobrir os processos para evitar esse problema são muito bem-vindas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top