Direct Show

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Direct Show

Beitrag von Thorium »

Natürlich hat DirectShow Funktionen. Die ruft man über Interfaces auf, genau wie bei DirectX. Lies dich doch einfach mal bei der MSDN ein. Eine einfache Funktionsliste nützt dir nix, wenn du wissen willst wies funktioniert. Den Link hast du ja selbst gepostet.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Direct Show

Beitrag von Joel »

Welche Filter benötige ich für das Wiedergeben eines Video Streams?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Direct Show

Beitrag von Joel »

Hab jetzt hier mal einen Directshow Code, jetzt muss das nur noch für das Video Streaming Optimiert werden bzw ich müsste wissen, welche Filter ich dazu ändern muss!

Code: Alles auswählen

; DshowMedia.pbi v1.1 for Purebasic v4, 2006 by Inc.

; EnableExplicit

#MaxWcharBuffer = 1024 ; In bytes!, Needed for media-filename and renderer-names

#S_OK  = 0
#OATRUE = -1
#OAFALSE = 0
 
#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10

#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER

#MAX_FILTER_NAME = 128

#WM_GRAPHEVENT = #WM_USER+1

#EC_COMPLETE  = 1

#VMRMode_Windowed   = $1
#VMRMode_Windowless = $2
#VMRMode_Renderless = $4 

Enumeration ; Supported Dshow renderers
  #Default ; Default system renderers in case of audio and video         
  
  #VMR9_Windowed      
  #VMR9_Windowless 
  #VMR7_Windowed
  #VMR7_Windowless
  #OldVideoRenderer     
  #OverlayMixer  

  #WaveOutRenderer    
EndEnumeration

Enumeration ; MediaState
  #State_Stopped
  #State_Paused
  #State_Running
EndEnumeration

Enumeration ; MediaSeeking
  #AM_SEEKING_NoPositioning        
  #AM_SEEKING_AbsolutePositioning
EndEnumeration

Structure Dshow_Interfaces
  pGraphBuilder.IGraphBuilder
  pControl.IMediaControl
  pEvent.IMediaEventEx
  pWindow.IVideoWindow
  pAudio.IBasicAudio
  pVideo.IBasicVideo2
  pSeeking.IMediaSeeking
EndStructure

