Experten gesucht!
-
Verzweifel, Drehdurch!

Es ist wie verhext. Ich kriege es einfach nicht hin. Es handelt sich um ein ganz einfaches Skript von Windows Media Encoder, mit dem man eine Vorschau für einen Stream realisieren kann. Der Stream funktioniert auch einwandfrei.
Aber nachdem ich den Stream gestoppt habe und neu starten will, funktioniert es nicht mehr.
Übersehe ich irgendwo etwas???
Laßt Euch bitte nicht durch den Sourcecode abschrecken. Ist eigentlich ziemlich selbsterkärend!
Bitte helft mir!!!Die Variablen sind als Membervariablen deklariert.
HRESULT hrVS; IWMEncoder* pEncoderVS; IWMEncSourceGroupCollection* pSrcGrpCollVS; IWMEncSourceGroup* pSrcGrpVS; IWMEncSource* pSrcVidVS; IWMEncProfileCollection* pProCollVS; IWMEncProfile* pProVS; IWMEncDataView* pPreviewVS; IWMEncDataView2* pPreview2VS; IWMEncDataViewCollection* pPreviewCollVS; IWMEncBroadcast* pBrdCstVS;Dann starte ich die Vorschau
void CHautpDlg::OnVS() { // Initialize the COM library and retrieve a pointer // to an IWMEncoder interface. 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)); // zu Testzwecken geht auch (CComBSTR("Device://Default_Video_Device")); } // 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. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->PrepareToEncode(VARIANT_TRUE); } // Zeichenbereich für Videovorschau CRect re; re.top = 250; re.bottom = re.top + 140 ; re.left = 200; re.right = re.left + 320; // pVideo = Membervariable CWnd* 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(); 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); } m_lCookieTemp = lCookie; }Zum stoppen nutze ich
void CHauptDlg::OnVST() { // Stop the preview if ( SUCCEEDED( hrVS ) ) { hrVS = pPreviewVS->Stop(m_lCookieTemp); } // Stop the encoding process. if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->Stop(); } //Release pointers. if ( pPreviewVS != NULL) { pPreviewVS->Release(); pPreviewVS = NULL; } if ( pPreview2VS != NULL) { pPreview2VS->Release(); pPreview2VS = NULL; } if ( pPreviewCollVS ) { pPreviewCollVS->Release(); pPreviewCollVS = NULL; } if ( pSrcGrpCollVS ) { pSrcGrpCollVS->Release(); pSrcGrpCollVS = NULL; } if ( pSrcGrpVS ) { pSrcGrpVS->Release(); pSrcGrpVS = NULL; } if ( pSrcVidVS ) { pSrcVidVS->Release(); pSrcVidVS = NULL; } if ( pProCollVS ) { pProCollVS->Release(); pProCollVS = NULL; } if ( pProVS ) { pProVS->Release(); pProVS = NULL; } if ( pEncoderVS ) { pEncoderVS->Release(); pEncoderVS = NULL; } }Die Vorschau stoppt auch, aber ein erneuter start der Vorschau funktioniert nicht.
Warum nur???
-
Nur mal eine banale Frage:
Warum machst du in der Stop - Funktion ein Release all Deiner Poiner? Ebenso, wie du direct beim Start dein COM - Objekt initialisiert. Lager das doch eingach mal in einzelne Funktionen aus, so das dein Start - Stop Funktionen auch wirklich nur Start - Stop machen.
-
Noch Banaler:
Wie wäre es mit aussagefähigen Thread Titeln...Devil
-
Ich habe die Scripts fast genauso aus der Windows Media Encoder SDK übernommen. Dort steht es so drin. Und beim Start wird über eine Combobox ausgewählt, was in der Vorschau gezeigt werden soll. Ist ziemlich am Anfang
// Specify the sources. if ( SUCCEEDED( hrVS ) ) { hrVS = pSrcVidVS->SetInput(CComBSTR("Device://"+m_strVideo)); }Wenn sich der Inhalt von m_strVideo ändert (z.b. von Webcam auf Videokarte),
dann hat das doch Auswirkungen auf alle nachfolgenden Funktionen, oder seh ich das falsch?
Bei Stop habe ich auch schon versucht, nur Stop zu machen (ohne Release der Pointer). Klappt leider auch nicht.
-
Hab jetzt mal versucht beim Start die COM zu initalisieren und beim Start
die Vorschauquelle zu übergeben (mit pEncoder->Start() und pPreview->Start())
klappt aber leider nicht.
-
Richtig, den String mußt du jedesmal neu setzen, aber tut dat Not, das du jedesmal wieder neu initialisierst? Ich vermute dabei geht irgenetwas schief.
Werte doch einfach mal die einzelnen SUCCEEDED ein bisschen aus und hangel dich langsam durch.
Da hilft eben nur step by step debuggen. wenn du die Stelle hast, an der es dann Fehlschlägt kann Dir eventuell auch jemand weiterhelfen.
-
Beim zweiten Durchlauf schlägt es fehl bei
if ( SUCCEEDED( hrVS ) ) { hrVS = pEncoderVS->PrepareToEncode(VARIANT_TRUE); }hrVS bekommt einen Negativwert zurück.
-
So, und nun schaust du einfach nach, was denn dieser Rückgabewert bedeutet:
Aus der MSDN:
At the source code level, all error values consist of three parts, separated by underscores. The first part is the prefix that identifies the facility associated with the error, the second part is E for error, and the third part is a string that describes the actual condition. For example, STG_E_MEDIUMFULL is returned when there is no space left on a hard disk. The STG prefix indicates the storage facility, the E indicates that the status code represents an error, and the MEDIUMFULL provides specific information about the error. Many of the values that you might want to return from an interface method or function are defined in winerror.h.
Also einfach mal in der Winerror.h nachschauen, was der Fehler denn bedeutet.
-
Leider muß ich jetzt weg, werde mich aber direkt morgen früh drum kümmern. Ich dank dir erstmal

-
Irgendwie finde ich den Fehler nicht. Ich bin mit dem Debugger durchgegangen, aber er springt nicht in die Winerror.h rein.
Wenn die Funktion PrepaireToEncode beim zweiten mal aufruft, bekomme ich
-1072889816 zurück. Ich hab keine Ahnung wie ich rauskriegen kann, welcher Fehler das ist.
Muß ich mir den Rückgabewert irgendwie anders zurückgeben lassen?
Im Augenblick ist es ja ein HRESULT.
-
Schau Dir mal die Definition von HRESULT an -> richtig, ist einfach nur ein long.
, aber er springt nicht in die Winerror.h rein
Tut er auch nicht.
Die Winerror.h findest du auf deinem Rechner irgendwo in deinem VisualStudio - Verzeichnis. Die öffnest du einfach und schaust mal nach, mit welchem #define Dein Errorcode definiert ist. Ich sehe gerade, da steht auch richtig schön daneben, was der Fehler denn bedeutet.
Wenn du es gar nicht peilst, danns schick mir Dein kleines Beispiel mal an meine mail - Adresse (siehe Profil), aber ich glaube du lernst mehr, wenn du Dich selber durchbeißt.
-
@ TheBigW
Schicke mir bitte eine mail an
sunday_2@gmx.net
damit ich deine mail-adresse bekomme. Im Profil kann ich dir zwar eine schicken, aber ohne Anhang
-
Ganz einfach:
Rechtsklick in deiner Debuggeranzeige -> Hexdarstellung. Dann gehste in die Fehlerdatei des WMSDKs und suchst dort nach dem Fehler. Die WinError.h ist nicht die richtige Datei.der rest war quark

-
Danke, das mit der Hexdarstellung war mir neu. Ist aber sehr hilfreich

Ich habe jetzt also den Hexwert 0xc00d0028 kann diesen aber in keiner Datei der WMSDK finden.
Da ich nicht weiß wie die Fehlerdatei der WMSDK heißt habe ich eben alle durchsucht, aber nichts gefunden.
Ich glaub ich brauch nen festeren Schubs in die richtige Richtung.
-
http://www.xasa.com/grupos/en/microsoft/w/article/10858/microsoft.public.windowsmedia.encoder
Glaube nicht, dass du noch nen Schubs benötigst ... Der scheint irgendwie net definiert zu sein ....
-
Aber den Link sagt doch nur, das noch jemand das Problem hat. Sein posting ist ja gerande zwei Wochen her.

Oder mach ich mir da was vor und es gibt wirklich keine Lösung?
-
Ich versteh das so, dass niemand ne ahnung hat, was das für ein komischer fehler sein soll.
-
Na dann muß ich wohl doch mit dem Holzhammer draufhauen.
Soll heißen, wenn die Vorschau gestoppt wurde:
Programm beenden und neu starten.
Zumindest für´s erste. Ich gib ja nicht auf
Trotzdem danke!!

-
<nserror.h>
// // MessageId: NS_E_NETWORK_RESOURCE_FAILURE // // MessageText: // // An attempt to acquire a network resource failed.%0 // #define NS_E_NETWORK_RESOURCE_FAILURE _HRESULT_TYPEDEF_(0xC00D0028L)
-
Hi King,
da hab ich auch gleich zwei drei Fragen.
1. Ich hab die Datei nserror.h nicht auf meinen Rechner. Wieso bekomme ich die Fehlermeldung.
2. Wie bist Du so schnell daran gekommen?
3. Was kann ich dagegen tun wenn der Netzwerkzugriff fehlschlägt?