Com o advento das tecnologias para exibição de vídeos na web, frequentemente lidamos com limitações dos fabricantes quanto ao formato dos mesmos. Por vezes, pesquisamos por players em Flash, SilverLight, ou adicionados a famosa tag <object> no html e temos a triste surpresa em ver que o formato de vídeo usado por nosso cliente não é o mesmo suportado pelo player ou pelo browser.
O formato mais utilizado na web é o FLV, por ser facilmente manipulado por aplicações em flash. Porém, quase sempre, é necessário algum tipo de conversão para obter o mesmo.
Esse artigo visa mostrar um método eficiente e eficaz para, quando necessário, realizar conversões de arquivos de vídeo. Vamos mostrar um exemplo de como fazê-lo integrado ao nosso código em .NET.
O Segredo está no uso da biblioteca ffmpeg, que é uma poderosa plataforma de conversão, gravação e exibição de áudio e vídeos. Esta biblioteca possui uma variedade imensa de métodos, mas, neste artigo, irei abordar apenas a conversão de arquivos de vídeos.
As principais vantagens da FFMPEG são:
- Funciona por meio de linha de comando (por isso pode ser aproveitada em qualquer tecnologia de desenvolvimento de software de sua preferência: ASP.net, PHP, ASP, Java.. etc);
- É multi-plataforma. Segundo o fabricante, roda em ambiente Windows e Linux. (testei com sucesso no windows);
- Possui suporte a uma grande variedade de formatos de vídeos e áudio (lista de formatos no final do artigo);
- Por último, mas não menos importante, é de GRAÇA!
Usando na prática
É possível converter arquivos “DE” e “PARA” qualquer extensão suportada. Por exemplo, é possível converter arquivos de Mpeg para FLV, FLV para Mpeg, Mpeg para 3gp, Vob para Mpeg…
- Baixe a última versão do ffmpeg;
- Descompacte o conteúdo em uma pasta de sua preferência;
- Abra o MS-DOS ou o console do linux, e navegue até a pasta onde descompactou o executável do ffmpeg;
- Execute a linha de comando para converter o arquivo de vídeo desejado.
Linha de comando
A linha de comando básica, para converter arquivos de vídeos, é composta dos seguintes pedaços:
- ffmpeg (chamada ao executável);
- -i arquivo_entrada.extensao;
- -f formato_de_saida arquivo_de_saida.extensão.
Exemplos:
- ffmpeg –i video1.mpeg –f flv novovideo.flv;
- ffmpeg –i video2.flv –f mov novovideo2.mov;
- ffmpeg –i novovideo.flv –f mpeg video2.mpeg.
Para arquivos que estão em outras pastas, use aspas duplas no nome dos mesmos:
- ffmpeg –i “c:\arquivo\video\novovideo.flv” –f mpeg “c:\arquivo\videompeg\video2.mpeg”
Existem também opções para selecionar o codec e a qualidade do vídeo e do som que será convertido. Adicionarei links úteis, no final do artigo, para a obtenção de mais exemplos e também para a documentação completa do ffmpeg.
Usando ffmpeg com .NET
É possível chamarmos qualquer arquivo executável com .NET através da classe System.Diagnostics.Process. Abaixo, segue um exemplo da execução do comando com .NET (C#):
// ------------------------------------------------
string caminhoFFmpeg = "C:\\ffmpeg\\ffmpeg.exe";
string origem = "origem.mpeg";
string saida = "arquivosaida.flv";
string formatosaida = "flv";
string comando = "-i \"" + origem + "\" -f " + formatosaida + " \"" + saida + "\"";
System.Diagnostics.ProcessStartInfo processStartInfo = new
System.Diagnostics.ProcessStartInfo(caminhoFFmpeg, comando);
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = processStartInfo;
// Executa o comando..
bool processStarted = process.Start();
// ------------------------------------------------
Veja aqui a documentação da mesma.
Anexo 1: Um projeto pronto, didático, para utilizar conversão de arquivos com ffmpeg e .NET (C#)
Desenvolvi este projeto de demonstração para converter arquivos de vídeo e, ao mesmo tempo, exibir o comando enviado para o arquivo executável e mostrar também a mensagem de retorno da operação.
No código fonte é utilizado a classe System.Diagnostic.Process e você poderá ver como obter a mensagem de retorno fornecida pelo executável que estamos chamando.
Para baixar o código fonte, clique aqui (esse projeto foi feito com Visual Studio 2005).
Anexo 2: Mais um projeto pronto, feito em .NET e ffmpeg
Nesse projeto, desenvolvido em .NET pela “Our Software”, o autor não exibe o retorno da operação, mas coloca opções avançadas em alguns formatos mais conhecidos de vídeos. Baixar o código fonte, para usar como referência, também é muito válido.
Link para baixar: http://www.softwarediscountvoucher.com/blog/2009/07/05/net-ffmpeg-gui/
Anexo 3: Lista de formatos suportados
3g2 | 3gp | 4xm | IFF | ISS | MTV | RoQ | a64 | aac | ac3 |
adts | aea | aiff | alaw | amr | anm | apc | ape | applehttp | asf |
asf_stream | ass | au | avi | avm2 | avs | bethsoftvid | bfi | bink | c93 |
caf | cavsvideo | cdg | crc | daud | dirac | dnxhd | dsicin | dts | dvd |
dxa | ea | ea_cdata | eac3 | f32be | f32le | f64be | f64le | ffm | ffmetadata |
film_cpk | filmstrip | flac | flic | flv | framecrc | framemd5 | g722 | gif | gsm |
h261 | h263 | h264 | idcin | image2 | image2pipe | ingenient | ipmovie | ipod | iv8 |
ivf | lmlm4 | lxf | m4v | matroska | matroska | webm | md5 | mjpeg | mlp |
mmf | mov | m4a | mp2 | mp3 | mp4 | mpc | mpc8 | mpeg | mpeg1video |
mpeg2video | mpegts | mpegtsraw | mpegvideo | mpjpeg | msnwctcp | mulaw | mvi | mxf | mxf_d10 |
mxg | nsv | null | nut | nuv | ogg | oma | psp | psxstr | pva |
qcp | r3d | rawvideo | rcv | rpl | rso | rtp | rtsp | s16be | s16le |
s24be | s24le | s32be | s32le | sap | sdp | siff | sox | spdif | svcd |
swf | thp | tiertexseq | tmv | truehd | txd | u16be | u16le | u24be | u24le |
u32be | u32le | u8 | vc1 | vmd | vob | wav | wc3movie | wsvqa | yuv4mpegpipe |
Obs: para ver a lista de formas suportados, use o comando -formats
Conclusão
A biblioteca ffmpeg é muito utilizada por desenvolvedores em todo o mundo, por ser robusta e muito rápida. Vale muito a pena estudá-la e conhecer suas opções de uso, para, então, usá-la como um recurso de automação em sistemas.
Através da classe System.Diagnostics.Process podemos integrá-la facilmente em nossas aplicações .NET e obter o resultado de cada operação realizada.
Dezenas de softwares gratuitos e pagos, em diversas linguagens distintas, foram desenvolvidos apenas como interface para esta biblioteca. Provando que vale muito a pena investir tempo para aprendê-la.
Referências
- http://ffmpeg.org/ffmpeg.html (ffmpeg documentation);
- http://www.videohelp.com/tools/ffmpeg (Gui Interfaces for ffmpeg);
- http://www.webologist.co.uk/blog/converting-mpg-to-flv-using-ffmpeg (Converting MPG to FLV Using FFMPEG );
- http://www.ehow.com/how_6796344_convert-flv-mpeg-ffmpeg.html (How to Convert FLV to MPEG With FFMPEG);
- http://www.softwarediscountvoucher.com/blog/2009/07/05/net-ffmpeg-gui/ (.NET ffmpeg GUI);
- http://msdn.microsoft.com/pt-br/library/system.diagnostics.process.aspx (Microsoft documentation for system.diagnostics.process class).