2016-02-15 26 views
5

Używam DirectShowLib-2005 - DxSnap przykład do wyświetlania i przechwytywania obrazu z kamery internetowej.
Wszystko działa dobrze z przykładem.
Ale kiedy próbuję połączyć to z moją aplikacją (próbowałem wywołać ten formularz z mojego głównego formularza), działa on po raz pierwszy. Po zamknięciu i otwarciu okna przechwytywania nie wyświetla się prawidłowo wideo.
Jednak przechwytywanie obrazu działa doskonale przez cały czas.Dxsnap nie wyświetlając film właściwie po raz pierwszy otwarty

public partial class frmMain : Form 
{ 
    public frmMain() 
    { 
     InitializeComponent(); 
    } 


    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    private static void Main() 
    { 
     Application.Run(new frmMain()); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frmdxSnap frmdxSnap = new frmdxSnap(); 
     frmdxSnap.ShowDialog(this); 
    } 
} 

Video Display Error

Nawet po ponownym uruchomieniu komputera, to nadal to samo.
Nie zmieniłem niczego w formularzu DxSnap.

Odpowiedz

3

Podczas gdy DxSnap to dobra próbka wprowadzająca, przecina ona kilka narożników, tworząc możliwe artefakty. Problemem jest to założenie, to w następnym wierszu:

m_stride = m_videoWidth * (videoInfoHeader.BmiHeader.BitCount/8);

Rzeczywista krok może być różna i jest to dobrze znany efekt sprzętu wideo sugerujących zwiększone postępy. Gdy kopiujesz obraz z bufora Sample Grabber, dokładniejsze byłoby ponowne obliczenie kroku jako BufferLen/m_videoHeight (zobacz poniższy fragment kodu, a także zapamiętaj tam zapewne - prawdopodobnie ignorujesz to lub uruchamiasz wersje Release). Byłoby jeszcze lepiej po prostu sprawdzić bieżący rodzaj mediów i uzyskać krok z tego miejsca.

Możliwe, że nie masz problemu z pierwszą instancją potoku wideo, ponieważ może on wykorzystywać nakładkę wideo i inną ścieżkę kodu. Możliwe, że nie masz problemu z dobrze dopasowanymi rozmiarami ramek (szerokości), takimi jak 640, 1024 itd.

/// <summary> buffer callback, COULD BE FROM FOREIGN THREAD. </summary> 
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
{ 
    // Note that we depend on only being called once per call to Click. Otherwise 
    // a second call can overwrite the previous image. 
    Debug.Assert(BufferLen == Math.Abs(m_stride) * m_videoHeight, "Incorrect buffer length"); 

    if (m_WantOne) 
    { 
     m_WantOne = false; 
     Debug.Assert(m_ipBuffer != IntPtr.Zero, "Unitialized buffer"); 

     // Save the buffer 
     CopyMemory(m_ipBuffer, pBuffer, BufferLen); 
     //////////////////////////////////////////// 
     // HOTFIX: Let's have the stride re-computed for the case it was changed dynamically or otherwise 
     m_stride = BufferLen/m_videoHeight; 
     //////////////////////////////////////////// 

     // Picture is ready. 
     m_PictureReady.Set(); 
    } 

    return 0; 
}