lunes, 4 de julio de 2011

MMS Dumper ( libmms windows )

http://www.megaupload.com/?d=P4KV4U6R

MMS Dumper, es una aplicacion qué nos permite generar nuestros archivos wmv a partir de un servidor mms, utiliza la tecnologia libmms ( de GNU/Linux ) portada a windows, y nos permite hacer todo lo comentado anteriormente.

El modo de uso es el siguiente:

Descomprimimos el rar en cualquier directorio.

Seguidamente, entramos en el directorio, y ejecutamos el programa desde la terminal:

libmms_windows

Y nos saldra la siguiente salida:

Modo de uso: mms_dumper: (url_mms)(host)(query)(puerto)(band_width)(fichero_de_salida)(tiempo de descarga establecido en bytes).

Ejemplo:libmms_windows mms://live1.wm.skynews.servecast.net/skynews_wmlz_live300
k live1.wm.skynews.servecast.net /skynews_wmlz_live300k 1755 160 out.wmv 314572

Para probar el programa ejecutar en el cmd:

cd carpeta ( donde se encuentre el programa ).

libmms_windows mms://live1.wm.skynews.servecast.net/skynews_wmlz_live300
k live1.wm.skynews.servecast.net /skynews_wmlz_live300k 1755 160 out.wmv 314572



Y nos saldra lo siguiente:

[INFO]Current position of stream:236544
[INFO]Current position of stream:237568
[INFO]Current position of stream:238592
INFO]Current position of stream:239616
[INFO]Current position of stream:240640
INFO]Current position of stream:241664
INFO]Current position of stream:242688
INFO]Current position of stream:243712
INFO]Current position of stream:244736
INFO]Current position of stream:245760
INFO]Current position of stream:246784
INFO]Current position of stream:247808
INFO]Current position of stream:248832
INFO]Current position of stream:249856
INFO]Current position of stream:250880
INFO]Current position of stream:251904
INFO]Current position of stream:252928
INFO]Current position of stream:253952
INFO]Current position of stream:254976
INFO]Current position of stream:256000
INFO]Current position of stream:257024
INFO]Current position of stream:258048
INFO]Current position of stream:259072
INFO]Current position of stream:260096
INFO]Current position of stream:261120

Y seguidamente, y se descargara el flujo en la direccion indicada.

Saludos.




domingo, 3 de julio de 2011

Convirtiendo un fichero flv a mp3 con FFMPEG

En este tutorial aprenderemos a convertir un fichero flv a mp3 con ffmpeg.

ffmpeg -i [fichero_flv] -ar [frecuencia_de_muestreo] -ab [bitrate] -ac [channels] [fichero_acabado_en_mp3.mp3]

Por ejemplo podriamos hacer lo siguiente con un video de youtube (h264/acc).

ffmpeg -i youtube.flv -ar 44100 -ab 320000 -ac 2 out.mp3

Resultado: un fichero con una frequencia de muestro de 41.0 con un bitrate de 320 kbps ( maxima calidad ) ( normalmente el algoritmo de compresion mp3 se le suele aplicar al parametro -ac el valor 2 ( dos channels ).

Para poder codificar ficheros flv u otros a mp3 es necesario haber compilado ffmpeg con soporte para libmp3lame el flag necesario para hacerlo es el siguiente:

--enable-libmp3lame.

Saludos!

jueves, 9 de junio de 2011

Introduccion a LIVE555

En este pequeño tutorial vamos a ver, como conectarnos a un servidor RTSP y como descargar un flujo RTSP mediante live555 cabe destacar qué se añade documentacion adicional para cualquier duda qué surga al leer este documento.

Protocolo RTSP, pero qué es RTSP?

El protocolo RTSP es un protocolo basado en texto, nos permite realizar peticiones desde un cliente hacia un servidor remoto, lo qué facilita mucho la implementacion de este protocolo en un lenguaje de alto nivel,y cabe destacar qué tiene un gran parecido al protocolo tambien basado en TEXTO qué es el famoso protocolo HTTP.

Es viable hacer streaming bajo MOTION JPEG?

Bajo mi propia experiencia, el protocolo HTTP bajo motion jpeg no es viable para:
Sistemas de videovigilancia qué exigan videos en alta definicion
Usuarios qué necesiten realizar streaming on demand, debido a qué es necesario realizar transcoding para qué un reproductor externo reproduzca la grabacion, el video no veria exactamente impecable ( bloqueos en la imagen al realizar el visionado en el player flash )
En el caso de grabar desde una camara IP, no es nada recomendable utilizar motion jpeg, las camaras actuales utilizan H264 y rtsp totalmente recomendable para streaming ).

