Vou contar uma histórinha. Pesquisando sobre http streamming para iPhone eu cheguei ate esta solução open source que utiliza, entre outras coisas, o ffmpeg. Eis que chego até este interessante trecho:
If you are interested in how the segmenter works you can find out more on how to use libavformat at the following resources: an older libavformat tutorial, some sample libavformat code, How to Write a Video Player in Less Than 1000 Lines, and more sample libavformat code.
Ora… não pensei duas vezes e cliquei no link sobre escrever um video player, curioso que sou. É um tutorial bem proveitoso,
que ja dá frutos na primeira lição. Deixo aqui um pequeno exemplo que analisa arquivos de video e informa dados do codec de cada stream (audio, video e o que mais tiver la dentro).
#include <libavcodec/avcodec.h> #include <libavformat/avformat.h> int main(int argc, char **argv){ int i; char buf[256]; AVFormatContext *pFormatCtx; av_register_all(); while(*(++argv)){ printf("analisando arquivo '%s'\n",*argv); if(av_open_input_file(&pFormatCtx, *argv, NULL, 0, NULL)!=0 || av_find_stream_info(pFormatCtx)<0){ puts("nao foi possivel analisar este arquivo!"); continue; } for(i=0;i<pFormatCtx->nb_streams;i++){ avcodec_string(buf, sizeof(buf), pFormatCtx->streams[i]->codec, 0); printf("\tstream[%d]=%s\n",i,buf); } } return 0; }
Para compilar basta adicionar a libavcodec e a libavformat (apt-get nelas).
gcc -lavformat -lavcodec -Wall a.c
A execução é simples:
$ ./a.out * analisando arquivo 'teste.bin' stream[0]=Video: wmv2, yuv420p, 320x240 stream[1]=Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
Não apenas voltei a programar em C (que é uma delícia) como produzi um executavel bem enxuto (12 k) e util para determinar os codecs presentes em dado arquivo. Divertido. Vamos ver o que é possivel fazer agora.