Comunidad de diseño web y desarrollo en internet online

Convertir un video a binario =)

Citar            
MensajeEscrito el 11 May 2008 03:18 pm
Hola a todos! Es mi primer post en este foro, aunque llevo años leyendo vuestros tutoriales...:P!

El caso es que me he metido de lleno con actionsript, y estoy experimentando un poco, porque no tenia ni idea de su funcionamiento... Y trasteando con varias aplicaciones, se me ha planteado un rpoblema, que espero sepais resolver :D

Resulta que quiero hacer algo parecido a esto http://www.cristalab.com/tips/31587/imagen-bmp-a-arreglo-de-bytes-en-flex-2-y-actionscript-3 , Solo que en lugar de una imagen, hacerlo con un video. Uso Flex3 (as3)... Es posible? Influiría el formato del video?

Muchas gracias y un saludo!!

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 May 2008 07:58 pm
Yo diría que depende de de dónde sacas el vídeo. Por ejemplo, si lo vas a cargar desde algún sitio, puedes usar un URLLoader y su propiedad data (habiendo puesto su dataFormat en URLLoaderDataFormat.BINARY) para obtener un ByteArray con el vídeo que has cargado.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 11 May 2008 08:39 pm
La idea es sacarlo del propio PC; Va a ser una aplicacion AIR que coja archivos y los envie en un multiform o similar, para lo que necesito convertirlo a Binario; Y sinceramente, he empezado hace poco con FLEX, y aun habiéndome leido toda la documentacion existente, no consigo hacer esto que propongo :P....Y no domino mucho el metodo para usar cada funcion (como la de ByteArray,etc).. Alguien me puede echar una mano o decirme donde puedo aprender a hacerlo? Si hace falta que lea por mi mismo, no hay problema; Es mas, lo haría, pero en este ejemplo concreto no encuentro nada;

Mil gracias

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 02:55 am
Me encuentro con un problema que no consigo solucionar, y es que al leer el archivo, no me almacena todos los datos, tan solo los existentes hasta el primer espacio (En cuanto a espacio me refiero a la chapucera accion de abrir el video con el bloc de notas y ver donde esta el primer espacio)... Y claro, eso no me sirve :S

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 02:57 am
No hay forma de almacenarlo en ASCII, binario puro, hexadecimal, o algo asi para evitar espacios? Perdonad mi ignorancia, pero en que formato me lo esta guardando? me almacena cosas tal que asi:

ŒkøÉÑð,{Ñ¢gÌṞ;jÝñŠI;éA‘'@

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 10:04 am
Un video en ASCII ?????
Una simple foto de 300 x 300 le toma unos 20 segundos exportarla (bueno, en AS2, ponle menos de la mitad en AS3), hacer eso con video te puede tomar una eternidad

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 May 2008 10:45 am
No se no se, solo propongo, no tengo ni idea xD.. Entonces cual es el formato en el que debo almacenarlo? en que codigo (o como se llame) se esta guardando? Y por qué no se guarda todo?

Saludos

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 11:15 am
Usualmente se saca un bitmap como captura de pantalla y eso se usa mucho para aplicaciones de dibujo, de personalizar camisetas, etc, pero no entiendo bien tu objetivo con lo del video.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 May 2008 11:52 am
El objetivo es almacenar el video para poderlo subir a un servidor, que no admite un metodo normal, sino que tengo que enviarlo con un multiform que haré posteriormente, en el que necesito incluir todo el archivo en binaryo (si, se que es largo).

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 12:00 pm
Estoy usando lo siguiente:

var bytes:ByteArray = new ByteArray();
var myFileStream:FileStream = new FileStream();
myFileStream.addEventListener(ProgressEvent.PROGRESS, progresssHandler);
myFileStream.addEventListener(Event.COMPLETE, completed);
myFileStream.openAsync(file, FileMode.READ);
myFileStream.position = 0;

var str:String = "";
var brs:int = new int;

function progresssHandler(event:Event):void
{
if (myFileStream.bytesAvailable > 0 )
{
brs += myFileStream.bytesAvailable;
str += myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1");
}
}
function completed(event:Event):void
{
taFiles.text = String(str); //El resultado de leer el video
b1.text = String(brs + "---------->" + myFileStream.bytesAvailable); // El valor de BytesAvailable antes y despues de ejecutar todo
b2.text = String(file.size); // El tamaño del archivo, para compararlo con la variable brs
}



Ejecutandolo, habiendo definido un file:File previamente, puedes comprobar como la variable brs (los bytes availables) son siempre inferiores al file.size, y varian cada vez que ejecutas el codigo... Por lo que nunca leo el archivo entero. Se que algo hago mal, xq soy nuevo en Flex, pero no entiendo qué.

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 02:42 pm

Código :

//IMPORTS:
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.utils.ByteArray;
//
//
//
private function getBytesFromFile (inputFile : File) : ByteArray{
var fs :FileStream=new FileStream ();
fs.open(inputFile,FileMode.READ);
var ba:ByteArray = new ByteArray ()
fs.readBytes(ba , 0 , fs.bytesAvailable);
return ba;
}
//Y usas la función donde sea, por ejemplo:
public function TuClase ()
{
    var file:File = new File("C:\\tuvideo.avi")
    trace (getBytesFromFile (file).length);
}

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 12 May 2008 02:59 pm
Muchas gracias, ahora en un momento lo compruebo ;)

