Expertenfrage!! Wieso geht das nicht?
-
Hi @all C++ Cracks,
ich schreibe grade ein Programm mit dem ich ein Videobild (z.B. Webcam oder TV-Karte) streamen möchte. Mein Problem ist allerdings, das ich es nicht hinbekomme den Stream zeitgleich in einem Vorschaufenster laufen zu lassen.
Soll heißen.
Die Streamvorschau (alleine) funktioniert.
Den Stream senden (alleine) funktioniert.
Erst Vorschau an, dann Stream senden: Stream senden funktioniert nicht.
Erst Senden, dann Vorschau an: Vorschauf funktioniert nicht.Die Skripte habe ich aus der Windows Encoder SDK.
Für die Vorschau habe ich jetzt mal anstatt der normalen Encoder-Komponente eine DirektX-Komponente genommen und lasse diese in einem Thread laufen.
Klappt aber auch nicht so wie ich es will.
Ich poste mal die beiden Funktionen.
Als erstes die Vorschau:hr = CoInitialize(NULL); pEncoder= NULL; if ( SUCCEEDED ( hr ) ) { hr = CoCreateInstance(CLSID_WMEncoder, NULL, CLSCTX_INPROC_SERVER, IID_IWMEncoder, (void**) &pEncoder); } if ( SUCCEEDED( hr ) ) { hr = pEncoder->Load(CComBSTR("stream.wme")); // Hier die *.wme laden. } // Initialize the encoding session. if ( SUCCEEDED( hr ) ) { hr = pEncoder->PrepareToEncode(VARIANT_TRUE); } if ( SUCCEEDED( hr ) ) { hr = pEncoder->Start(); } MsgSenden("Die Übertragung hat begonnen!",FALSE); Programmabbruch();Und hier die Vorschau (dies ist die Version aus der Encoder SDK)
hrVS = CoInitialize(NULL); if ( SUCCEEDED( hrVS ) ) { hrVS = CoCreateInstance(CLSID_WMEncoder, NULL, CLSCTX_INPROC_SERVER, IID_IWMEncoder, (void**) &pEncoderVS); } // Retrieve a pointer to an IWMEncSourceGroupCollection interface. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->get_SourceGroupCollection(&pSrcGrpCollVS); } // Add a source group to the collection. if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcGrpCollVS->Add(CComBSTR("SG_1"), &pSrcGrpVS); } // Add a video source and an audio source. if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcGrpVS->AddSource(WMENC_VIDEO, &pSrcVidVS); } // Specify the sources. if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcVidVS->SetInput(CComBSTR("Device://"+m_strVideo)); } // Specify the output. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->get_Broadcast(&pBrdCstVS); } if ( SUCCEEDED( hrVS ) ) { hrVS = pBrdCstVS->put_PortNumber(WMENC_PROTOCOL_HTTP, 8080); } // Select the 5th profile from the collection and set it into the source group. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->get_ProfileCollection(&pProCollVS); } if ( SUCCEEDED( hrVS ) ) { hrVS = pProCollVS->Item(4, &pProVS); } if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcGrpVS->put_Profile(CComVariant(pProVS)); } // Retrieve a pointer to a preview object. if ( SUCCEEDED( hrVS ) ) { hrVS = CoCreateInstance( CLSID_WMEncPreview, NULL, CLSCTX_INPROC_SERVER, IID_IWMEncDataView, (void**)&pPreviewVS); } // Retrieve the preview collection. if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcVidVS->get_PreviewCollection( &pPreviewCollVS ); } // Add the postiew object to the data view collection. If you set the // cookie to -1, the encoder engine automatically generates a unique cookie. long lCookie = -1; if ( SUCCEEDED( hrVS ) ) { hrVS = pPreviewCollVS->Add(pPreviewVS, &lCookie); } // Continue configuring the encoder engine. // Initialize the encoder engine. // Hier tritt der Fehler auf, der Vorschau und streamen gleichzeitig nich möglich macht. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->PrepareToEncode(VARIANT_TRUE); } // Zeichenbereich für Videovorschau CRect re; re.top = 20; re.bottom = re.top + 240 ; re.left = 550; re.right = re.left + 320; pVideo->Create(NULL,SS_ENHMETAFILE | WS_EX_TRANSPARENT,re,this,IDC_VIDEO); // Steuerelement für Videovorschau erzeugen // Handle von IDC_VIDEO übergeben. HWND hControl = pVideo->GetSafeHwnd(); pVideo->ShowWindow(TRUE); if ( SUCCEEDED( hrVS ) ) { hrVS = pPreviewVS->SetViewSetting((DWORD) lCookie, sizeof(hControl), (BYTE*)&hControl); } // Start encoding. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->Start(); } // Start viewing the stream in a pop-up window. if ( SUCCEEDED( hrVS ) ) { hrVS = pPreviewVS->Start(lCookie); } // Retrieve a pointer to an IWMEncDataView2 interface. if ( SUCCEEDED( hrVS ) ) { hrVS = pPreviewVS->QueryInterface(IID_IWMEncDataView2, (void**)&pPreview2VS); } // Set the view to available. if ( SUCCEEDED( hrVS ) ) { hrVS = pPreview2VS->put_ViewAvailable(lCookie, VARIANT_TRUE); } // Determine whether the view is available. VARIANT_BOOL bIsViewAvailable; if ( SUCCEEDED( hrVS ) ) { hrVS = pPreview2VS->get_ViewAvailable(lCookie, &bIsViewAvailable); } // Setzen der Bildwiederholrate if ( SUCCEEDED( hrVS ) ) { hrVS = pPreview2VS->put_FrameRateBalance(lCookie, VARIANT_TRUE); } // Prüfen ob die Bildwiederholrate stimmt VARIANT_BOOL bIsBalanced; if ( SUCCEEDED( hrVS ) ) { hrVS = pPreview2VS->get_FrameRateBalance(lCookie, &bIsBalanced); } // Prüfen ob Ansicht vorhanden ist VARIANT_BOOL bIsRunning; if ( SUCCEEDED( hrVS ) ) { hrVS = pPreview2VS->IsRunning(lCookie, &bIsRunning); }Wie Ihr seht habe ich sogar andere Variablen benutzt, wie beim Streamen
pEncoderVS statt pEncoder usw.
Aber wieso können die Funktionen nicht beide gleichzeitig laufen?
