Problema

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 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 o mesmo.

Objetivo

Esse artigo visa mostrar, de forma introdutória, um método eficiente e eficaz para, quando necessário, realizar conversões de arquivos de vídeo, e mostrar um exemplo de como fazê-lo integrado ao nosso código em .NET.

O Segredo está no uso da biblioteca ffmpeg (http://ffmpeg.org/)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:

  1. 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).
  2. É multi-plataforma, segundo o fabricante, roda em ambiente Windows e Linux. (testei com sucesso no windows)
  3. Possui suporte a uma grande variedade de formatos de vídeos e áudio. (lista de formatos no final do artigo).
  4. 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.

1 – Baixe a última versão do ffmpeg no site http://ffmpeg.org/, na seção downloads.
2 – Descompacte o conteúdo em uma pasta de sua preferência.
3 – Abra o MS-DOS ou o console do linux, e navegue até a pasta onde descompactou o executável do ffmpeg.
4 – 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 –fmov novovideo2.mov
  • ffmpeg–i novovideo.flv –f mpeg video2.mpeg

Obs: Para arquivos que estão em unidades de disco ou pastas, diferentes do executável do ffmepg, 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 demais 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();
//  ------------------------------------------------ 

Este é um link para a documentação da mesma: http://msdn.microsoft.com/pt-br/library/system.diagnostics.process.aspx

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 a mensagem de retorno da operação.

Nele você verá como chamar a classe System.Diagnostic.Process e obter a mensagem de retorno fornecida pelo executável que estamos chamando.

converter video

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, dv, dvd, dxa, ea, ea_cdata, eac3, f32be, f32le, f64be,f64le, ffm, ffmetadata, film_cpk, filmstrip, flac, flic, flv, framecrc, framemd5, g722, gif, gsm, gxf, h261, h263, h264,idcin, image2, image2pipe, ingenient, ipmovie, ipod, iv8, ivf, lmlm4, lxf, m4v, matroska, matroska,webm, md5, mjpeg, mlp,mm, mmf, mov, mov,mp4,m4a,3gp,, mp2, mp3, mp4, mpc, mpc8, mpeg, mpeg1video, mpeg2video, mpegts, mpegtsraw, mpegvideo,mpjpeg, msnwctcp, mulaw, mvi, mxf, mxf_d10, mxg, nc, nsv, null, nut, nuv, ogg, oma, psp, psxstr, pva, qcp, r3d, rawvideo,rcv, rl2, rm, rpl, rso, rtp, rtsp, s16be, s16le, s24be, s24le, s32be, s32le, s8, sap, sdp, shn, siff, smk, sol, sox, spdif,srt, svcd, swf, thp, tiertexseq, tmv, truehd, tta, tty, txd, u16be, u16le, u24be, u24le, u32be, u32le, u8, vc1, vc1test,vcd, vfwcap, vmd, vob, voc, vqf, w64, wav, wc3movie, webm, wsaud, wsvqa, wtv, wv, xa, yop,yuv4mpegpipe

Obs: para ver a lista de formas suportados, obtendo diretamente do executável ffmpeg.exe, use o comando -formats

A biblioteca ffmpeg é muito utilizada por desenvolvedores em todo o mundo, por ser robusta e muito rápida. Vale muito a pena estudar sobre a mesma,conhecer suas opções de uso, e usá-la como um recurso de automação em sistemas.

Através da classeSystem.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 forffmpeg)
http://www.webologist.co.uk/blog/converting-mpg-to-flv-using-ffmpeg (Converting MPG to FLV UsingFFMPEG )
http://www.ehow.com/how_6796344_convert-flv-mpeg-ffmpeg.html (How to Convert FLV to MPEG WithFFMPEG)
http://www.softwarediscountvoucher.com/blog/2009/07/05/net-ffmpeg-gui/ (.NET ffmpegGUI)
http://msdn.microsoft.com/pt-br/library/system.diagnostics.process.aspx (Documentação da microsoft para a classesystem.diagnostics.process)