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
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
;}
;}
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