Seite 1 von 4

avifil32.dll

Verfasst: 15.07.2011 12:29
von deify
Also mein erstes Problem hat sich erledigt! Daher ändere ich den Post mal (:

Meine Frage ist, wie kann ich aus mehreren einzelbildern mit der avifil32.dll eine avi machen?
Muss ich dazu einen neuen Stream erzeugen und dann jedes Bild mit AVIStreamWrite auf den stream speichern?

Wäre nett wenn ihr mir genauere Infos dazu geben kkönntet! Mir sind z.b. Auch die PArameter von AviStreamWrite etwas suspect http://msdn.microsoft.com/en-us/library ... 85%29.aspx

z.b. LONG lStart,
LONG lSamples

mfg deify

Re: avifil32.dll

Verfasst: 15.07.2011 15:56
von bobobo
kennste die Suchfunktioon im Board ?

http://www.purebasic.fr/german/search.p ... bmit=Suche

Re: avifil32.dll

Verfasst: 15.07.2011 16:02
von deify
habe ich schon gesehen, blos irgendwie war ich zu dumm was passendes rauszufiltern! Ich habs jetzt mal anhand des msdn-Beispiels probiert, allerdings bin ich mir nicht sicher ob es überhaupt der richtige ansatz ist!


EDIT: Also ich hab den Code jetzt mal in mein Webcam-Projekt eingefügt, es wird sogar eine .avi aufgenommen, allerdings wächst diese VIEL zu schnell, (nach 20 sec aufnehmen sind etwa 3 stunden material vorhanden! UND noch viel schlimmer :D es zeigt nichts an.... lediglich die Dateigröße nimmt zu, anscheinend aber kein Bild....

Wie kann ich das synchronisieren? Wieso zeigt es kein Bild an?

Anbei der komplette Code (zum Testen sollte eine (/zwei) Webcam(s) vorhanden sein, die zweite ist auskommentiert!)

Code: Alles auswählen

EnableExplicit

EnableExplicit

IncludeFile "escapi.pbi"
IncludeFile "avifil32.pbi"

UsePNGImageDecoder()
UseTGAImageDecoder()

If escapiOpen() = 0
  MessageRequester("Kamera", "DLL 'escapi.dll' nicht vorhanden!")
  End
EndIf

Structure TGA_HEADER
  imageid.a
  colourmaptype.a
  imagetype.a
  colourmapstart.u
  colourmaplength.u
  colourmapbits.a
  xstart.u
  ystart.u
  width.u
  height.u
  pixeldepth.a
  descriptor.a
EndStructure

Structure fps_struc
  fps_soll.i
  fps_delay.i
  fps_counter.i
  fps_timer.i
  fps_res.i
EndStructure

;{ Enumerations
;Fenster
Enumeration
  #Video_Gadget1
  #Video_Gadget2 
  
  #Window_0
  #menu
  
  #new_buttonImage
  #open_buttonImage
  #delete_buttonImage
  #play_buttonImage
  #pause_buttonImage
  #stop_buttonImage
  #next_buttonImage
  #previous_buttonImage
  #record_buttonImage
 
EndEnumeration


;Icons & Videoimages
Enumeration
  #new_ico
  #open_ico
  #delete_ico
  #play_ico
  #pause_ico
  #stop_ico
  #next_ico
  #previous_ico
  #record_ico

  #video_Image1
  #video_Image2
EndEnumeration

Enumeration
  #new_menuitem
  #open_menuitem
  #delete_menuitem
  #close_menuitem
EndEnumeration

;}


Global quit.i = #False, quitThread = -1, recording = #False
Global width.l, height.l, testwidth.l, testheight.l

Procedure capture(deviceno.i)

  Protected image.i, *pImage.i
  Protected count.l, *namebuffer.i, bufferlength.l, name$
  Protected tgaheader.TGA_HEADER, scp.SimpleCapParams
  Protected t1.q, t2.q, time.q
  Protected frame = 0

  Protected *fps.fps_struc

  *fps.fps_struc = AllocateMemory(SizeOf(fps_struc))

  If *fps > 0
    
    *fps\fps_soll  = 100
    *fps\fps_delay = 1000 / *fps\fps_soll
    
    image = CreateImage(#PB_Any, width, height, 24)
    SetGadgetState(deviceno, ImageID(image))

    initCOM()
    AVIFileInit()
    
    If AVIFileOpen(@ppfile,"C:\cam"+Str(deviceno)+".avi",#OF_CREATE,#Null)
     End
    Else
    If AVIFileCreateStream(ppfile,@ppavi,@psi)
      AVIFileRelease(ppfile)
      End
    Else
      If AVIStreamSetFormat(ppavi,0,tgaheader, SizeOf(TGA_HEADER))
        AVIStreamRelease(ppavi)
        AVIFileRelease(ppfile)
        End
      EndIf
     EndIf
    EndIf

    count = countCaptureDevices()
    If count > 0

      tgaHeader\imageid         = 0
      tgaHeader\colourmaptype   = 0
      tgaheader\imagetype       = 2
      tgaHeader\colourmapstart  = 0
      tgaHeader\colourmaplength = 0
      tgaheader\width           = width
      tgaheader\height          = height
      tgaHeader\xstart          = 0
      tgaHeader\ystart          = 0
      tgaheader\pixeldepth      = 32
      tgaheader\descriptor      = % 11110100

      *pImage = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))

      If *pImage > 0

        CopyMemory(@tgaheader, *pImage, SizeOf(TGA_HEADER))

        scp\mWidth     = width
        scp\mHeight    = height
        scp\mTargetBuf = *pImage + SizeOf(TGA_HEADER)

        If initCapture(deviceno, @scp)

          Repeat

            t1 = timeGetTime_()

            If *fps\fps_timer < t1
              *fps\fps_res     = *fps\fps_counter
              *fps\fps_timer   = t1 + 1000
              *fps\fps_counter = 0
            Else
              *fps\fps_counter + 1
            EndIf

            doCapture(deviceno)
; 
;             While isCaptureDone(deviceno) = 0
;              If quit = 1
;                Break
;              EndIf
;              Delay(1)
;             Wend

            If quit = 1
              Break
            EndIf

            If CatchImage(deviceno, *pImage)
              If recording = #False
                StartDrawing(ImageOutput(image))
  
                DrawImage(ImageID(deviceno), 0, 0)
  
                DrawText(10, 10, "FPS: " + Str(*fps\fps_res), RGB(255, 0, 0))
  
                StopDrawing()
  
                SetGadgetState(deviceno, ImageID(image))
              Else
                AVIStreamWrite(ppavi,frame,1,*pImage,MemorySize(*pImage),#PB_Any,#Null,#Null)
                frame+1
              EndIf
            EndIf

            t2 = timeGetTime_()

            time = t2 - t1

            If time < *fps\fps_delay
              Delay(*fps\fps_delay - time)
            Else
              Delay(1)
            EndIf

          Until quit = 1 Or quitThread = deviceno

          deinitCapture(deviceno)
          AVIFileExit()
          
        EndIf

      EndIf

    EndIf

  EndIf

  If *fps > 0
    FreeMemory(*fps)
  EndIf

  If *namebuffer > 0
    FreeMemory(*namebuffer)
  EndIf

  If *pImage > 0
    FreeMemory(*pImage)
  EndIf

EndProcedure

Procedure getVideoFormat()
  ExamineDesktops()
  testwidth = DesktopWidth(0)-150
  testheight = DesktopHeight(0)-225
  
  Repeat
    width + 16
    height + 9
  Until width >= testwidth Or height >= testheight /2
  width-16
  height-9
EndProcedure

Procedure LoadImages()
  CatchImage(#new_ico,?new)
  ResizeImage(#new_ico,75,75)
  CatchImage(#open_ico,?open)
  ResizeImage(#open_ico,75,75)
  CatchImage(#delete_ico,?del)
  ResizeImage(#delete_ico,75,75)
  CatchImage(#play_ico,?play)
  CatchImage(#pause_ico,?pause)
  CatchImage(#stop_ico,?stop)
  CatchImage(#next_ico,?nex)
  CatchImage(#previous_ico,?previous)
  CatchImage(#record_ico,?record)
  ResizeImage(#record_ico,25,25)
EndProcedure

Procedure OpenWindow_0()
  If OpenWindow(#Window_0,0,0,width+200,height*2+150,"Testfenster",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
    ButtonImageGadget(#new_buttonImage,25,DesktopHeight(0)/2-150-175/2,75,75,ImageID(#new_ico))
    ButtonImageGadget(#open_buttonImage,25,DesktopHeight(0)/2-50-175/2,75,75,ImageID(#open_ico))
    ButtonImageGadget(#delete_buttonImage,25,DesktopHeight(0)/2+50-175/2,75,75,ImageID(#delete_ico))
    
    ButtonImageGadget(#previous_buttonImage,width/2-150+125,height*2+200-137.5,50,50,ImageID(#previous_ico))
    ButtonImageGadget(#play_buttonImage,width/2-90+125,height*2+200-137.5,50,50,ImageID(#play_ico))
    ButtonImageGadget(#stop_buttonImage,width/2-30+125,height*2+200-137.5,50,50,ImageID(#stop_ico))
    ButtonImageGadget(#record_buttonImage,width/2+30+125,height*2+200-137.5,50,50,ImageID(#record_ico),#PB_Button_Toggle)
    ButtonImageGadget(#next_buttonImage,width/2+90+125,height*2+200-137.5,50,50,ImageID(#next_ico))
    
    ImageGadget(#Video_Gadget1,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25),width,height, 0)
    ImageGadget(#Video_Gadget2,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25)+25+height,width,height, 0)
    
    If CreateMenu(#menu,WindowID(#Window_0))
      MenuTitle("Datei")
      MenuItem(#new_menuitem, "Neu")
      MenuItem(#open_menuitem, "Öffnen")
      MenuItem(#delete_menuitem, "Löschen")
      MenuBar()
      MenuItem(#close_menuitem, "Beenden")
    Else
      MessageRequester("Error","Fenster konnte nicht geladen werden!")
      End
    EndIf
  Else
    MessageRequester("Error","Fenster konnte nicht geladen werden!")
    End
  EndIf  
  
  EndProcedure
  
  Procedure windowHandler()
    Protected capture01TH,capture02TH, q1, q2
       
    StickyWindow(#Window_0, 1)
    
    capture01TH = CreateThread(@capture(), 0)
;   capture02TH = CreateThread(@capture(), 1)
    
    Repeat
      Select WaitWindowEvent(1)
        Case #PB_Event_CloseWindow
          quit = #True
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Video_Gadget1
              Select EventType()
                Case #PB_EventType_LeftDoubleClick
                  quitThread = 0
                  Repeat
                    Delay(100)
                  Until Not IsThread(capture01TH)
                  quitThread = -1
                  Repeat
                    capture01TH = CreateThread(@capture(),0)
                  Until IsThread(capture01TH)
                                    
                  
              EndSelect
            Case #Video_Gadget2
              Select EventType()
                Case #PB_EventType_LeftDoubleClick 
                  quitThread = 1
                  Repeat
                    Delay(100)
                  Until Not IsThread(capture02TH)
                  quitThread = -1
                  Repeat
                    capture02TH = CreateThread(@capture(),1)
                  Until IsThread(capture02TH)                  
              EndSelect
            Case #record_buttonImage
              Select EventType()
                Case #PB_EventType_LeftClick
                  If recording = #False
                    recording = #True
                  Else
                    recording = #False
                    AVIStreamRelease(ppavi)
                    AVIFileRelease(ppfile)
                  EndIf
              EndSelect
          EndSelect
      EndSelect
      
      q1 = IsThread(capture01TH)
      q1 = IsThread(capture02TH)

    Until quit = 1 And q1 = 0 And q2 = 0
    
EndProcedure

Procedure main()
getVideoFormat()
LoadImages()
OpenWindow_0()
windowHandler()

escapiClose()
EndProcedure

main()

;{ datasection
End
DataSection
  new: IncludeBinary "Neu.png"
  open: IncludeBinary "Öffnen.png"
  del: IncludeBinary "Löschen.png"
  play: IncludeBinary "play.png"
  pause: IncludeBinary "pause.png"
  stop: IncludeBinary "stop.png"
  nex: IncludeBinary "next.png"
  previous: IncludeBinary "previous.png"
  record: IncludeBinary "record.png"
EndDataSection
;}
;}

Re: avifil32.dll

Verfasst: 15.07.2011 17:32
von bobobo
Bist Du sicher das du mit dem Code EinzelBilder zu einem Video zusammenbaust?

Für mich sieht das eher genau andersrum aus. einzelbilder aus einem video darstellen.

(ich komme aber nur bis

Code: Alles auswählen

If Not AVIFileCreateStream(ppfile,@ppavi,@psi)
bzw bis zum End danach



im allgemeinen bin ich ja bei sowas ein freund von ffmpeg (und/oder dem videolan project)
mit ffmpeg kanst du imho aus EInzelbildern ein Video zusammenstöpseln
z.B.
ffmpeg -f image2 -i img%d.jpg c:\new.avi /für bis zu 9 Bilder

ffmpeg -f image2 -i img%02d.jpg c:\new.avi // für bis zu 99 Bilder

ffmpeg -f image2 -i img%03d.jpg c:\new.avi // für bis zu 999 Bilder

die Bilder müssen dann img1.jpg - img9.jpg bzw img01.jpg bis img99.jpg
bzw img001.img bis img999.jpg heissen

Re: avifil32.dll

Verfasst: 15.07.2011 17:35
von bobobo
andersrum gehts so

ffmpeg -i c:\new.avi -f image2 -s 320x240 k:\bilder%4d.jpg

Re: avifil32.dll

Verfasst: 15.07.2011 17:48
von deify
ja sry, der code war falsch :D habe das not inzwischen rausgestrichen!

Also eigentlich soll der Code ein Video einer Webcam (das ja in Einzelbildern im RAM landet und dann mit einem TGA-Header auf meine Imagegadget geklatscht wird) als AVI abspeichern.

So, jetzt habe ich das eben mit diesem code versucht! Ich geb dir nochmal die aktuelle version, allerdings brauchst du auch noch die escapi.dll wenn du eine webcam angeschlossen hast! aufnahme startet man natürlich mit dem aufnahme button :D und beendet diese auch wieder so

Code: Alles auswählen

EnableExplicit

IncludeFile "escapi.pbi"
IncludeFile "avifil32.pbi"

UsePNGImageDecoder()
UseTGAImageDecoder()

If escapiOpen() = 0
  MessageRequester("Kamera", "DLL 'escapi.dll' nicht vorhanden!")
  End
EndIf

Structure TGA_HEADER
  imageid.a
  colourmaptype.a
  imagetype.a
  colourmapstart.u
  colourmaplength.u
  colourmapbits.a
  xstart.u
  ystart.u
  width.u
  height.u
  pixeldepth.a
  descriptor.a
EndStructure

Structure fps_struc
  fps_soll.i
  fps_delay.i
  fps_counter.i
  fps_timer.i
  fps_res.i
EndStructure

;{ Enumerations
;Fenster
Enumeration
  #Video_Gadget1
  #Video_Gadget2 
  
  #Window_0
  #menu
  
  #new_buttonImage
  #open_buttonImage
  #delete_buttonImage
  #play_buttonImage
  #pause_buttonImage
  #stop_buttonImage
  #next_buttonImage
  #previous_buttonImage
  #record_buttonImage
 
EndEnumeration


;Icons & Videoimages
Enumeration
  #new_ico
  #open_ico
  #delete_ico
  #play_ico
  #pause_ico
  #stop_ico
  #next_ico
  #previous_ico
  #record_ico

  #video_Image1
  #video_Image2
EndEnumeration

Enumeration
  #new_menuitem
  #open_menuitem
  #delete_menuitem
  #close_menuitem
EndEnumeration

;}


Global quit.i = #False, quitThread = -1, recording = #False
Global width.l, height.l, testwidth.l, testheight.l

Procedure capture(deviceno.i)

  Protected image.i, *pImage.i
  Protected count.l, *namebuffer.i, bufferlength.l, name$
  Protected tgaheader.TGA_HEADER, scp.SimpleCapParams
  Protected t1.q, t2.q, time.q
  Protected frame = 0

  Protected *fps.fps_struc

  *fps.fps_struc = AllocateMemory(SizeOf(fps_struc))

  If *fps > 0
    
    *fps\fps_soll  = 30
    *fps\fps_delay = 1000 / *fps\fps_soll
    
    image = CreateImage(#PB_Any, width, height, 24)
    SetGadgetState(deviceno, ImageID(image))

    initCOM()

    count = countCaptureDevices()
    If count > 0

      tgaHeader\imageid         = 0
      tgaHeader\colourmaptype   = 0
      tgaheader\imagetype       = 2
      tgaHeader\colourmapstart  = 0
      tgaHeader\colourmaplength = 0
      tgaheader\width           = width
      tgaheader\height          = height
      tgaHeader\xstart          = 0
      tgaHeader\ystart          = 0
      tgaheader\pixeldepth      = 32
      tgaheader\descriptor      = % 11110100

      *pImage = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))

      If *pImage > 0

        CopyMemory(@tgaheader, *pImage, SizeOf(TGA_HEADER))

        scp\mWidth     = width
        scp\mHeight    = height
        scp\mTargetBuf = *pImage + SizeOf(TGA_HEADER)

        If initCapture(deviceno, @scp)
                AVIFileInit()
          
          If AVIFileOpen(@ppfile,"C:\cam"+Str(deviceno)+".avi",#OF_CREATE,#Null)
           End
          Else
          If AVIFileCreateStream(ppfile,@ppavi,@psi)
            AVIFileRelease(ppfile)
            End
          Else
            If AVIStreamSetFormat(ppavi,0,tgaheader, SizeOf(TGA_HEADER))
              AVIStreamRelease(ppavi)
              AVIFileRelease(ppfile)
              End
            EndIf
           EndIf
          EndIf

          Repeat

            t1 = timeGetTime_()

            If *fps\fps_timer < t1
              *fps\fps_res     = *fps\fps_counter
              *fps\fps_timer   = t1 + 1000
              *fps\fps_counter = 0
            Else
              *fps\fps_counter + 1
            EndIf

            doCapture(deviceno)
; 
;             While isCaptureDone(deviceno) = 0
;              If quit = 1
;                Break
;              EndIf
;              Delay(1)
;             Wend

            If quit = 1
              Break
            EndIf

            If CatchImage(deviceno, *pImage)
              If recording = #False
                StartDrawing(ImageOutput(image))
  
                DrawImage(ImageID(deviceno), 0, 0)
  
                DrawText(10, 10, "FPS: " + Str(*fps\fps_res), RGB(255, 0, 0))
  
                StopDrawing()
  
                SetGadgetState(deviceno, ImageID(image))
              Else
                AVIStreamWrite(ppavi,AVIStreamLength(ppavi),1,*pImage,MemorySize(*pImage),#PB_Any,#Null,#Null)
                frame+1
              EndIf
            EndIf

            t2 = timeGetTime_()

            time = t2 - t1

            If time < *fps\fps_delay
              Delay(*fps\fps_delay - time)
            Else
              Delay(1)
            EndIf

          Until quit = 1 Or quitThread = deviceno

          deinitCapture(deviceno)
          AVIFileExit()
          
        EndIf

      EndIf

    EndIf

  EndIf

  If *fps > 0
    FreeMemory(*fps)
  EndIf

  If *namebuffer > 0
    FreeMemory(*namebuffer)
  EndIf

  If *pImage > 0
    FreeMemory(*pImage)
  EndIf

EndProcedure

Procedure getVideoFormat()
  ExamineDesktops()
  testwidth = DesktopWidth(0)-150
  testheight = DesktopHeight(0)-225
  
  Repeat
    width + 16
    height + 9
  Until width >= testwidth Or height >= testheight /2
  width-16
  height-9
EndProcedure

Procedure LoadImages()
  CatchImage(#new_ico,?new)
  ResizeImage(#new_ico,75,75)
  CatchImage(#open_ico,?open)
  ResizeImage(#open_ico,75,75)
  CatchImage(#delete_ico,?del)
  ResizeImage(#delete_ico,75,75)
  CatchImage(#play_ico,?play)
  CatchImage(#pause_ico,?pause)
  CatchImage(#stop_ico,?stop)
  CatchImage(#next_ico,?nex)
  CatchImage(#previous_ico,?previous)
  CatchImage(#record_ico,?record)
  ResizeImage(#record_ico,25,25)
EndProcedure

Procedure OpenWindow_0()
  If OpenWindow(#Window_0,0,0,width+200,height*2+150,"Testfenster",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
    ButtonImageGadget(#new_buttonImage,25,DesktopHeight(0)/2-150-175/2,75,75,ImageID(#new_ico))
    ButtonImageGadget(#open_buttonImage,25,DesktopHeight(0)/2-50-175/2,75,75,ImageID(#open_ico))
    ButtonImageGadget(#delete_buttonImage,25,DesktopHeight(0)/2+50-175/2,75,75,ImageID(#delete_ico))
    
    ButtonImageGadget(#previous_buttonImage,width/2-150+125,height*2+200-137.5,50,50,ImageID(#previous_ico))
    ButtonImageGadget(#play_buttonImage,width/2-90+125,height*2+200-137.5,50,50,ImageID(#play_ico))
    ButtonImageGadget(#stop_buttonImage,width/2-30+125,height*2+200-137.5,50,50,ImageID(#stop_ico))
    ButtonImageGadget(#record_buttonImage,width/2+30+125,height*2+200-137.5,50,50,ImageID(#record_ico),#PB_Button_Toggle)
    ButtonImageGadget(#next_buttonImage,width/2+90+125,height*2+200-137.5,50,50,ImageID(#next_ico))
    
    ImageGadget(#Video_Gadget1,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25),width,height, 0)
    ImageGadget(#Video_Gadget2,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25)+25+height,width,height, 0)
    
    If CreateMenu(#menu,WindowID(#Window_0))
      MenuTitle("Datei")
      MenuItem(#new_menuitem, "Neu")
      MenuItem(#open_menuitem, "Öffnen")
      MenuItem(#delete_menuitem, "Löschen")
      MenuBar()
      MenuItem(#close_menuitem, "Beenden")
    Else
      MessageRequester("Error","Fenster konnte nicht geladen werden!")
      End
    EndIf
  Else
    MessageRequester("Error","Fenster konnte nicht geladen werden!")
    End
  EndIf  
  
  EndProcedure
  
  Procedure windowHandler()
    Protected capture01TH,capture02TH, q1, q2
       
    StickyWindow(#Window_0, 1)
    
    capture01TH = CreateThread(@capture(), 0)
;   capture02TH = CreateThread(@capture(), 1)
    
    Repeat
      Select WaitWindowEvent(1)
        Case #PB_Event_CloseWindow
          quit = #True
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Video_Gadget1
              Select EventType()
                Case #PB_EventType_LeftDoubleClick
                  quitThread = 0
                  Repeat
                    Delay(100)
                  Until Not IsThread(capture01TH)
                  quitThread = -1
                  Repeat
                    capture01TH = CreateThread(@capture(),0)
                  Until IsThread(capture01TH)
                                    
                  
              EndSelect
            Case #Video_Gadget2
              Select EventType()
                Case #PB_EventType_LeftDoubleClick 
                  quitThread = 1
                  Repeat
                    Delay(100)
                  Until Not IsThread(capture02TH)
                  quitThread = -1
                  Repeat
                    capture02TH = CreateThread(@capture(),1)
                  Until IsThread(capture02TH)                  
              EndSelect
            Case #record_buttonImage
              Select EventType()
                Case #PB_EventType_LeftClick
                  If recording = #False
                    recording = #True
                  Else
                    recording = #False
                    AVIStreamRelease(ppavi)
                    AVIFileRelease(ppfile)
                  EndIf
              EndSelect
          EndSelect
      EndSelect
      
      q1 = IsThread(capture01TH)
      q1 = IsThread(capture02TH)

    Until quit = 1 And q1 = 0 And q2 = 0
    
EndProcedure

Procedure main()
getVideoFormat()
LoadImages()
OpenWindow_0()
windowHandler()

escapiClose()
EndProcedure

main()

;{ datasection
End
DataSection
  new: IncludeBinary "Neu.png"
  open: IncludeBinary "Öffnen.png"
  del: IncludeBinary "Löschen.png"
  play: IncludeBinary "play.png"
  pause: IncludeBinary "pause.png"
  stop: IncludeBinary "stop.png"
  nex: IncludeBinary "next.png"
  previous: IncludeBinary "previous.png"
  record: IncludeBinary "record.png"
EndDataSection
;}

Re: avifil32.dll

Verfasst: 15.07.2011 19:32
von bobobo
mach ich dann mal (sobald ich ne webcam an meinem Rechenknecht dran hab) morgen oder so

Re: avifil32.dll

Verfasst: 16.07.2011 16:30
von deify
So hier nochmal der überarbeitete code mit tga-header und nach einem Beispiel aus dem französischen Forum.
Jetzt bekomme ich allerdings beim Aufrufen der AviStreamSetFormat-Funktion den errorcode 102 oder 104 ,je nachdem welchen codec ich verwende. Wäre toll wenn ihr mir da weiterhelfen könnt, da ich das format eigentlich gerne komprimieren würde und nicht mit nur einzelbildern!

Leider ist die AVI zwar aufgenommen, kann aber nicht abgespielt werden! Hoffe ihr wisst mehr als ich :D

Code: Alles auswählen

EnableExplicit

IncludeFile "escapi.pbi"
IncludeFile "avifil32.pbi"

UsePNGImageDecoder()
UseTGAImageDecoder()

If escapiOpen() = 0
  MessageRequester("Kamera", "DLL 'escapi.dll' nicht vorhanden!")
  End
EndIf


Structure TGA_HEADER
  imageid.a
  colourmaptype.a
  imagetype.a
  colourmapstart.u
  colourmaplength.u
  colourmapbits.a
  xstart.u
  ystart.u
  width.u
  height.u
  pixeldepth.a
  descriptor.a
EndStructure

Structure tgax
  tga.TGA_HEADER
EndStructure

Structure fps_struc
  fps_soll.i
  fps_delay.i
  fps_counter.i
  fps_timer.i
  fps_res.i
EndStructure

;{ Enumerations
;Fenster
Enumeration
  #Video_Gadget1
  #Video_Gadget2 
  
  #Window_0
  #Window_1
  #list
  #buttonOK
  #buttonNew
  #buttonDelete
  #menu
  
  #new_buttonImage
  #open_buttonImage
  #delete_buttonImage
  #play_buttonImage
  #pause_buttonImage
  #stop_buttonImage
  #next_buttonImage
  #previous_buttonImage
  #record_buttonImage
 
EndEnumeration


;Icons & Videoimages
Enumeration
  #new_ico
  #open_ico
  #delete_ico
  #play_ico
  #pause_ico
  #stop_ico
  #next_ico
  #previous_ico
  #record_ico

  #video_Image1
  #video_Image2
EndEnumeration

Enumeration
  #new_menuitem
  #open_menuitem
  #delete_menuitem
  #close_menuitem
  
  #settings_menuitem
EndEnumeration

Enumeration
  #streamtypeAUDIO = $73647561
  #streamtypeVIDEO = $73646976
  #ICMF_CHOOSE_KEYFRAME=1
  #ICMF_CHOOSE_DATARATE=2
  #AVIERR_OK=0
  #AVIIF_KEYFRAME=$10
EndEnumeration


;}


Global quit.i = #False, quitThread = -1, restartCapture = -1, recording = #False
Global width.l, height.l, testwidth.l, testheight.l
Global changeSettings = #False

Procedure capture(deviceno.i)

  Protected image.i, *pImage.i
  Protected count.l, *namebuffer.i, bufferlength.l, name$
  Protected tgaheader.TGA_HEADER, scp.SimpleCapParams
  Protected t1.q, t2.q, time.q
  Protected frame = 0
  Protected aviStreamInfo.AVISTREAMINFO, opts.AVICOMPRESSOPTIONS
  Protected error.b, tga.TGA_HEADER
  Protected ppfile.l, ppavi.l, pAVICompressed.l, psi.AVISTREAMINFO

  Protected *fps.fps_struc

  *fps.fps_struc = AllocateMemory(SizeOf(fps_struc))

  If *fps > 0
    
    *fps\fps_soll  = 30
    *fps\fps_delay = 1000 / *fps\fps_soll
    
    image = CreateImage(#PB_Any, width, height, 24)
    SetGadgetState(deviceno, ImageID(image))

    initCOM()

    count = countCaptureDevices()
    If count > 0

      tgaHeader\imageid         = 0
      tgaHeader\colourmaptype   = 0
      tgaheader\imagetype       = 2
      tgaHeader\colourmapstart  = 0
      tgaHeader\colourmaplength = 0
      tgaheader\width           = width
      tgaheader\height          = height
      tgaHeader\xstart          = 0
      tgaHeader\ystart          = 0
      tgaheader\pixeldepth      = 32
      tgaheader\descriptor      = % 11110100

      *pImage = AllocateMemory(width * height * 4 + SizeOf(TGA_HEADER))

      If *pImage > 0

        CopyMemory(@tgaheader, *pImage, SizeOf(TGA_HEADER))

        scp\mWidth     = width
        scp\mHeight    = height
        scp\mTargetBuf = *pImage + SizeOf(TGA_HEADER)

        If initCapture(deviceno, @scp)
          AVIFileInit()
          
          If AVIFileOpen(@ppfile,"C:\cam"+Str(deviceno)+".avi",#OF_CREATE,#Null)
            End
           Else
            aviStreamInfo\fccType                = #streamtypeVIDEO
            aviStreamInfo\fccHandler\a             = $6D
            aviStreamInfo\fccHandler\b             = $73
            aviStreamInfo\fccHandler\c             = $76
            aviStreamInfo\fccHandler\d             = $63 
            aviStreamInfo\dwScale                = 1 
            aviStreamInfo\dwRate                 = 4 
            aviStreamInfo\dwSuggestedBufferSize  = MemorySize(*pImage)
            
            If SetRect_(@aviStreamInfo\rcFrame, 0, 0, tgaheader\width, tgaheader\height) <>0
              If AVIFileCreateStream(ppfile,@ppavi,@aviStreamInfo)
               AVIFileRelease(ppfile)
                End
              Else
                opts.AVICOMPRESSOPTIONS
                Dim aopts(0)
                aopts(0)=@opts
                If AVISaveOptions(0, #ICMF_CHOOSE_KEYFRAME | #ICMF_CHOOSE_DATARATE, 1, @ppavi, @aopts(0)) <> 1
                  MessageRequester("Fehler", "Fehler beim Ändern der AVI-Einstellungen aufgetreten")
                EndIf
                If Not AVIMakeCompressedStream(@pAVICompressed, ppavi, aopts(0), 0)=#AVIERR_OK
                  MessageRequester("Fehler","Ein Fehler ist beim Komprimieren der AVI aufgetreten!")
                  End
                EndIf
                error = AVIStreamSetFormat(pAVICompressed, 0, @tga, SizeOf(TGA_HEADER))
                If error
                  MessageRequester("Fehler","Fehler "+Str(error)+" ist beim Konfigurieren des AVI-Formats aufgetreten!")
                  End
                EndIf
              EndIf
            Else
              End
            EndIf
          EndIf
            
          Repeat
            If restartCapture <> deviceno
              t1 = timeGetTime_()
  
              If *fps\fps_timer < t1
                *fps\fps_res     = *fps\fps_counter
                *fps\fps_timer   = t1 + 1000
                *fps\fps_counter = 0
              Else
                *fps\fps_counter + 1
              EndIf
  
              doCapture(deviceno)
  ; 
  ;             While isCaptureDone(deviceno) = 0
  ;              If quit = 1
  ;                Break
  ;              EndIf
  ;              Delay(1)
  ;             Wend
  
              If CatchImage(deviceno, *pImage)
                If recording = #False
                  If frame <> 0
                    frame = 0
                    AVIStreamRelease(pAVICompressed)
                    AVIStreamRelease(ppavi)
                    AVIFileRelease(ppfile)
                  EndIf
                  
                  StartDrawing(ImageOutput(image))
    
                  DrawImage(ImageID(deviceno), 0, 0)
    
                  DrawText(10, 10, "FPS: " + Str(*fps\fps_res), RGB(255, 0, 0))
    
                  StopDrawing()
    
                  SetGadgetState(deviceno, ImageID(image))
                Else
                  If AVIStreamWrite(pAVICompressed,frame,1,*pImage,MemorySize(*pImage),#AVIIF_KEYFRAME,#Null,#Null)
                    frame+1
                  EndIf
                  
                EndIf
              EndIf
  
              t2 = timeGetTime_()
  
              time = t2 - t1
  
              If time < *fps\fps_delay
                Delay(*fps\fps_delay - time)
              Else
                Delay(1)
              EndIf
            Else
              deinitCapture(deviceno)
              Repeat
                Delay(100)
              Until initCapture(deviceno, @scp)
              restartCapture = -1
            EndIf
          Until quit = 1 Or quitThread = deviceno

          deinitCapture(deviceno)
        Else
          MessageRequester("Fehler","Es ist ein Fehler beim Starten der Webcams aufgetreten!")
          End
        EndIf

      EndIf

    EndIf

  EndIf

  If *fps > 0
    FreeMemory(*fps)
  EndIf

  If *namebuffer > 0
    FreeMemory(*namebuffer)
  EndIf

  If *pImage > 0
    FreeMemory(*pImage)
  EndIf

EndProcedure

Procedure getVideoFormat()
  ExamineDesktops()
  testwidth = DesktopWidth(0)-150
  testheight = DesktopHeight(0)-225
  
  Repeat
    width + 16
    height + 9
  Until width >= testwidth Or height >= testheight /2
  width-16
  height-9
EndProcedure

Procedure LoadImages()
  CatchImage(#new_ico,?new)
  ResizeImage(#new_ico,75,75)
  CatchImage(#open_ico,?open)
  ResizeImage(#open_ico,75,75)
  CatchImage(#delete_ico,?del)
  ResizeImage(#delete_ico,75,75)
  CatchImage(#play_ico,?play)
  CatchImage(#pause_ico,?pause)
  CatchImage(#stop_ico,?stop)
  CatchImage(#next_ico,?nex)
  CatchImage(#previous_ico,?previous)
  CatchImage(#record_ico,?record)
  ResizeImage(#record_ico,25,25)
EndProcedure

Procedure OpenWindow_0()
  If OpenWindow(#Window_0,0,0,width+200,height*2+150,"Testfenster",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
    ButtonImageGadget(#new_buttonImage,25,DesktopHeight(0)/2-150-175/2,75,75,ImageID(#new_ico))
    ButtonImageGadget(#open_buttonImage,25,DesktopHeight(0)/2-50-175/2,75,75,ImageID(#open_ico))
    ButtonImageGadget(#delete_buttonImage,25,DesktopHeight(0)/2+50-175/2,75,75,ImageID(#delete_ico))
    
    ButtonImageGadget(#previous_buttonImage,width/2-150+125,height*2+200-137.5,50,50,ImageID(#previous_ico))
    ButtonImageGadget(#play_buttonImage,width/2-90+125,height*2+200-137.5,50,50,ImageID(#play_ico))
    ButtonImageGadget(#stop_buttonImage,width/2-30+125,height*2+200-137.5,50,50,ImageID(#stop_ico))
    ButtonImageGadget(#record_buttonImage,width/2+30+125,height*2+200-137.5,50,50,ImageID(#record_ico),#PB_Button_Toggle)
    ButtonImageGadget(#next_buttonImage,width/2+90+125,height*2+200-137.5,50,50,ImageID(#next_ico))
    
    ImageGadget(#Video_Gadget1,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25),width,height, 0)
    ImageGadget(#Video_Gadget2,DesktopWidth(0)-(DesktopWidth(0)-125),DesktopHeight(0)-(DesktopHeight(0)-25)+25+height,width,height, 0)
    
    If CreateMenu(#menu,WindowID(#Window_0))
      MenuTitle("Datei")
      MenuItem(#new_menuitem, "Neu")
      MenuItem(#open_menuitem, "Öffnen")
      MenuItem(#delete_menuitem, "Löschen")
      MenuBar()
      MenuItem(#close_menuitem, "Beenden")
      MenuTitle("Einstellungen")
      MenuItem(#settings_menuitem,"AVI Kompressionseinstellungen")
    Else
      MessageRequester("Error","Fenster konnte nicht geladen werden!")
      End
    EndIf
  Else
    MessageRequester("Error","Fenster konnte nicht geladen werden!")
    End
  EndIf  
  
  EndProcedure
  
Procedure OpenWindow_1(usage.s)
  If OpenWindow(#Window_1,0,0,300,400,"Bitte "+usage+" wählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
    ListViewGadget(#list,10,10,280,325)
    ButtonGadget(#buttonOK,10,345,80,45,"OK")
    ButtonGadget(#buttonNew,110,345,80,45,"Neu")
    ButtonGadget(#buttonDelete,210,345,80,45,"Löschen")
  EndIf
EndProcedure

Procedure windowHandler()
  Protected capture01TH,capture02TH, q1, q2
  Protected eventGadget, eventType, eventMenu
  Protected window1Usage.s
    
    
    capture01TH = CreateThread(@capture(), 0)
    capture02TH = CreateThread(@capture(), 1)
    
    Repeat
      
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          If EventWindow() = #Window_0
            quit = #True
          Else
            CloseWindow(#Window_1)
          EndIf
                   
        Case #PB_Event_Gadget
          Select EventGadget()
              
            ;--Window0
          Case #new_buttonImage
            window1Usage = "Verein"
            OpenWindow_1(window1Usage)
            StickyWindow(#Window_1,1)
          Case #open_buttonImage
              
            Case #Video_Gadget1
              Select EventType()
                Case #PB_EventType_LeftDoubleClick
                  restartCapture = 0
              EndSelect
              
            Case #Video_Gadget2
              Select EventType()
                Case #PB_EventType_LeftDoubleClick 
                  restartCapture = 1
              EndSelect
              
            Case #record_buttonImage
              Select EventType()
                Case #PB_EventType_LeftClick
                  If recording = #False
                    recording = #True
                  Else
                    recording = #False
                  EndIf
              EndSelect
              
              
              ;--Window1
            Case #buttonOK
              If window1Usage = "Verein"
                CloseWindow(#window_1)
                window1Usage = "Spieler"
                OpenWindow_1(window1Usage)
              Else
                CloseWindow(#Window_1)
              EndIf
              
              Case #buttonNew
                AddGadgetItem(#list,-1,InputRequester("Neu","Geben Sie den Namen des neuen "+window1Usage+"s ein",""))
              Case #buttonDelete
                If GetGadgetState(#list) > -1
                  If MessageRequester("Löschen","Sind Sie sich sicher, dass sie den "+window1Usage+" "+GetGadgetItemText(#list,GetGadgetState(#list))+" aus der Liste entfernen wollen?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
                    RemoveGadgetItem(#list,GetGadgetState(#list))
                  EndIf         
                EndIf
                EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            Case #settings_menuitem
                MessageRequester("Fehler","Funktion noch nicht implementiert!")         
          EndSelect
      EndSelect 
      

      q1 = IsThread(capture01TH)
      q2 = IsThread(capture02TH)

    Until quit = 1 And q1 = 0 And q2 = 0
    
EndProcedure

Procedure main()
getVideoFormat()
LoadImages()
OpenWindow_0()
windowHandler()
AVIFileExit()
escapiClose()
EndProcedure

main()

;{ datasection
End
DataSection
  new: IncludeBinary "Neu.png"
  open: IncludeBinary "Öffnen.png"
  del: IncludeBinary "Löschen.png"
  play: IncludeBinary "play.png"
  pause: IncludeBinary "pause.png"
  stop: IncludeBinary "stop.png"
  nex: IncludeBinary "next.png"
  previous: IncludeBinary "previous.png"
  record: IncludeBinary "record.png"
EndDataSection
;}
;}
Hier noch die Includes!

avifil32.pbi:

Code: Alles auswählen

EnableExplicit

UseTGAImageDecoder()

Enumeration
  #avifil32_dll
EndEnumeration

Structure msvc
  a.b
  b.b
  c.b
  d.b
EndStructure

Structure AVISTREAMINFO
  fccType.l
  fccHandler.msvc
  dwFlags.l
  dwCaps.l
  wPriority.w
  wLanguage.w
  dwScale.l
  dwRate.l
  dwStart.l
  dwLength.l
  dwInitialFrames.l
  dwSuggestedBufferSize.l
  dwQuality.l
  dwSampleSize.l
  rcFrame.RECT 
  dwEditCount.l
  dwFormatChangeCount.l
  szName.b[64]
EndStructure

Structure AVIFILEINFO
  dwMaxBytesPerSec.l
  dwFlags.l
  dwCaps.l
  dwStreams.l
  dwSuggestedBufferSize.l
  dwWidth.l
  dwHeight.l
  dwScale.l
  dwRate.l
  dwLength.l
  dwEditCount.l
  szFileType.c[64]
EndStructure

Structure AVICOMPRESSOPTIONS
  fccType.l
  fccHandler.l
  dwKeyFrameEvery.l
  dwQuality.l
  dwBytesPerSecond.l
  dwFlags.l
  *lpFormat
  cbFormat.l
  *lpParms
  cbParms.l
  dwInterleaveEvery.l
EndStructure

Global AVIFileInit, AVIFileOpen, AVIFileRelease, AVIFileExit_, AVIFileCreateStream, AVIStreamSetFormat, AVIStreamRelease, AVIStreamWrite, AVIStreamLength, AVISaveOptions,AVIMakeCompressedStream


Prototype Proto_AVIFileInit()
Prototype.l Proto_AVIFileOpen(*ppfile.l, szFile.s, mode.l, *pclsidHandler.l)
Prototype.l Proto_AVIFileCreateStream(pfile.l, *ppavi.l, *psi.AVISTREAMINFO)
Prototype.l Proto_AVIStreamWrite(pavi.l, lStart.l, lSamples.l, lpBuffer.l, cbBuffer.l, dwFlags.l, *plSampWritten.l, *plBytesWritten.l)
Prototype.l Proto_AVIStreamSetFormat(pavi.l,lPos.l, lpFormat.l, cbFormat.l)
Prototype.l Proto_AVIStreamLength(pavi.l)
Prototype.l Proto_AVIStreamRelease(pavi.l)
Prototype.l Proto_AVIFileRelease(pfile.l)
Prototype.l Proto_AVISaveOptions(hwnd.l, uiFlags.l, nStrams.i, *ppavi.l, *plpOptions.l)
Prototype.l Proto_AVIMakeCompressedStream(*ppsCompressed.l, *psSource.l, *lpOptions.l, *pclsidHandler.l)
Prototype Proto_AVIFileExit()

If Not OpenLibrary(#avifil32_dll,"avifil32.dll")
  MessageRequester("Error","avifil32.dll wurde nicht gefunden.")
  End
Else
  AVIFileInit.Proto_AVIFileInit = GetFunction(#avifil32_dll, "AVIFileInit")
  AVIFileOpen.Proto_AVIFileOpen = GetFunction(#avifil32_dll, "AVIFileOpen")
  AVIFileCreateStream.Proto_AVIFileCreateStream = GetFunction(#avifil32_dll, "AVIFileCreateStream")
  AVIStreamWrite.Proto_AVIStreamWrite = GetFunction(#avifil32_dll, "AVIStreamWrite")
  AVIStreamSetFormat.Proto_AVIStreamSetFormat = GetFunction(#avifil32_dll,"AVIStreamSetFormat")
  AVIStreamLength.Proto_AVIStreamLength = GetFunction(#avifil32_dll,"AVIStreamLength")
  AVIStreamRelease.Proto_AVIStreamRelease = GetFunction(#avifil32_dll, "AVIStreamRelease")
  AVIFileRelease.Proto_AVIFileRelease = GetFunction(#avifil32_dll, "AVIFileRelease")
  AVISaveOptions.Proto_AVISaveOptions = GetFunction(#avifil32_dll,"AVISaveOptions")
  AVIMakeCompressedStream.Proto_AVIMakeCompressedStream = GetFunction(#avifil32_dll,"AVIMakeCompressedStream")
  AVIFileExit_.Proto_AVIFileExit = GetFunction(#avifil32_dll, "AVIFileExit")
EndIf

Global ppfile.l, ppavi.l, psi.AVISTREAMINFO, pAVICompressed.l

Procedure AVIFileExit()
  AVIFileExit_()
  CloseLibrary(#avifil32_dll)
EndProcedure
escapi.pbi

Code: Alles auswählen

; escapi.pbi
;
; http://sol.gfxile.net/escapi/index.html

Structure SimpleCapParams
  *mTargetBuf.i ; Must be at least mWidth * mHeight * SizeOf(int) of size!
  mWidth.l
  mHeight.l
EndStructure

Global escapiDLL.i

;- Prototype
PrototypeC.l ESCAPIDLLVersion()
PrototypeC.l countCaptureDevices()
PrototypeC.l deinitCapture(deviceno.l)
PrototypeC.l doCapture(deviceno.l)
PrototypeC.l getCaptureDeviceName(deviceno.l, *namebuffer.i, bufferlength.l)
PrototypeC.l initCOM()
PrototypeC.l initCapture(deviceno.l, *SimpleCapParams.i)
PrototypeC.l isCaptureDone(deviceno.l)

Procedure escapiClose()
  If escapiDLL > 0
    If IsLibrary(escapiDLL)
      CloseLibrary(escapiDLL)
    EndIf
    escapiDLL = 0
  EndIf
EndProcedure

Procedure escapiOpen()

  escapiDLL = OpenLibrary(#PB_Any, "escapi.dll")
  If escapiDLL = 0
    ProcedureReturn #False
  EndIf

  Global ESCAPIDLLVersion.ESCAPIDLLVersion=GetFunction(escapiDLL,"ESCAPIDLLVersion")
  Global countCaptureDevices.countCaptureDevices=GetFunction(escapiDLL,"countCaptureDevices")
  Global deinitCapture.deinitCapture=GetFunction(escapiDLL,"deinitCapture")
  Global doCapture.doCapture=GetFunction(escapiDLL,"doCapture")
  Global getCaptureDeviceName.getCaptureDeviceName=GetFunction(escapiDLL,"getCaptureDeviceName")
  Global initCOM.initCOM=GetFunction(escapiDLL,"initCOM")
  Global initCapture.initCapture=GetFunction(escapiDLL,"initCapture")
  Global isCaptureDone.isCaptureDone=GetFunction(escapiDLL,"isCaptureDone")

  ProcedureReturn #True
EndProcedure

Re: avifil32.dll

Verfasst: 20.07.2011 14:36
von deify
Also ich pushe den Thread nochmal. Wollte mich mal erkundigen ob schonwas gefunden worden ist, warum die Aufnahme nicht wie gewünscht funktioniert. Der Code im Thread oben wurde aktualisiert und ist somit auf meinem momentanen Stand.

Wäre sehr cool wenn ihr euch mal die Aufnahmefunktion anschauen könntet! Wie gesagt es wird eine Avi aufgenommen, welche aber nicht abgespielt werden kann!

mfg deify

Re: avifil32.dll

Verfasst: 20.07.2011 15:56
von dige
Kannste das Projekt bitte mit allen Dateien inkl. Icons in ein Zip kopieren.
Hab grad keine Lust das alles zusammenzusuchen...