2011-10-20 92 views
1

我有我自己的RTSP源過濾器解決方案,目前仍在開發中,但與H.264/MPEG-4視頻流一起工作。我的問題是在初始階段。如果我打開graphedit並添加RTSP源,解碼器和視頻渲染器逐個過濾並連接它們的引腳,則一切正常(RTSP源URL此時爲硬編碼)。但是,如果我嘗試保存圖形並從保存的文件重新打開圖形,則圖形會崩潰。我認爲原因是在我的RTSP源過濾器的初始化部分。由於我的過濾器在開始時並不知道有關流的任何信息,因此會將無效參數傳遞給解碼器。所以,我的問題是:初始化RTSP源過濾器

  • 我應該如何精確地處理初始化過程?
  • 何時(代碼中哪些功能)應該準確連接到源並開始傳輸?過濾器類的構造函數?輸出引腳類的構造函數? OnThreadCreate
  • 我們是否需要從視頻流中獲取視頻寬度/高度等信息,或者我們是否需要將流傳遞給解碼器?這樣做的正確方法是什麼? (我認爲一些視頻渲染器使用來自VIDEOINFOHEADER結構的寬度/高度信息。)
  • 我們應該如何確定我們的緩衝區大小?在GetMediaType方法中,我從位圖信息頭中設置樣本大小,如下所示:

    pMediaType-> SetSampleSize(pvi-> bmiHeader.biSizeImage);

我應該怎樣設置的參數,如biWidthbiHeightbiSizebiSizeImage等?我相信我需要在開始時將它們設置爲一些默認值,然後在接收流後更改它們,但是如何進行更改?

所有問題都表示相同的問題。在我的RTSP源代碼過濾器的初始化過程中,我應該做些什麼?

!更新!

我剛剛注意到,當我加載保存的圖形時,斷開連接並重新連接解碼器和視頻渲染器之間的引腳可解決此問題。我用不同的視頻渲染器(Microsoft和其他一些自定義視頻渲染器)嘗試過。他們都反應相似。其中一些不會崩潰,但會以不正確的大小/寬高比運行視頻。顯然,造成圖形崩潰或導致奇怪結果的原因不是我的源過濾器,而是傳遞給視頻渲染器的一些無效信息。由於這種情況在其他RTSP源碼過濾器中沒有發生,我仍然認爲我做錯了什麼,還有一些缺失。

什麼可能導致此問題?圖表開始運行時,是否需要發送一些媒體信息?

P.S:圖形只在我運行圖形時崩潰。只需加載圖形不會導致崩潰。

回答

3

我Wimmel同意,我沒有認爲這是一個問題,如果從已保存的圖形被裝入的過濾器不支持。同樣如羅曼所言,有兩個問題,需要調試的崩潰以及實施問題。

在回答大家的一些問題:

  • 我應該如何處理完全相同的初始化過程?

    一種方法是實現IFileSourceFilter接口。此方法在加載過濾器後立即由GraphEdit,Windows Media Player調用,並允許您執行RTSP DESCRIBE以獲取您的媒體會話描述。對於需要運行流的媒體類型,您還可以播放流,提取媒體參數(如寬度和高度),然後正確設置您的圖形。 H264依靠SDP中序列和圖片參數集中的信息,其中通常爲。在GetMediaType之前,DS框架將調用IFileSourceFilter :: Load方法,這意味着您的解碼器應爲提供正確的參數。

  • 我們是否需要得到像視頻寬/從流的一些信息高度還是我們只需要通過流解碼器?這樣做的正確方法是什麼? (我認爲一些視頻渲染器使用來自VIDEOINFOHEADER結構的寬度/高度信息。) 我們應該如何決定我們的緩衝區大小?在GetMediaType方法中,我將位圖信息標題中的樣本大小設置爲...

    取決於解碼器:某些解碼器只需要您對媒體進行流式處理,然後正確地設置所有內容,其他可能需要寬度和高度,等正確配置。如果您使用上述方法,則無關緊要。

您可以在sourceforge下載我們的開源RTSP源代碼過濾器。 它不是一個商業級的RTSP源過濾器,可處理幾個(主要是音頻)媒體類型,但它顯示了可幫助您編寫自己的各個方面。 IIRC我開始添加H.264支持,並使用Live555 RTSP服務器的基本測試是好的,但我有一些問題,雖然時間戳的H.264流...

此外,我建議使用GraphStudio爲測試你的RTSP源代碼過濾器的目的:如果你實現了IFileSourceFilter接口,它允許你輸入URL。它與GraphEdit非常相似,但我個人更喜歡它。

+0

我沒有實現IFileSourceFilter,但所有其他RTSP源過濾器都使用它。所以,我認爲那是我尋找的缺失部分。我知道這不是必須的,但我相信它會解決我的問題。謝謝。 –

3

如果你有一個崩潰,你應該有一個異常(如訪問衝突)和調用堆棧問題的時間。這是您從中進行調試的地方。你可能最終發現,剩下的就是完全無關,它通過這樣的事業一樣簡單事,作爲一個未初始化的變量。

+0

但我沒有崩潰,當我添加我的源過濾器並添加它後連接引腳。如果它立即鏈接到解碼器,它會崩潰。我的其他問題對我來說依然很重要,即使它不會崩潰。 –

+0

如果你給它足夠的時間它不會崩潰,但這並不意味着它不應該崩潰,否則。這是你的過濾器,所以當你在RTSP端發現連接時,你發現選項和格式時,你不會這麼做。過濾器需要能夠枚舉媒體類型,因此當您在連接到設備過程中收到此類請求時,您的責任是在RTSP中同步並完成功能發現。 –

+0

請在我的第一篇文章中閱讀更新。 –

2

我認爲這不是一個大問題,如果您的過濾器不完全支持從保存的圖形重新加載。但是不應該崩潰。

首先,我會建議尋找它崩潰的位置。如果難以使用調試器,只需使用OutputDebugString添加跟蹤語句,然後使用DebugView來查看崩潰前最後執行的內容。例如

HRESULT SetSampleSize(...) 
{ 
    OutputDebugString("SetSampleSize start\n"); 

    //your code 

    OutputDebugString("SetSampleSize exit\n"); 
} 

如果你看到SetSampleSize start的痕跡,但沒有退出,你知道它崩潰該函數內部。

如果因爲不知道所有參數而無法處理函數,只需返回E_FAIL即可。我可以想象如果你不知道你接收到哪一個流,你就無法連接這些引腳。如果您沒有連接引腳,則過濾器將在圖形中加載未連接。這比連接錯誤的格式要好。

+0

請在我的第一篇文章中閱讀更新。 –

+0

@EmirAkaydın我不喜歡猜測可能導致問題的原因。有太多可能出錯的事情。如果崩潰,請首先找到崩潰的位置。如果它不在您的代碼中,則搜索加載後和手動連接後圖形狀態之間的差異。即使是graphedit也會顯示一些關於引腳上媒體格式的信息。很容易看到是否有差異。 – wimh

相關問題