2012-07-27 9 views
6

Estoy reproduciendo un archivo de audio con jlGui's BasicPlayer (está basado en Javasound). El archivo está en un recurso compartido de Samba y estoy usando Jcifs para acceder a él. Me da un InputStream.Manera eficiente de buscar una transmisión de audio a través de la red con InputStream

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(...); 

SmbFile f = new SmbFile(...); 
SmbFileInputStream audioIn = new SmbFileInputStream(f); 

int bufSize = 8096;//should I use f.length() here? 
audioBIS = new BufferedInputStream(audioIn, bufSize); 

audioBIS.mark(f.length()); 

    //call BasicPlayer 
play(audioBIS); 

Necesito poder colocar el puntero en cualquier parte del archivo, como cualquier otro reproductor común. La única solución que se me ocurrió fue usar un BufferedInputStream y una combinación de marca/reiniciar/omitir cada vez que necesité reposicionar el puntero. Tan pronto como abro el archivo y obtengo el flujo, llamo al método mark(), de modo que un reset() posterior me cambie de posición al principio. Luego, con skip(), puedo ir a donde quiero.

audioBIS.reset(); 
audioBIS.skip(newBytePosition); 

Mi problema es que el salto() llamada funciona como se desea sólo si puedo especificar un buffer lo suficientemente grande como para contener todo el archivo.

¿Hay una manera más eficiente de hacer esto?

Respuesta

2

He estado siguiendo el mismo camino que ahora. El caso fue que teníamos un servidor (y un recurso compartido SMB) con miles de archivos de audio. Estos archivos deben poder reproducirse en una aplicación.

Empecé con jCifs, y modifiqué la fuente de BasicPlayer para tratar con SmbFile de la misma manera que trataría con File. Funcionó bien, pero cuando se trata de buscar/saltar, realmente no te deja sin aliento. Siempre y cuando tengas una buena conexión con el servidor, deberías estar bien.

Terminé abandonando esa solución, y en su lugar instalé tomcat6 en el servidor e implementé un servlet pequeño y simple que permitiría realizar solicitudes para un archivo en una posición determinada. La máquina del cliente tomaría la respuesta como InputStream y la pasaría a BasicPlayer. Funciona mucho mejor, y la reproducción es instantánea. El código es un poco más de lo que es razonable pegar aquí, pero estaría dispuesto a compartirlo contigo si estás interesado.

+0

Su solución parece muy interesante, pero no tengo suficiente alcance en el servidor para instalar tomcat. De todos modos, podría pensar en un contenedor de BasicPlayer que hace más o menos lo mismo, cuidando las funciones seek y getTime. Sólo una pregunta. ¿Cómo se genera un Inputstream basado en un desplazamiento dado? La respuesta dada [aquí] (http://stackoverflow.com/questions/5923817/how-to-clone-an-inputstream) es inspiradora y también implica el almacenamiento en caché, pero me preocupa la sobrecarga que introduciría haciendo copias de enormes matrices. – Giuseppe

+0

Cuando dices InputStream en función de un desplazamiento dado, ¿sigues hablando de jCifs (SmbFile) y de desplazamiento en bytes? – sbrattla

+0

Me refería a la parte en la que dices "La máquina cliente tomaría la respuesta como un InputStream".¿No quiere decir que el servidor responde con un flujo de entrada que comienza en la posición deseada? – Giuseppe

0

Como alternativa. Siempre puede cerrar la secuencia y volver a crearla. Parece ir rápido y vuelves a la posición 0 si es necesario.

Manténgase al tanto de dónde se encuentra. Siempre que avance, mantenga la secuencia y salte con skip(). Una vez que necesite regresar, cierre esa secuencia y cree una nueva y salte() a la posición deseada.

A menos que la aplicación sea pesada en backskipping todo el tiempo, debería estar bien.

Recógelo en una nueva corriente agradable y personalizada y tendrá una secuencia que respalda el ir y venir.

Cuestiones relacionadas