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?
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
Cuando dices InputStream en función de un desplazamiento dado, ¿sigues hablando de jCifs (SmbFile) y de desplazamiento en bytes? – sbrattla
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