Domingo, 19 de Julho de 2009

DirectShow com C# prt.2

Introdução
O melhor jeito de aprender a utilizar uma nova tecnologia é lendo o codigo-fonte, eu como autodidata sempre preferi baixar um programa e começar a sua fonte e ir comparando as funções com a documentação. A proposta dessa parte do tutorial é montar um pequeno tocador de video passo a passo com base na DirectShow.


Criando o primeiro projeto
  • Crie um novo projeto do tipo Windows Forms Application, coloque nele o nome que quiser, pode ser DSPlayer.
  • Vá na Solution Explorer e clique o botão direito sobre Reference para Add Reference
  • Na aba Browser procure pelo aquivo DirectShowLib-2005.dll, que você baixou e recompilou para evitar incompatibilidade de versão.
  • Aperte F5 e teste a aplicação pra conferir se não ocorreu algum erro.

Montando a interface

  • Para nossa interface nois vamos precisar de:
1 Panel,
1 StatusStrip,
1 Menu Strip,
3 Button.
  • Troque a propriedade Text do Form para “DSPlayer” ou o que você preferir.
  • Troque a propriedade Name dos Buttons para: btnStop, btnPlay e btnPause; e a propriedade Text respectivamente para: “STOP”, “PLAY” e “PAUSE”.
  • No StatusStrip adicione um StatusLabel, mude a propriedade Name para “lblStatus” e a Text para “Status”.
  • Monte o MenuStrip1 da seguinte forma:
ARQUIVO
- ABRIR
- SAIR
AJUDA
- INFORMAÇÕES

Inicializando a biblioteca
Primeiro declare as variaveis que vão ser utilizadas pelo programa, uma dica é a utilização de regiões para separar cada parte do código-fonte, isso o torna mais legivel.

#region VARIAVEIS
//Variaveis publicas
IGraphBuilder graphBuilder = null;
IMediaControl mediaCtrl = null;
IMediaEventEx mediaEvt = null;
IVideoWindow videoWin = null;

//Variaveis privadas
const int WMGraphNotify = 1234567890;

#endregion

IGraphBuilder é o objeto usado para rendenizar e tocar aquivos de mídia
IMediaControl é usado para controlar a mídia. Play, Pause, Velocidade de reprodução, etc.
IMediaEvent é utilizado para o tratamento de mensagens relacionadas a reprodução da mídia.
IVideoWindow é utilizado para controlar a janela, a viewport onde o quadro da imagem será exibido caso necessario.


Esta parte do código-fonte destina-se à iniciar a API DirectShow e configurar a viewport onde os quadros de imagem serão exibidos


#region INIT

void Init()
{
InitInterfaces();
InitViewport();
}
/* # InitInterfaces()
* @ Inicia a interface com a biblioteca gráfica
*/
void InitInterfaces()
{
try
{
graphBuilder = (IGraphBuilder)new FilterGraph();
mediaCtrl = (IMediaControl)graphBuilder;
mediaEvt = (IMediaEventEx)graphBuilder;
}
catch (Exception)
{
MessageBox.Show("Couldn't start 'DirectShow' library");
}
}
/* # InitViewport()
* @ Configura a janela/painel onde o video sera exibido
*/
void InitViewport()
{
videoWin = graphBuilder as IVideoWindow;
videoWin.put_Owner(panel1.Handle);
videoWin.put_WindowStyle(WindowStyle.Child|WindowStyle.ClipSiblings|WindowStyle.ClipChildren);
Rectangle rc = panel1. ClientRectangle;
videoWin.SetWindowPosition(0, 0, rc.Right, rc.Bottom);
mediaEvt. SetNotifyWindow (this.Handle,WMGraphNotify, IntPtr.Zero);
}

#endregion

Carregando arquivos de mídia
Para carregar um arquivo chame a função Open(nome do arquivo), se você observar a função abaixo vai perceber que ela abre o arquivo, reconfigura a janela de exibição e manda executar. A função InitViewporte() é chamada aqui pela segunda vez porque se ela não for chamada antes do metodo Run() o vídeo vai ser exibido em uma janela pop-up.

