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