Qué es LIVE555?

Live555 es un entorno de desarollo multiplataforma utilizado por vlc, mplayer y otros sistemas de reproduccion multimedia, qué nos permitiran acceder a una fuente rtsp, y codificarla en caso necesario en otro formato, ya qué las fuentes rtsp originalmente qué se emiten en h264 el fichero dumpeado no suele poder reproducirse bajo ningun concepto en ningun player, y se tiene qué recodificar en flv o en otro formato reproducible bajo el entorno donde trabajemos.

Lo qué sucede es qué ffmpeg sí probamos a codificar el fichero h264 sin insertar el start_code, y otros datos codificados en base64 no sera capaz de reconocerlo como un fichero encapsulado en h264 por eso se requiere insertar estas cabezeras en el flujo qué nos llege de live555 ( aunqué no es tan facil como parece ), debido a qué estos datos se deben concatenar con el buffer qué llega de la fuente original rtsp.

Una vez tenemos un buffer qué es reconocido como un buffer encapsulado en h264, podemos pasarselo a un decodificador qué se encarga de insertar los datos decodificados en un frame distinto, para qué despues libavcodec u otro codificador qué useis, sea capaz de recodificar los datos recodigos por el decodificador, y lo recodifique en otro formato, especificando un timestamp correcto, y otros valores como la cantidad de cuadros por segundo, el bitrate el sample rate, etc.

Código:
uint8_t * buffer = new uint8_t[1024];
int ptrFinished = 0;
AVFrame * pFrame = avcodec_alloc_frame();
avcodec_decode_video2(avcodecCtx,pFrame,&ptrFinished,&pkt);

AVFrame = recoge los datos decodificados
ptrFinished = evalua si ha terminado de decodificar los datos, o no.

Cada vez qué se termine de abrir un codec, realizar el proceso de decodificacion/codificacion, los punteros se deben liberar, y la conexion se debe de cerrar para no malgastar memoria incesaria.

libavcodec proporciona lo siguiente:
Código:
av_freep(pkt);

pkt = AVPacket es una estructura qué contiene los siguientes miembros:

data = datos decodificados.
size = buffer size.

pkt es un puntero instanciado de esta estructura, qué se sobrecarga en avcodec_decode_vide o para decodificar los datos de video


Abriendo una conexion con LIVE555 y el servidor RTSP

Código:
this->client = RTSPClient::createNew(*this->env, 1,"User agent");

Abre una conexion con el servidor, *this->env, es un puntero qué se instancia de la siguiente manera:

Código:
TaskScheduler * scheduler = BasicTaskScheduler::createNew();
this->env = BasicUsageEnvironment::createNew(*scheduler);

Es necesario cada vez qué creemos instancias de un nuevo RTSPClient, para conectarnos.

el segundo parametro especifia el nivel de debug qué se utilizara ( modo verbose ) para imprimir cada suceso qué vaya pasando en el proceso de conexion con el servidor.

"User Agent" es el user agent del servidor, es un nombre de descripcion qué se utiliza para describir el cliente qué se ha utilizado en la conexion final con el servidor.






Ficheros de cabezera:
Código:
#include
#include
#include "GroupsockHelper.hh"


Procesando la conexion con el servidor

Código:
char * describe_options = this->client->describeURL(this->rtsp_url);

Enviamos el comando DESCRIBE al servidor remoto ,para listar los posibles comandos qué estan disponibles en el servidor.

Código:
sdp_description = strDup(describe_options);

Copiamos describe_options a una variable publica para poder acceder desde otros metodos o funciones publicas.

Código:
UsageEnvironment * environment = this->env;
char * sdp = this->getSDP();
if ( environment != NULL )
{
this->session = MediaSession::createNew(*environment,sdp);
}


sdp = obtenemos la descripcion SDP.
enviromment = obtenemos el puntero instanciado de BasicUsageEnvironme nt, qué sera construido una vez llamado al metodo o funcion validos qué se encarguen de retornar un puntero non null.

Creamos una sesion rtsp asignando a el puntero publico, los datos qué nos llegen de la llamada MediaSession::createNew(*environment,sdp);

esta session nos permitira identificar los codecs de audio y video qué utilizan los flujos y subflujos de audio utilizados por lo qué nos esta enviando.

Código:
this->it = new MediaSubsessionIterator(*this->session);

this->it hace referencia a MediaSubSessionIter ator y es sobrecargado con un puntero del tipo MediaSubsession ,para recoger el numero de flujos del qué dispone.

Los flujos se inicializan de la siguiente manera:

