Comunidad de diseño web y desarrollo en internet online

Trabajo con segmento de datos

Citar            
MensajeEscrito el 21 Abr 2014 12:25 am
Saludos.
Estoy desarrollando una aplicación p2p en as3 y me gustaria poder segmentar un video..
Es decir leer un video que estás almacenado un directorio x, pero solo me interesa poder transmitir un pedazo en especifico. Por ejemplo trasmitir los bytes correspondientes a partir de una posicion inicial hasta una posicion final


Estaba trabajando con filestream

if(video_stream.bytesAvailable >= 8000)
{

video_stream.readBytes(bytes_t,26000,8000);
clientSocket.writeBytes(bytes_t,26000,,8000);
clientSocket.flush();

}
El punto es que no me funciona...
No lee los 8000 bytes a partir de la posicion 26000

Por yoselinp

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Abr 2014 01:58 am
Mira, en si, segmentar un archivo para enviar chunks de data (archivo complete) es simple, pq siempre que envies todos los bytes, va a ser valido, el tema es si queres segmentarlo a fin de enviar un pedazo de data "legible" o sea, si por ejemplo, queres regenerar una seccion de video "valida", lo cual ya seria muchisimo mas complicado (necesitas un encoder-decoder para generar una estructura de archivo valida).

Aca tenes un ejemplo de streaming de webcam en tiempo real entre 2 clientes usando rtmfp. Para ver tema de streaming hay bastantes recursos en Google.

Volviendo a tu tema, transmitir un pedazo especifico de video, creo que no te va a resultar sino tenes un encoder, porque si o si tenes que enviar un fragmento valido (que contenga los metadatos validos).
Creo que hay alguna solucion online para trabajar con FLVs, pero la veo verde con otros formatos como mp4, or mkv, aunque quizas podrias hacer a la inversa, y reencodear el video en tiempo real con la libreria mmpeg y NativeProcess, aca tenes un punto de partida interesante.

Por lo visto estas usando sockets, no P2P. Igualmente es valido, primero proba que el archivo se escriba bien localmente.

Esto me escribe 1Mb de datas del mp4, lo cual parece valido (no se si lo es), para VLC... que me da 2 segs de reproduccion.

Código ActionScript :

var videoFile:File  = File.desktopDirectory.resolvePath('storm.mp4');
      var ba:ByteArray = new ByteArray();
      var fs:FileStream = new FileStream();
      fs.open(videoFile, FileMode.READ);
      fs.readBytes(ba, 0, 1000 * 1000 ); // 1mb de data. (son 2 segundos en mi video de prueba)
      fs.close();

      var outputFile:File = File.desktopDirectory.resolvePath('output.mp4');
      fs.open(outputFile, FileMode.WRITE);
      fs.writeBytes(ba);
      fs.close();
      outputFile.openWithDefaultApplication();

// con respecto a tu codigo : 
// aca hubieses tenido un error si tratabas leer desde una posición inexistente.
if(video_stream.bytesAvailable >= 26000+8000 ) { 
bytes_t.clear();
video_stream.readBytes(bytes_t,26000,8000); 
clientSocket.writeBytes(bytes_t,26000);  // tenes que aplicar el offset aca?
clientSocket.flush(); 
} 


Comentario aparte, yo use esta forma de "descarga" parcial, en una app de ipad, donde tenia que descargar un video de 500mb , y obviamente, un FileStream o URLStream abierto descargando data constantemente, dejaba sin memoria al dispositivo y lo hacia crashear, por eso, copiar de a pedazos de datos y liberando la memoria de Flash, es lo más practico que podes hacer.

Contanos si tuviste algun progreso.

Por rodrigolopezpeker

61 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.