#region FUNÇÕES
void Open(string fileName)
{
graphBuilder.RenderFile(fileName,null);
InitViewport();
mediaCtrl.Run();
}
#endregion

Terça-feira, 23 de Junho de 2009

DirectShow com C#

Introdução
Este artigo é o primeiro de uma serie que se propõe a ensinar os conceitos e algumas aplicações praticas da DirectShow, visto que a documentação em português é escassa ou inexistente


O que é DirectShow?
DirectShow (as vezes abreviado como DS ou DShow), tambem chamado de Quartz, é um framework multimidia e API produzido pela Microsoft para programadores de software para executar várias operações com aquivos de midia ou streams. Baseado no Framework Microsoft WindowsComponent Object Model (COM), DirectShow fornece uma interface comum para todas as midias, varias linguagens de programação, é extensivel, baseada em filtros ela pode desenhar ou tocar aquivos de midia sobe demanda do usuario ou do programador.

Quais os formatos suportados?
Sua arquitetura de formatos é baseada em filtros, vamos citar um exemplo para que você possa entender melhor.
“Digamos que por alguma praga qualquer o meu PC não tem suporte a arquivos de audio *.mp3, então eu vou no baixaki e instalo um codec para este formato e automaticamente a aplicação baseada na DirectShow passa a ter suporte a esse formato.”
A partir dessa observação percebemos que a biblioteca se incarrega de achar o decodificador de audio adequado instalado no PC e ‘filtrar’ o arquivo, retornando apenas os dados necessarios(frames de video e streams de audio).
A dica é que se instale o ‘XP_Codec_Pack’ para que seu sistema tenha suporte a maioria dos formatos de midias conhecidos.

Dependências
DIRECTSHOW.NET
http://www.codeproject.com/KB/.../directshownet.aspx
XP_CODEC_PACK
http://www.baixaki.com.br/.../XP-Codec-Pack.htm


Corrigindo incompatibilidade de versão com a .Net Framework 3.5
A DirectShow.Net foi desenvolvida em 2005 para o .Net Framework 2.0, porem quando tentamos utilizalo com o .Net Framework 3.5 ocorrem erros de tempo de execução. Para corrigir o bug, baixe o codigo-fonte e recompile alterando a versão de compatibilidade.
1)Baixe a DirectShow.Net (http://ufpr.dl.sourceforge.net/sourceforge/directshownet/DirectShowLibV2-0.zip)
2)O arquivo DirectShowLibV2-0.zip, cotem a DLL compativel com a .Net Framework 2.0 e o codigo fonte do framework. Como nóis utilizaremos a .Net Framework 3.5 é necessario corrigir alguns problemas de compatibilidade.
3)Crie uma pasta para este trabalho, no meu caso foi em “c:\DirectShow\”, e descompacte a pasta “src” nela.
4)Na pasta “src” abra o arquivo “DirectShowLib-2005.csproj”. Vai aparecer um assistente de atualização do projeto da versão do Microsoft Visual C# 2005 para o 2008.
5)Depois de concluida a conversão anterior, vá em Project > DirectShowLib-2005 Properties. Na aba “Aplication”, autere a propriedade “Target Framework” de “.Net Framework 2.0” para “.Net Framework 3.5”. Aperte Ctrl+S para salvar.
6)Aperte F5 para compilar o framework em modo ‘Debug’ ou F6 para modo ‘Build’. Os aquivos gerados estão na pasta “\src\bin\Debug\” e/ou “\src\bin\Release\”

Sábado, 20 de Junho de 2009

Reload

Bem vindos,
Este blog foi criado para divulgar e discutir alguns assuntos relacionados a infoamtica, principalmente no campo audiovisual, e tambem para eu poder fazer marketing pessoal.

Alguns assuntos de interece: C#, C++, GameDev, Segurança, etc.


Flws