Código:
if ( this->subsession->initiate() )

true si se han iniciado, false si no se han iniciado alguno de los flujos.

Ahora fuera del bucle, volvemos a recorrer los flujos volviendo a crear otro iterador, o directamente sobreescribiendo el qué tenemos así:

Código:
this->it = new MediaSubSessionIterator(*this->session);

Una vez tenemos sobreescrito el puntero, volvemos a recorrer los flujos disponibles:

Código:
while ( ( subsessionSecond = it->next() )!= NULL )
Código:
cliente->setupMediaSubsession(*this->session)

Enviamos el comando SETUP, para qué directamente nos responda con el flujo de datos qué nos envia el servidor, antes de eso lo deberemos identificar como un flujo h264 o un flujo de audio ( otro ).
Código:
if ( strcmp(session->codecName(),"H264") == 0 ) LO QUÉ SEA...

dentro de lo qué sea podriamos escribir lo siguiente:

Código:
H264VideoFileSink * fileSink = H264VideoFileSink::createNew(*this->env, out_filename,
this->subsession->fmtp_spropparametersets(),

100000, false);

*this->env, parametro obligatorio
out_filename = fichero de salida.
fmtp_spropparameter sets = cabezeras codificadas en base64.
1000000 = bufferSize.
false = podria ser true, si queremos qué cree mas ficheros, false si solo es uno.

Compilacion para Linux de live555

Código:
./genMakeFiles linux
make install

Compilacion para windows

Código:
./genMakeFiles mingw
make install

Compilacion para mac os x


Código:
./genMakeFiles macosx
make install


Y hasta aquí el tutorial

Saludos.

VIDEOTUTORIAL, Como integrar nuevas opciones a ffmpeg


Modificando ffmpeg en español VIDEOTUTORIAL.


miércoles, 8 de junio de 2011

Comprendiendo el funcionamiento de ffmpeg.

En este post veremos comprenderemos el funcionamiento de ffmpeg.

  1. Integrando una opcion a ffmpeg (parametros)
1. Integrando una opcion a ffmpeg (parametro)

Si abrimos el fichero ffmpeg.c,y buscamos una linea qué ponga lo siguiente:

static const OptionDef options[]

Veremos qué lo qué hay dentro es un arreglo qué se compone de lo siguiente:

primera posicion: opcion del programa ( alias del comando qué se tecleara para reconocer al metodo qué se ejecutara al pasar el parametro a ffmpeg ).

segunda opcion:en la segunda posicion especificamos el tipo de parametro qué especificaremos como argumento dentro del parametro ( en el caso de qué se haya especificado qué es un argumento ) (HAS_ARG).

tercer parametro:Definicion de lo qué realiza el metodo o funcion qué se vaya a pasar en el arreglo.

