Este artigo responde a muitas perguntas frequentes sobre o Microsoft DirectShow.
Quais sistemas operacionais o DirectShow dá suporte?
O DirectShow está disponível em todas as versões com suporte do Windows.
Quanto conhecimento COM preciso para programar com o DirectShow?
Para o desenvolvimento de aplicativos, você precisa entender os conceitos básicos de trabalhar com objetos COM: como instanciá-los, acessar as interfaces que eles expõem e gerenciar contagens de referência nessas interfaces. O desenvolvimento de filtro requer mais conhecimento com.
Quais formatos o DirectShow dá suporte?
Consulte Formatos com suporte no DirectShow.
Há uma HCL (Lista de Compatibilidade de Hardware) do DirectShow?
Não. O DirectShow usará os recursos de hardware do Microsoft DirectDraw e do Microsoft DirectSound se eles estiverem disponíveis. Quando nenhum hardware especial está disponível, o DirectShow usa o GDI para desenhar vídeo e as APIs multimídia waveOut * para reproduzir áudio.
Quais idiomas posso usar para escrever um aplicativo DirectShow?
O DirectShow foi projetado principalmente para desenvolvimento em C++. Um pequeno subconjunto da API do DirectShow é exposto por meio do Visual Basic 6.0; no entanto, esse recurso foi preterido.
O DirectShow será acessível por meio de código gerenciado?
A Microsoft não tem planos atuais de implementar uma API gerenciada do DirectShow.
Qual compilador preciso para o desenvolvimento do DirectShow?
Qualquer compilador capaz de gerar objetos COM (Component Object Model) deve funcionar depois que o ambiente do compilador tiver sido configurado corretamente.
Como o DirectShow se relaciona com o Microsoft DirectX?
Internamente, o DirectShow usa DirectSound e DirectDraw quando o hardware dá suporte a ele. Os filtros Renderizador de Vídeo e Mixer de Sobreposição usam as superfícies DirectDraw 3 e DirectDraw 5. O Renderizador de Mixagem de Vídeo 7 (somente Windows XP) usa superfícies DirectDraw 7. O Renderizador de Mixagem de Vídeo 9 e o Renderizador de Vídeo Avançado usam as APIs mais recentes do Microsoft Direct3D. Você não precisa usar as outras APIs do DirectX para escrever um aplicativo DirectShow, embora seja possível combiná-las.
Como o DirectShow se relaciona com o Microsoft ActiveMovie?
ActiveMovie era o nome original do DirectShow. O termo ActiveMovie não é mais usado.
O código-fonte do utilitário GraphEdit está disponível? O GraphEdit pode ser redistribuído?
Não, a origem não está disponível e Graphedt.exe não é redistribuível.
Os DMOs substituem filtros DirectShow?
Os DMOs (Objetos de Mídia Do Microsoft DirectX) podem ser usados em um aplicativo DirectShow. Para codificadores, decodificadores e efeitos, você é incentivado a escrever um DMO em vez de um filtro DirectShow. (Observação: se você quiser usar a Aceleração de Vídeo DirectX no decodificador, deverá implementá-la como um filtro.) Para outras finalidades, um filtro DirectShow pode ser mais apropriado. Para obter mais informações sobre DMOs, consulte DirectX Media Objects.
Estou reproduzindo um arquivo de formato AVI com Reprodutor Multimídia do Windows. Eu posso ouvir o áudio, mas não parece haver nenhum vídeo em vez disso, eu só vejo preto. Qual é o problema?
Provavelmente, o arquivo foi codificado com um codec que não está presente em seu sistema. Embora o formato de arquivo AVI seja comum, os arquivos AVI podem ser criados com muitos formatos de compactação diferentes (codecs). Se você tentar reproduzir um arquivo AVI que usa um codec sem suporte, poderá ouvir o componente de áudio, mas o vídeo será exibido como uma tela preta ou o conteúdo da tela permanecerá inalterado.
Observação
Reprodutor Multimídia do Windows geralmente tenta baixar e instalar um codec se ele não estiver presente em seu sistema.
Como fazer criar meu aplicativo? Quais bibliotecas e arquivos de cabeçalho preciso?
Consulte Configurando o ambiente de build.
O GraphEdit exibe muitos filtros que não estão documentados. O que são esses filtros?
GraphEdit enumera todos os filtros registrados em seu sistema em uma categoria de filtro. Isso pode incluir filtros instalados por aplicativos de terceiros ou instalados por outras tecnologias da Microsoft, como Windows Media ou NetMeeting. Além disso, alguns filtros do DirectShow atuam como wrappers para codecs ou dispositivos de hardware, com cada codec ou dispositivo aparecendo como um filtro distinto. O Microsoft H.263 Video Codec é usado pelo NetMeeting e não tem mais suporte no DirectShow. Para obter mais informações, consulte Enumerando dispositivos e filtros.
Estou tendo problemas para criar meu grafo personalizado programaticamente.
Primeiro, tente criar o grafo de filtro com o GraphEdit. Essa ferramenta permite simular muitas possibilidades rapidamente. GraphEdit é sempre um ótimo lugar para testar o grafo antes de tentar criá-lo com o código-fonte.
Para obter mais informações sobre a criação de grafo, consulte os seguintes artigos:
Como posso detectar se o DirectShow está instalado em um determinado computador?
Chame CoCreateInstance para criar uma instância do Gerenciador de Grafo de Filtro. Se essa chamada for bem-sucedida, o DirectShow será instalado no computador. O código a seguir mostra como fazer isso:
IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
Como fazer alterar as configurações de um filtro sem exibir a página de propriedades?
A maioria dos filtros expõe uma ou mais interfaces para definir propriedades no filtro. Consulte a página de referência do filtro em questão. (Consulte Filtros do DirectShow.)
Posso testar meu filtro com o GraphEdit?
Enquanto você estiver desenvolvendo um filtro, o GraphEdit pode ajudá-lo a visualizar as conexões entre filtros. Ele também pode fornecer um teste rápido da funcionalidade de um filtro. No entanto, ele não se destina a ser uma plataforma de teste robusta.
Em que anel de privilégios os filtros são executados?
Os filtros são executados no anel 3, embora alguns filtros controlem dispositivos de streaming que são executados no anel 0. Para obter mais informações, consulte Como os dispositivos de hardware participam do grafo de filtro.
Preciso usar um depurador de kernel?
Isso depende do seu projeto específico. Instalar as bibliotecas de runtime de depuração do DirectX significa que você está instalando drivers de depuração e outros componentes do modo kernel e que, se o aplicativo causar uma declaração de depuração em um desses componentes, seu computador será reinicializado automaticamente, a menos que você tenha um depurador de kernel anexado ao processo.
Quando eu executo meu aplicativo no depurador, ele falha.
Alguns decodificadores foram projetados para não funcionar enquanto o aplicativo está anexado ao depurador. Tente executar o aplicativo fora do depurador.
Como funciona a macro DEFINE\_GUID?
A macro DEFINE_GUID resolve o problema de declarar extern
referências a valores GUID em seu código-fonte. Por exemplo, suponha que seu projeto tenha três arquivos de origem, Src1.cpp, Src2.cpp e Src3.cpp, e todos os três arquivos usem um determinado valor GUID que você definiu. O valor guid deve ser definido exatamente uma vez em seu projeto, e os outros arquivos de origem devem declarar extern
referências a ele. Com a macro DEFINE_GUID , você pode usar o mesmo arquivo de cabeçalho para ambas as finalidades. No arquivo de cabeçalho, declare o GUID da seguinte maneira:
DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
(Quando este exemplo tiver zeros, coloque os valores de GUID reais.) Você pode usar o utilitário Guidgen.exe para criar um novo GUID e colá-lo no arquivo de cabeçalho no formato DEFINE_GUID . Inclua esse arquivo de cabeçalho em todos os arquivos de origem que fazem referência ao GUID. Em exatamente um dos arquivos de origem, inclua o arquivo de cabeçalho Initguid.h antes do arquivo de cabeçalho. Por exemplo:
// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"
// Src2.cpp
#include "MyGuids.h"
// Src3.cpp
#include "MyGuids.h"
Onde quer que o arquivo de cabeçalho Initguid.h não esteja incluído, a macro DEFINE_GUID cria uma extern
referência ao valor guid. Quando o arquivo de cabeçalho Initguid.h é incluído, ele redefine a macro DEFINE_GUID para que DEFINE_GUID crie uma declaração de definição do GUID.
Se você não incluir Initguid.h em nenhum dos arquivos de origem, receberá um erro de link "símbolo externo não resolvido". Se você incluir Initguid.h duas vezes para o mesmo GUID, receberá um erro de compilação "redefinição; inicialização múltipla." Para resolve esses erros, verifique se Initguid.h está incluído exatamente uma vez. Além disso, não inclua Initguid.h dentro de um arquivo de cabeçalho pré-compilado, pois, na verdade, o cabeçalho pré-compilado está incluído em todos os arquivos de origem.