CompilerIf Defined(FILTER_INFO, #PB_Structure) = #False
  Structure FILTER_INFO ; an official Dshow structure - actually missing in PB
    achName.w[#MAX_FILTER_NAME]
    *pGraph.IFilterGraph 
  EndStructure
CompilerEndIf

CompilerIf Defined(IEnumFilters, #PB_Interface) = #False
  Interface IEnumFilters
    QueryInterface(a, b)
    AddRef()
    Release()
    Next(a, b, c)
    Skip(a)
    Reset()
    Clone(a)
 EndInterface
CompilerEndIf

Macro FAILED(Status)
  Status < 0
EndMacro

Macro SUCCEEDED(Status)
  Status >= 0
EndMacro

Procedure.l L(*pWideChar, string.s) ; Ansi->Unicode
  PokeS(*pWideChar, string, Len(string), #PB_Unicode)
  ProcedureReturn *pWideChar 
EndProcedure 

Macro DEFINE_GUID(Name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  Global Name.GUID
  Name\Data1 = l
  Name\Data2 = w1
  Name\Data3 = w2
  Name\Data4[0] = b1
  Name\Data4[1] = b2
  Name\Data4[2] = b3
  Name\Data4[3] = b4
  Name\Data4[4] = b5
  Name\Data4[5] = b6
  Name\Data4[6] = b7
  Name\Data4[7] = b8
EndMacro

DEFINE_GUID(CLSID_FilterGraph,          $E436EBB3, $524F, $11CE, $9F, $53, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IGraphBuilder,          $56A868A9, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaControl,          $56A868B1, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaEventEx,          $56A868C0, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IVideoWindow,           $56A868B4, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicAudio,            $56A868B3, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicVideo,            $56A868B5, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IBaseFilter,            $56A86895, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(CLSID_VideoMixingRenderer9, $51B4ABF3, $748F, $4E3B, $A2, $76, $C8, $28, $33, $0E, $92, $6A)
DEFINE_GUID(IID_IVMRFilterConfig9,      $5A804648, $4F66, $4867, $9C, $43, $4F, $5C, $82, $2C, $F1, $B8)
DEFINE_GUID(IID_IVMRWindowlessControl9, $8F537D09, $F85E, $4414, $B2, $3B, $50, $2E, $54, $C7, $99, $27)
DEFINE_GUID(CLSID_VideoMixingRenderer,  $B87BEB7B, $8D29, $423F, $AE, $4D, $65, $82, $C1, $01, $75, $AC)
DEFINE_GUID(IID_IVMRFilterConfig,       $9E5530C5, $7034, $48B4, $BB, $46, $0B, $8A, $6E, $FC, $8E, $36)
DEFINE_GUID(IID_IVMRWindowlessControl,  $0EB1088C, $4DCD, $46F0, $87, $8F, $39, $DA, $E8, $6A, $51, $B7)
DEFINE_GUID(CLSID_OverlayMixer,         $CD8743A1, $3736, $11D0, $9E, $69, $00, $C0, $4F, $D7, $C1, $5B)
DEFINE_GUID(CLSID_VideoRenderer,        $70E102B0, $5556, $11CE, $97, $C0, $00, $AA, $00, $55, $59, $5A)
DEFINE_GUID(CLSID_AudioRender,          $E30629D1, $27E5, $11CE, $87, $5D, $00, $60, $8C, $B7, $80, $66)
DEFINE_GUID(TIME_FORMAT_MEDIA_TIME,     $7B785574, $8C82, $11CF, $BC, $0C, $00, $AA, $00, $AC, $74, $F6)

Procedure InitMedia()
  Protected a, b, c, d, e, f, *p.Dshow_Interfaces
  *p = AllocateMemory(SizeOf(Dshow_Interfaces))
  If *p
    CoInitialize_(0)
    If Not CoCreateInstance_(@CLSID_FilterGraph, #Null, #CLSCTX_INPROC_SERVER, @IID_IGraphBuilder, @*p\pGraphBuilder) = #S_OK 
      Debug "Error: Couldn't initialize the GraphBuilder Interface"
      ProcedureReturn #False
    Else
      a = *p\pGraphBuilder\QueryInterface(@IID_IMediaControl, @*p\pControl)
      b = *p\pGraphBuilder\QueryInterface(@IID_IMediaEventEx, @*p\pEvent)
      c = *p\pGraphBuilder\QueryInterface(@IID_IVideoWindow,  @*p\pWindow)
      d = *p\pGraphBuilder\QueryInterface(@IID_IBasicAudio,   @*p\pAudio)
      e = *p\pGraphBuilder\QueryInterface(@IID_IBasicVideo,   @*p\pVideo)
      f = *p\pGraphBuilder\QueryInterface(@IID_IMediaSeeking, @*p\pSeeking)
      If SUCCEEDED(a) And SUCCEEDED(b) And SUCCEEDED(c) And SUCCEEDED(d) And SUCCEEDED(e) And SUCCEEDED(f) ; Quick check
        ProcedureReturn *p
      Else
        Debug "Error: Query of at least one of the needed Interfaces failed"
        ProcedureReturn #False
      EndIf
    EndIf 
  Else
    Debug "Error: Memory allocation while initializing media failed"
  EndIf 
EndProcedure

Procedure LoadMedia(*p.Dshow_Interfaces, filename.s, Parent=0, VidRenderer=0, AudRenderer=0)
  Protected pVmr.IBaseFilter, pVidRend.IBaseFilter, pAudR.IBaseFilter, pFilter.IBaseFilter 
  Protected pEnum.IEnumFilters, pVMRCnfg.IVMRFilterConfig, pWc.IVMRWindowlessControl
  Protected VMR.b, pIndividualRenderer, RendName.s, pFltrCnfg, pWndCntrl, vw, vh, cFetched
  Protected FilterInfo.FILTER_INFO, *pWc = AllocateMemory(#MaxWcharBuffer)
  If *p
    If VidRenderer 
      If VidRenderer = #VMR9_Windowed Or VidRenderer = #VMR9_Windowless
        pIndividualRenderer = @CLSID_VideoMixingRenderer9 : RendName = "Video Mixing Renderer 9"
      ElseIf VidRenderer = #VMR7_Windowed Or VidRenderer = #VMR7_Windowless 
        pIndividualRenderer = @CLSID_VideoMixingRenderer  : RendName = "Video Mixing Renderer"
      ElseIf VidRenderer = #OverlayMixer
        pIndividualRenderer = @CLSID_OverlayMixer         : RendName = "Overlay Mixer"
      ElseIf VidRenderer = #OldVideoRenderer
        pIndividualRenderer = @CLSID_VideoRenderer        : RendName = "Old Video Renderer"
      EndIf
      
      If CoCreateInstance_(pIndividualRenderer, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pVidRend) = #S_OK
        If *p\pGraphBuilder\AddFilter(pVidRend, L(*pWc, RendName)) = #S_OK
          
          VMR = #False
          If VidRenderer = #VMR9_Windowed Or VidRenderer = #VMR9_Windowless
            pFltrCnfg = @IID_IVMRFilterConfig9
            pWndCntrl = @IID_IVMRWindowlessControl9
            VMR = #True
          ElseIf VidRenderer = #VMR7_Windowed Or VidRenderer = #VMR7_Windowless
            pFltrCnfg = @IID_IVMRFilterConfig
            pWndCntrl = @IID_IVMRWindowlessControl
            VMR = #True
          EndIf 
          If VMR
            If pVidRend\QueryInterface(pFltrCnfg, @pVMRCnfg) = #S_OK
              pVMRCnfg\SetRenderingPrefs(1)
              If VidRenderer = #VMR9_Windowed Or VidRenderer = #VMR7_Windowed
                pVMRCnfg\SetRenderingMode(#VMRMode_Windowed)
              ElseIf VidRenderer = #VMR9_Windowless Or VidRenderer = #VMR7_Windowless
                pVMRCnfg\SetRenderingMode(#VMRMode_Windowless)
                If pVidRend\QueryInterface(@pWndCntrl, @pWc) = #S_OK And Parent
                  pWc\SetVideoClippingWindow(Parent)
                  pWc\Release()
                EndIf
              EndIf 
              pVMRCnfg\Release()
            Else
              Debug "Error: Getting Interface for VMR Config failed"
            EndIf
          EndIf 
        Else
          Debug "Error: Adding Individual video render filter failed"  
        EndIf 
      Else
        Debug "Error: Couldn't Create Instance of individual video renderer"
      EndIf 
    EndIf
    
    If AudRenderer = #WaveOutRenderer
      RendName = "AudioWaveOut Renderer"
      If CoCreateInstance_(@CLSID_AudioRender, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pAudR) = #S_OK
        If *p\pGraphBuilder\AddFilter(pAudR, L(*pWc, RendName)) = #S_OK
        Else
          Debug "Error: Adding Individual audio render filter failed"
        EndIf
      Else
        Debug "Error: Couldn't Create Instance of individual audio renderer"
      EndIf
    EndIf 
    
    If *p\pGraphBuilder\RenderFile(L(*pWc, filename), #Null) = #S_OK
      If Parent
        *p\pVideo\get_SourceWidth(@vw) : *p\pWindow\put_width(vw) 
        *p\pVideo\get_SourceHeight(@vh) : *p\pWindow\put_Height(vh) 
        *p\pWindow\put_Left(0)
        *p\pWindow\put_Top(0)
        *p\pWindow\put_Owner(Parent)
        *p\pWindow\put_WindowStyle(#WS_CHILD| #WS_CLIPSIBLINGS)
        *p\pWindow\put_Visible(#OATRUE)
      EndIf
      If *p\pEvent\SetNotifyWindow(GetForegroundWindow_(), #WM_GRAPHEVENT, *p) = #S_OK 
        If *p\pEvent\SetNotifyFlags(0) <> #S_OK
        EndIf
      Else
        Debug "Info: Media notification callback has not been applied"
      EndIf 
      If *p\pGraphBuilder\EnumFilters(@pEnum) = #S_OK
        Debug " "
        Debug "--------- Filtergraph ---------"
        While pEnum\Next(1, @pFilter, @cFetched) = #S_OK 
          pFilter\QueryFilterInfo(@FilterInfo)
          Debug PeekS(@FilterInfo\achName, #MAX_FILTER_NAME, #PB_Unicode) 
          If FilterInfo\pGraph <> #Null
            FilterInfo\pGraph\Release()
          EndIf 
          pFilter\Release();
        Wend
        Debug "--------------------------------------"
        Debug " "
      Else
        Debug "Error: Could not enumerate filters"
      EndIf 
      *p\pSeeking\SetTimeFormat(@TIME_FORMAT_MEDIA_TIME) 
      ProcedureReturn #True
    Else
      Debug "Error: Rendering file failed"
      ProcedureReturn #False
    EndIf 
    
    FreeMemory(*pWc)
    
  Else 
    Debug "Fatal Error: The given handle of the media object hasn't been initialized!"
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure PlayMedia(*p.Dshow_Interfaces)
  If *p
    ProcedureReturn *p\pControl\run()
  EndIf
EndProcedure

Procedure PauseMedia(*p.Dshow_Interfaces)
  If *p
    ProcedureReturn *p\pControl\pause()
  EndIf
EndProcedure

Procedure MediaSeek(*p.Dshow_Interfaces, pos.q)
  Protected duration.q
  If *p : pos * 10000
    *p\pSeeking\GetDuration(@duration) 
    ProcedureReturn *p\pSeeking\SetPositions(@pos, #AM_SEEKING_AbsolutePositioning,@duration, #AM_SEEKING_NoPositioning)
  EndIf
EndProcedure

Procedure MediaStop(*p.Dshow_Interfaces)
  If *p
    ProcedureReturn *p\pControl\stop()
  EndIf
EndProcedure

Procedure MediaLenght(*p.Dshow_Interfaces)
  Protected duration.q
  If *p
    *p\pSeeking\GetDuration(@duration)
    ProcedureReturn duration/10000 ; result in ms
  EndIf
EndProcedure

Procedure MediaWidth(*p.Dshow_Interfaces)
  Protected vw.l
  If *p
    *p\pVideo\get_SourceWidth(@vw)
    ProcedureReturn vw
  EndIf 
EndProcedure

Procedure MediaHeight(*p.Dshow_Interfaces)
  Protected vh.l
  If *p : *p\pVideo\get_SourceHeight(@vh)
    ProcedureReturn vh
  EndIf
EndProcedure

Procedure MediaPosition(*p.Dshow_Interfaces)
  Protected pos.q
  If *p : *p\pSeeking\GetCurrentPosition(@pos)
    ProcedureReturn pos/10000 ; result in ms
  EndIf
EndProcedure

Procedure MediaState(*p.Dshow_Interfaces)
  Protected pfs.l
  If *p
    *p\pControl\GetState(10,@pfs)
    ProcedureReturn pfs
  EndIf
EndProcedure

Procedure FreeMedia(*p.Dshow_Interfaces)
  Protected pfs.l
  If *p
    *p\pControl\GetState(10,@pfs)
    If Not pfs = #State_Stopped
      *p\pControl\stop()
    EndIf
    *p\pSeeking\Release()
    *p\pVideo\Release()
    *p\pAudio\Release()
    *p\pWindow\Release()
    *p\pEvent\Release()
    *p\pControl\Release()
    *p\pGraphBuilder\Release()
    FreeMemory(*p)
    CoUninitialize_()
    ProcedureReturn #True
  EndIf 
EndProcedure

Procedure.f MediaFPS(*p.Dshow_Interfaces) ; return .f cause we just need float precision
  Protected avgTimePerFrame.d
  If *p
    *p\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
    If avgTimePerFrame > 0
      ProcedureReturn 1/avgTimePerFrame 
    Else
      ProcedureReturn #False
    EndIf 
  EndIf
EndProcedure

Procedure CaptureCurrMediaImage(*p.Dshow_Interfaces, ResultingImgNo.l)
  Protected DataSize.l, *pImg.BITMAPINFOHEADER, res.b
  If *p : res = #False
    If IsImage(ResultingImgNo) = 0
      If *p\pVideo\GetCurrentImage(@DataSize, #Null) = #S_OK
        *pImg = AllocateMemory(DataSize)
        If *pImg
          If *p\pVideo\GetCurrentImage(@DataSize, *pImg) = #S_OK
            If CreateImage(ResultingImgNo, *pImg\biWidth, *pImg\biHeight, *pImg\biBitCount)
              If SetDIBits_(0, ImageID(ResultingImgNo), 0, *pImg\biHeight, *pImg+*pImg\biSize, *pImg, #DIB_RGB_COLORS)
                res = #True
              EndIf
            EndIf 
          Else
            Debug "Info: Capturing current image not possible"
          EndIf 
          FreeMemory(*pImg)
        Else
          Debug "Error: Allocating ImgBuffer memory failed"
        EndIf
      Else
        Debug "Error: Couldn't measure needed imagebuffer - or actual media contains no videostream"
      EndIf
    Else
      Debug "Error: ImageNumer already valid"
    EndIf
    If res : ProcedureReturn #True : EndIf
  EndIf 
EndProcedure

Procedure OnMediaEvent(*p.Dshow_Interfaces)
  Protected EventCode.l, Param1.l, Param2.l
  If *p
    While *p\pEvent\GetEvent(@EventCode, @Param1, @Param2, 0) <> #E_ABORT
      Select EventCode
        Case #EC_COMPLETE
          *p\pControl\stop() ; If an #EC_COMPLETE notify occurs we do change the media state to stopped
          Debug "... end has been reached."
      EndSelect
      *p\pEvent\FreeEventParams(EventCode, Param1, Param2)
    Wend
  EndIf 
EndProcedure

Procedure.s MediaTime2String(time.l)
  Protected ti.s, SS, MM, HH, ms
  ms = time%1000
  SS = Int(time / 1000) : While SS > 59:SS-60:Wend 
  MM = Int(time / 1000 / 60) : While MM > 59:MM-60:Wend 
  HH = Int(time / 1000 / 60 / 60) : While HH > 59:HH-60:Wend
  ti.s =RSet(StrU(HH,2),2,"0")+":"+RSet(StrU(MM,2),2,"0")+":"+RSet(StrU(SS,2),2,"0")+":"+RSet(StrU(ms,2),3,"0")
  ProcedureReturn ti.s
EndProcedure

Procedure MediaGetVolume(*p.Dshow_Interfaces) ; from -100db to 0db
  Protected db.l
  If *p
    *p\pAudio\get_Volume(@db)
    ProcedureReturn db/100
  EndIf 
EndProcedure

Procedure MediaPutVolume(*p.Dshow_Interfaces, db.l) ; from -100db to 0db
  If *p
    If db > -85 And db < 1 ; dont change -85 to -101 as it will mess up WaveOut. A bug in the API ?
      Delay(10) : *p\pAudio\put_Volume(db*100)
    EndIf 
  EndIf 
EndProcedure

Procedure MediaPutBalance(*p.Dshow_Interfaces, bal.l) ; -100 to +100
  If *p
    *p\pAudio\put_balance(bal*100)
  EndIf
EndProcedure

Procedure MediaGetBalance(*p.Dshow_Interfaces) ; from -100 to +100
  Protected bal
  If *p
    *p\pAudio\get_balance(@bal)
    ProcedureReturn Int(bal/100)
  EndIf 
EndProcedure

; DisableExplicit



; Mini example v1.1 for DshowMedia.pbi for Purebasic v4, 2006 by Inc.

CompilerIf #PB_Compiler_Debugger = #False
  MessageRequester("Info","Please run this example using the debugger and see its output while choosing a media file")
  End
CompilerEndIf

hwnd = OpenWindow(0,20,20,352,288,"PB native Dshow example", #PB_Window_ScreenCentered|#PB_Window_SystemMenu )   

hMedia = InitMedia()

If hMedia
  File.s = OpenFileRequester("Choose media file","","All Files (*.*)|*.*",0)
  If File
    If LoadMedia(hMedia, File, hwnd, #VMR7_Windowed, #WaveOutRenderer)
      mWidth = MediaWidth(hMedia) : mHeight = MediaHeight(hMedia)
      If mWidth = 0 : mWidth = #PB_Ignore :EndIf
      If mHeight = 0 : mHeight = #PB_Ignore :EndIf
      ResizeWindow(0, #PB_Ignore, #PB_Ignore, mWidth, mHeight)
      PlayMedia(hMedia)
      Debug "lenght = "+MediaTime2String(MediaLenght(hMedia))+" (hh:mm:ss:ms)"
      fps.f = MediaFPS(hMedia)
      If fps ; Does media contain Videodata?
        Debug "FPS    = "+StrF(fps,3)
        Debug "Width  = "+Str(MediaWidth(hMedia))
        Debug "Height = "+Str(MediaHeight(hMedia))
      EndIf 
      Debug "playing ..."
      Debug " "
      Debug "esc = exit"
      Debug "c = capture current image to C:/"
      Debug "left/right keys = step forward/backward in 5% steps"
      Debug "up/down keys = alter volume in 2db steps"
      Debug " "
      
      Repeat
        Delay(5)
        ;Debug MediaTime2String(MediaPosition(hMedia)) ;- #### Uncomment this for watching continous counter ###
        ev = WindowEvent()
        If ev = #WM_KEYDOWN
          wParam = EventwParam()
          If wParam = #VK_ESCAPE
            MediaPutVolume(hMedia,0)
            FreeMedia(hMedia)
            End
          ElseIf wParam = #VK_C
            If CaptureCurrMediaImage(hMedia, 99)
              SaveImage(99, "G:/MyImage"+Str(im)+".bmp",#PB_ImagePlugin_BMP)
              FreeImage(99)
              im+1
              Debug "Image "+Str(im)+" safed to C:/"
            EndIf 
          ElseIf wParam = #VK_LEFT
            MediaSeek(hMedia, MediaPosition(hMedia)-Int(MediaLenght(hMedia)/20)) ; 5% steps
          ElseIf wParam = #VK_RIGHT
            MediaSeek(hMedia, MediaPosition(hMedia)+Int(MediaLenght(hMedia)/20)) ; 5% steps 
          ElseIf wParam =#VK_UP
            MediaPutVolume(hMedia, MediaGetVolume(hMedia)+2)
          ElseIf wParam = #VK_DOWN
            MediaPutVolume(hMedia ,MediaGetVolume(hMedia)-2)
          EndIf
        ElseIf ev = #WM_GRAPHEVENT 
          OnMediaEvent(EventlParam())
        EndIf
      Until ev = #PB_Event_CloseWindow  

      MediaPutVolume(hMedia,0) ; '0' means 0db = maxVolume --> this is necessary! Otherwise the system sound device will keep the vol state even when appl. has been closed.
      FreeMedia(hMedia)
      End
      
    EndIf
  Else
    FreeMedia(hMedia)
    End
  EndIf
EndIf
Wenn ich so einen Stream Wiedergebe kommt ein Fehler der durch Zeile 226 Verursacht wird.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Direct Show

Beitrag von Joel »

Lol, och glaube ich muss das echt in C++ Programmieren, hier hat scheinbar noch keiner was mit DirectShow gemacht!
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Direct Show

Beitrag von DrShrek »

Joel hat geschrieben:Lol, och glaube ich muss das echt in C++ Programmieren, hier hat scheinbar noch keiner was mit DirectShow gemacht!
Gute Idee!
Wenn Du aber mal die Source von INC genauer ansiehst...wirst Du sicher das auch in PB schaffen.
Wenn Du damit nicht klar kommst...solltest Du das mit dem C++ auch lieber sein lassen.

Ansonsten würde ich statt den #VMR7_Windowed einfach einen der anderen noch möglichen Alternativen ausprobieren. Dazu musst Du aber in den INC Sourcen reinsehen...wo wir wieder am Anfang meines Beitrages sind. Sorry etwas Eigenarbeit erwarte ich schon von Dir.
Aber DU kannst ja immer noch auf C++ umsteigen...sicher geht es damit dann im Schlaf. :wink:
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Direct Show

Beitrag von Fluid Byte »

Lol, och glaube ich muss das echt in C++ Programmieren, hier hat scheinbar noch keiner was mit DirectShow gemacht!
Weil du keine Antwort bekommst unterstellst du allen Mitgliedern dieses Forums sie hätten "mit DirectShow noch nie was gemacht?"

Was fürn' Kraut hast du dir wieder reingeballert?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Direct Show

Beitrag von Joel »

Ja, werde das mal mit nem anderen Versuchen, danke für die Idee. Ne Unterstelle ich nicht. So mein ich das nicht. Mir ist nur aufgefallen, das sowohl im Englischen Forum und auch im Deutschen nicht keiner mehr weiß als ich.

Achso, kann es sein, dass inc. lange nicht mehr im Forum war, finde nur noch alte Beiträge von ihm.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Direct Show

Beitrag von Joel »

Dr. Shrek hat geschrieben:Ansonsten würde ich statt den #VMR7_Windowed einfach einen der anderen noch möglichen Alternativen ausprobieren.
Habe das mal probiert, klappt aber nicht. Es kommt immer noch der Fehler: "Error: Rendering file failed".

Wahrscheinlich muss man da einen anderen Filter auswählen, bzw. anderen RendererFilter. Wahrscheinlich unterstützt der jetzige kein öffnen von Streams. jetzt ist nur die Frage, welchen Filter und vorallendingen, wo man den wie einsetzt!
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Direct Show

Beitrag von HeX0R »

Joel hat geschrieben: Achso, kann es sein, dass inc. lange nicht mehr im Forum war, finde nur noch alte Beiträge von ihm.
incs Profil hat geschrieben: Letzte Anmeldung: 15 Nov 2009 11:08:36
Nur weil jemand kein Schwätzer ist, heisst es nicht, dass er nicht mitliest oder gar in den Weiten eines WoW verschwunden ist.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Re: Direct Show

Beitrag von jear »

MI basiert auf PB 3.94 und DirectShow (DS)

Bei der lizenzierten Version ist auch der MI-Player, mit dem man alles spielen kann, was das eigene Repertoire an DS-Filtern hergibt. Welche Filter man hat, welche Eigenschaften und Prioritäten (Merits) sie genießen, alles gut zu managen. Dank PB und DS.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Antworten