2008-08-26 34 views
14

Tôi có biểu đồ DirectShow để hiển thị phim MPEG2/4 từ luồng mạng. Khi tôi lắp ráp đồ thị bằng cách kết nối các chân theo cách thủ công, nó không hiển thị. Nhưng khi tôi gọi Render trên GraphBuilder nó làm cho tốt.Làm thế nào tôi có thể đảo ngược thiết kế đồ thị DirectShow?

Rõ ràng có một số bước thiết lập mà tôi không thực hiện trên một số bộ lọc trong biểu đồ mà GraphBuilder đang thực hiện.

Có cách nào để xem kết quả gỡ lỗi từ GraphBuilder khi nó lắp ráp một biểu đồ không?

Có cách nào để kết xuất biểu đồ hoạt động để xem cách nó được đặt cùng nhau không?

Bất kỳ ý tưởng nào khác để làm sáng tỏ bí ẩn sống trong hộp DirectShow?

Cảm ơn! -Z

Trả lời

13

Bạn có thể xem biểu đồ bạn đã tạo bằng GraphEdit, một công cụ từ SDK DirectShow. Trong GraphEdit, chọn File-> Kết nối Graph từ xa ...

Để tìm đồ thị của bạn trong danh sách, bạn phải đăng ký nó trong bảng đối tượng chạy:

void AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{ 
    IMoniker* pMoniker; 
    IRunningObjectTable* pROT; 
    GetRunningObjectTable(0, &pROT); 

    WCHAR wsz[256];  
    swprintf_s(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId()); 
    CreateItemMoniker(L"!", wsz, &pMoniker); 

    pROT->Register(0, pUnkGraph, pMoniker, pdwRegister); 

    // Clean up any COM stuff here ... 
} 

Sau khi phá hủy đồ thị của bạn , bạn nên xóa nó khỏi ROT bằng cách gọi IRunningObjectTable :: Revoke

0

Phiên bản cũ hơn của DirectX, tôi tin 9a, nhưng không phải 9b có "chế độ gỡ lỗi" cho dshow. Nó sẽ xuất nhật ký thông tin gỡ lỗi vào bảng điều khiển gỡ lỗi.

Vì vậy, tải xuống phiên bản cũ hơn, đặt phiên bản đó thành gỡ lỗi. sau đó mở debugview hoặc tải graphedt.exe trong studio trực quan để xem thông tin gỡ lỗi.

10

Roman Ryltsov đã tạo công cụ DirectShow Filter Graph Spy (http://alax.info/blog/777), một trình bao bọc COM trên giao diện FilterGraph, ghi nhật ký tất cả các cuộc gọi đến các phương thức FilterGraph.

Ngoài ra, nó sẽ thêm tất cả các biểu đồ đã tạo vào Bảng đối tượng đang chạy (ROT) mà bạn có thể trực quan hóa bằng các công cụ như GraphEdit hoặc GraphStudio. Rất hữu ích khi bạn cần xem biểu đồ Windows Media Player trông như thế nào.

4

IGraphBuilder :: SetLogFile (xem http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) sẽ cung cấp cho bạn nhiều thông tin chẩn đoán hữu ích về những gì xảy ra trong quá trình xây dựng biểu đồ. Vượt qua trong một tập tin xử lý (ví dụ như mở bởi CreateFile) và đúc nó vào một DWORD_PTR. Gọi lại với NULL để hoàn thành việc ghi nhật ký trước khi bạn đóng tập tin.

Mã trong bài đăng trên blog sau để bán phá giá một biểu đồ sẽ cung cấp cho bạn một số thông tin bổ sung để diễn giải các số trong tệp nhật ký.

http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

+0

Tuyệt vời! Tôi tìm hiểu một thông tin rất hữu ích mới về DirectShow :-) –

1

Bạn cần phải:

  1. ký bạn lọc đồ thị vào "Chạy Objects Bảng" - ROT - Sử dụng mã dưới đây
  2. Connect để đồ thị bộ lọc của bạn sử dụng GraphEdit (File-> Kết nối từ xa graph) hoặc thậm chí tốt hơn - với GraphEditPlus

Để đăng ký đồ thị bộ lọc của bạn như một đồ thị "khả năng kết nối", gọi đây là với đồ thị bộ lọc của bạn:

void AddToROT(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{ 
    IMoniker * pMoniker; 
    IRunningObjectTable *pROT; 
    WCHAR wsz[128]; 
    HRESULT hr; 

    if (FAILED(GetRunningObjectTable(0, &pROT))) 
     return; 

    wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId()); 

    hr = CreateItemMoniker(L"!", wsz, &pMoniker); 
    if (SUCCEEDED(hr)) 
    { 
     hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister); 
     pMoniker->Release(); 
    } 

    pROT->Release(); 
} 

Và gọi này trước khi bạn phát hành đồ thị:

void RemoveFromROT(DWORD pdwRegister) 
{ 
    IRunningObjectTable *pROT; 

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
    { 
     pROT->Revoke(pdwRegister); 
     pROT->Release(); 
    } 
} 

'

Các vấn đề liên quan