Vemos un ejemplo:
{ "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },

Vemos qué se declara en la primera posicion de larreglo "f", qué sera el parametro el comando qué pasemos osease:

ffmpeg -f

HAS_ARG = se especifica qué debe de ser un argumento.

(void*)opt_format = Se especifica qué el metodo opt_format, se debe usar cuando se llame a -f es decir a ffmpeg -f (parametro ) para forzar qué se utiliza un formato a la hora de realizar la conversion a un formato distinto, osease:

opt_format("format");

Y por ultimo en la ultima posicion del arreglo, se pasa la descripcion de lo qué va a hacer determinada funcion.

Si nosotros probaramos a modfiicar ffmpeg de la siguiente manera declarando un metodo simple como este:

void hello_ffmpeg()
{
printf("%s","Hello ffmpeg!\n");
};

Y dentro de OptionsDef pusieramos esto:

Vemos un ejemplo:
{ "hellof", HAS_ARG, {(void*)hello_ffmpeg}, "hello ffmpeg!", "" },


Output:

Hello ffmpeg!

al ejecutar:

ffmpeg -hellof

Compilacion y testing:

En el primer post se explica como compilar ffmpeg, si ya habeis configurado vuestro ffmpeg con las opciones por defecto, simplemente teneis qué añadir.

make
make install



Saludos


Comenzando a programar con libavcodec,libavformat

  1. Compilando ffmpeg.
  2. Como trabajar con libavcodec,libavformat
  3. Es posible compilar libavcodec,libavformat para iphone?.
  4. Qué entornos de desarollo son los mas recomendados.
  5. Creando nuestro primer programa basico

1. Compilando ffmpeg.


Para empezar comenzaremos compilando nuestras librerias de la siguiente forma.
Podemos conseguir el codigo fuente desde subversion ( la ultima version en desarollo ), o,directamente conseguir otras versiones qué estan en revision o en fase final en formato tar,lo aconsejable es utilizar la ultima version desde subversion.Para eso simplemente nos desplazamos asta nuestra terminal en GNU/Linux, o en windows con un cliente grafico o en Mac con la terminal, y descargamos los ficheros de la siguiente direccion:
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg

Una vez tenemos los ficheros descargados nos desplazamos asta el directorio:

cd ffmpeg

Una vez nos hemos desplazado asta el directorio, existira un bonito fichero configure qué nos permitira ejecutar el comando tan tipico ( configure ) qué nos permitira especificar una serie de parametros para compilar nuestras queridas librerias y programas acompañados.

Especifico claramente:

./configure --help: nos muestra los flags con los qué podemos compilar nuestro software.
--enable-shared: genera las dependencias necesarias para utilizar con los programas acompañados por el software.
./enable-static: genera las librerias de desarollo qué son utilizables en Code::Blocks, en xcode, y en otros entornos.

Flags adicionales:

--enable-libx264 = Por defecto ffmpeg solo puede decodificar con h264, con x264 podemos utilizar el codec x264 con otros formatos ( flv ) etc.

--enable-libvorbis= Añade soporte con libvorbis

Tambien se pueden especificar otros flags para añadir compatibilidad con otros codecs, a gusto del usuario.

Una vez estemos dentro del directorio, teclearemos el siguiente comando:

./configure --disable-shared --enable-static

Se configura el codigo fuente para ser compilado sin generar las shared libraries, unicamente generaremos las dependencias necesarias para trabajar con el entorno de desarollo qué trabajaremos qué por defecto se instalara en /usr/local/lib, cabe destacar qué podemos especificar la ruta de instalacion de ffmpeg de la siguiente manera:

./configure --disable-shared --enable-static --prefix="directorio"

Compilado y generadas las dependencias, tendremos qué tener varios ficheros libavcodec.a, libavformat.a estas librerias son necesarias para trabajar con ffmpeg.


2. Como trabajar con libavcodec,libavformat.

Primero tendremos qué añadir los siguientes archivos a nuestro entorno de desarollo:

libavcodec.a
libavformat.a

Una vez añadidas las dependencias a nuestro entorno de desarollo, comenzaremos por escribir un programa muy simple:

#include
#include
int main(int argc,char ** argv)
{
avcodec_register_all();
av_register_all();
}

avcodec_register_all() = Simple funcion qué se encarga de registrar los codecs disponibles en nuestro software, si no escribimos esta instruccion en nuestro programa, estamos expuestos a qué al intentar codificar los datos qué nosotros recivamos desde internet, o decodificarlos, no sea posible debido a qué libavcodec no se ha inicializado.

av_register_all() = inicializa los codecs y formatos disponibles en el software imprescindible ejecutarlo antes de escribir cualquier instruccion.

Si no da ningun error significa qué las librerias estan linkadas correctamente.

3.Es posible compilar libavcodec,libavformat para iphone?.

los iPhone 3gs y los iPad deben de disponer de las librerias compiladas para armv7 (arquitectura nativa del procesador del iphone 3gs + 1, y ipad ) si quéremos qué funcione en los 3G necesitaremos compilarlo para la arquitectura armv6 ya qué poseen un procesador inferior a los modelos superiores de su hermano mayor para un mayor rendimiento.

https://github.com/gabriel/ffmpeg-iphone-build/blob/master/build-xvid-armv7

4.Qué entornos de desarollo son los mas recomendados.

Windows:

NetBeans
Razones:Intuitivo, muestra sugerencias de codigo ( code completion ), coloreado de sintaxis, subrayado de errores, facil de usar.

Code::Blocks
Razones:Intuitivo, facil de usar

Mac OS X:
Xcode
Razones:Code completion integrado, intuitivo y facil de usar.

GNU/Linux:
NetBeans:Intuitivo, facil de usar, code completion integrado.


5.Creando nuestro primer programa basico:

int main(int argc,char ** argv)
{
avcodec_register_all();
av_register_all();
AVFormatContext * c =avformat_alloc_context();
if ( av_open_input_file(&c,"url del archivo",NULL,0,NULL) != -1 )
printf("%s","\nAbierto correctamente");
}

av_open_input_file = se abre el fichero de entrada en modo lectura.

Codigo de respuesta != -1 OK de lo contrario AVERROR ( error no se ha podido abrir el archivo o no se llamo a avcodec_register_all() y o av_register_all() ) .

Y aquí se termina esta pequeña introduccion seguiremos viendo mas cosas sobre ffmpeg y sus librerias.

Saludos.