(por cierto, existe alguna forma de enviar en Flex un multipart/related form? me da que no..verdad?

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2008 03:06 pm
Si miras en el método Filereference.upload, verás que en el request puedes mandar datos asociados, algo que no se podía en AS2

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 12:02 pm

Zah escribió:

Código :

//IMPORTS:
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.utils.ByteArray;
//
//
//
private function getBytesFromFile (inputFile : File) : ByteArray{
var fs :FileStream=new FileStream ();
fs.open(inputFile,FileMode.READ);
var ba:ByteArray = new ByteArray ()
fs.readBytes(ba , 0 , fs.bytesAvailable);
return ba;
}
//Y usas la función donde sea, por ejemplo:
public function TuClase ()
{
    var file:File = new File(\"C:\\\\tuvideo.avi\")
    trace (getBytesFromFile (file).length);
}



Pero con eso consigo el tamaño del archivo, no? Yo lo que busco es transmitir un video mediante un multipart/related form, que como no se puede hacer directamente con flex, debo hacerlo manualmente y por lo tanto tengo que incluir en ese multiform los datos binarios del video... ¿ Còmo? Es lo que no sé...

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 01:48 pm
Con eso lo que consigues es el archivo convertido en un bytearray, que es lo primero que preguntabas. Lo del tamaño era solo un ejemplo, pero puedes acceder tanto al resto de as propiedades como a los bytes individuales.

Lo de enviar los datos, no lo he hecho específicamente, pero diría que aquí y aquí está la solución.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 May 2008 02:12 pm
Un ejemplo rapidito de una subida de un archivo + info en un multipart

Código :

uploadURL = new URLRequest("http://misitio.com/archivo.php");
variables = new URLVariables();
variables.token = strTokenIdent;
variables.site_url = strSiteUrl;
uploadURL.data = variables;
uploadURL.method = URLRequestMethod.POST;
file.upload(uploadURL, "file", true); //file es un Filereference


Esto me salvó la vida para hacer un upload de video en API que esperan datos asociados (y que no podia hacer en AS2)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 02:45 pm
Gracias de nuevo, eso me da una idea... pero el gran problema es que tiene estoy trabajando con la API de youtube, y me pide que implemente además un trozo de XML con datos del video en cuestión, así como un "boundary code" que ni se lo que es ni se donde meterlo... Alguna sugerencia? xD

Código :

POST /feeds/api/users/default/uploads HTTP/1.1
Host: uploads.gdata.youtube.com
Authorization: AuthSub token=<authentication_token>
X-GData-Client: <client_id>
X-GData-Key: key=<developer_key>
Slug: <video_filename>
Content-Type: multipart/related; boundary="<boundary_string>"
Content-Length: <content_length>
Connection: close

--<boundary_string>
Content-Type: application/atom+xml; charset=UTF-8

API_XML_request
--<boundary_string>
Content-Type: <video_content_type>
Content-Transfer-Encoding: binary

<Binary File Data>
--<boundary_string>--



Ejemplo:

Código :

POST /feeds/api/users/default/uploads HTTP/1.1
Host: uploads.gdata.youtube.com
Authorization: AuthSub token=DXAA...sdb8
X-GData-Client: b1c4t9sl2159
X-GData-Key: key=adf15ee97731bca89da876c...a8dc
Slug: video-test.mp4
Content-Type: multipart/related; boundary="f93dcbA3"
Content-Length: 1941255
Connection: close

--f93dcbA3
Content-Type: application/atom+xml; charset=UTF-8

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/"
  xmlns:yt="http://gdata.youtube.com/schemas/2007">
  <media:group>
    <media:title type="plain">Bad Wedding Toast</media:title>
    <media:description type="plain">
      I gave a bad toast at my friend's wedding.
    </media:description>
    <media:category
      scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People
    </media:category>
    <media:keywords>toast, wedding</media:keywords>
  </media:group>
</entry>
--f93dcbA3
Content-Type: video/mp4
Content-Transfer-Encoding: binary

<Binary File Data>
--f93dcbA3--

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 02:56 pm
El boundary es parte del multipart, que lo arma directamente Flash (mira el ejemplo de la ayuda)
Yo estoy trabajando con el API de kewego y también tengo que pasar un XML, lo meto directamente como string en las variables (parámetro xml_data), en el pedacito anterior (lo omití pero es esta línea)

Código :

variables.xml_data = "<kewego_call><params><title>" + fileTitre + "</title><description>" + fileDescription + "</description><categories><category>LA ROUTE DU RIRE</category><category>Humour</category></categories>
<keywords><keyword>ROUTE</keyword><keyword>RIRE</keyword></keywords>
<language>fr</language><country>fr</country><postal_code>75000</postal_code>
<access>public</access></params></kewego_call>";


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 03:12 pm
Entonces no tengo que definir nada porque todo es automatico? Ah, el problema de usar este metodo creo recordar que venia porque no puedes incluir URLrequestHeader, ni ninguna forma de fijar cabeceras... o si puedes?

ah, en file.upload(request, "file", true);, file es una variable fileStream y "file" es lo que contiene? no se podria omitir ese "file"?

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 04:06 pm
file es el nombre que al campo del archivo, si lo omites se llamará "Filedata"
¿Cabeceras? Lo estás discutiendo aquí http://www.cristalab.com/foros/t56011.html, se las agregas al URLRequest

Jorge

PD: Moderadores, el POST citado debería ser movido a este Board

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 04:15 pm
Si si pero creo recordar que con file.upload las cabeceras son ignoradas... Y no me sirve :/

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 04:21 pm
No creas recordar, prueba

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 05:09 pm
Sencillamente no me realiza ninguna accion, algo esta mal :S

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 05:19 pm
Usa un sniffer para ver la conexión, examinar los headers que envías, ver la respuesta del API y si devuelve algún error. Si no estás usando alguno, te recomiendo Charles http://www.charlesproxy.com/

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 May 2008 05:44 pm
Viste los enlaces? La clase urlrequestheader es justo para eso.

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 May 2008 06:08 pm
Lo he conseguido!!!

Sube videos correctamente (todavia no he probado cn videos reales, para no tardas, sino con archivos de texto renombrados)!! Y lo que he hecho ha sido establecer las cabeceras, y en el contenido del request, meter una cadena a base de introducir el cuerpo del multipart manualmente, así como el propio video caracter a caracter... a ver que tal con videos reales...

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 06:09 pm
Tengo que decir que lo que mas me ha ayudado, por no decir, lo que me ha hecho conseguirlo, ha sido el Charles :P!

Muchas gracias

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 10:35 pm
Me sigue dando problema el asunto de leer un archivo binario (para pasarlo mediante una variable:String en el multiform)... COn archivos de texto me los lee enteros, pero si son de video, los deja a la mitad... (por ejemplo los mp4).

Código :

private function browse():void {
            var fileFilters:Array = new Array();
            fileFilters.push(new FileFilter("Videos", "*.avi;*.mpg;*.3gp;*.mp4"));
            file.addEventListener(Event.SELECT, selectHandler);
            file.browse(fileFilters);
         }
         
         private function selectHandler(event:Event):void {
     
         var bytes:ByteArray = new ByteArray();
         var myFileStream:FileStream = null;
         myFileStream = new FileStream();
         myFileStream.addEventListener(ProgressEvent.PROGRESS, progresssHandler);
         myFileStream.addEventListener(Event.COMPLETE, completed);
         myFileStream.openAsync(file, FileMode.READ);
         myFileStream.position = 0;

         var brss:String = "";
         var brs:int = 0;

         function progresssHandler(event:Event):void 
         {
            examinar.enabled = false;
            video.text = "Leyendo...Se paciente";
         
             if (myFileStream.bytesAvailable >= 0)
             {
             uploadProgress.setProgress(str.length, file.size);
             b1.text = "Cargados " + str.length + " de " + file.size+ "bytes";
             str += myFileStream.readMultiByte(myFileStream.bytesAvailable, File.systemCharset);
             }
         }

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 May 2008 11:08 pm
Lo que necesitas es codificarlo en Base64. Hay una clase de Flex que hace eso:

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 13 May 2008 11:18 pm
Pero... Si la API que estoy usando (youtube), indica que "Content-Transfer-Encoding: binary", no es probable que al codificarlo en Base64 y enviarlo asi, no lo lea y no consiga subir el video ?

Por eiprol

20 de clabLevel



Genero:Masculino  

firefox

 

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