Speicherung von Webcam aufnahme

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Zcared.

    Speicherung von Webcam aufnahme

    Hallo Community!

    Ich habe hier einen Code gefunden, mit dem es möglich ist die Webcam in einer Picturebox anzeigen zu lassen und anscheinend auch aufzunehmen bzw zu speichern.
    Nur ist das Problem das die Speicherung der videos nicht funktioniert. aus dem Speichercode selbst werde ich persönlich nicht wirklich schlau! deswegen frage ich hier um rat.
    Es ist daher interessant für mich als das ich das Speicher Schema gerne für ein anderes Projekt übernehmen würde.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Runtime.InteropServices
    4. Imports Microsoft.Win32
    5. Public Class Form1
    6. Inherits System.Windows.Forms.Form
    7. Const WM_CAP_START = &H400S
    8. Const WS_CHILD = &H40000000
    9. Const WS_VISIBLE = &H10000000
    10. Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
    11. Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
    12. Const WM_CAP_EDIT_COPY = WM_CAP_START + 30
    13. Const WM_CAP_SEQUENCE = WM_CAP_START + 62
    14. Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
    15. Const WM_CAP_SET_SCALE = WM_CAP_START + 53
    16. Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
    17. Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
    18. Const SWP_NOMOVE = &H2S
    19. Const SWP_NOSIZE = 1
    20. Const SWP_NOZORDER = &H4S
    21. Const HWND_BOTTOM = 1
    22. '--The capGetDriverDescription function retrieves the version
    23. ' description of the capture driver--
    24. Declare Function capGetDriverDescriptionA Lib"avicap32.dll" _
    25. (ByVal wDriverIndex As Short, _
    26. ByVal lpszName As String, ByVal cbName As Integer, _
    27. ByVal lpszVer As String, _
    28. ByVal cbVer As Integer) As Boolean
    29. '--The capCreateCaptureWindow function creates a capture window--
    30. Declare Function capCreateCaptureWindowA Lib"avicap32.dll" _
    31. (ByVal lpszWindowName As String, ByVal dwStyle As Integer, _
    32. ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, _
    33. ByVal nHeight As Short, ByVal hWnd As Integer, _
    34. ByVal nID As Integer) As Integer
    35. '--This function sends the specified message to a window or windows--
    36. Declare Function SendMessage Lib"user32"Alias"SendMessageA" _
    37. (ByVal hwnd As Integer, ByVal Msg As Integer, _
    38. ByVal wParam As Integer, _
    39. <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
    40. '--Sets the position of the window relative to the screen buffer--
    41. Declare Function SetWindowPos Lib"user32"Alias"SetWindowPos" _
    42. (ByVal hwnd As Integer, _
    43. ByVal hWndInsertAfter As Integer, ByVal x As Integer, _
    44. ByVal y As Integer, _
    45. ByVal cx As Integer, ByVal cy As Integer, _
    46. ByVal wFlags As Integer) As Integer
    47. '--This function destroys the specified window--
    48. Declare Function DestroyWindow Lib"user32" _
    49. (ByVal hndw As Integer) As Boolean
    50. '---used to identify the video source---
    51. Dim CamSource As Integer
    52. '---used as a window handle---
    53. Dim hWnd As Integer
    54. Private Sub cameraSource()
    55. Dim DriverName As String = Space(80)
    56. Dim DriverVersion As String = Space(80)
    57. For i As Integer = 0 To 9
    58. If capGetDriverDescriptionA(i, DriverName, 80, _
    59. DriverVersion, 80) Then
    60. ListBox1.Items.Add(DriverName.Trim)
    61. End If
    62. Next
    63. End Sub
    64. Private Sub previewCamera(ByVal pbCtrl As PictureBox)
    65. hWnd = capCreateCaptureWindowA(CamSource, _
    66. WS_VISIBLE Or WS_CHILD, 0, 0, 0, _
    67. 0, pbCtrl.Handle.ToInt32, 0)
    68. If SendMessage( _
    69. hWnd, WM_CAP_DRIVER_CONNECT, _
    70. CamSource, 0) Then
    71. '---set the preview scale---
    72. SendMessage(hWnd, WM_CAP_SET_SCALE, True, 0)
    73. '---set the preview rate (ms)---
    74. SendMessage(hWnd, WM_CAP_SET_PREVIEWRATE, 30, 0)
    75. '---start previewing the image---
    76. SendMessage(hWnd, WM_CAP_SET_PREVIEW, True, 0)
    77. '---resize window to fit in PictureBox control---
    78. SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, _
    79. pbCtrl.Width, pbCtrl.Height, _
    80. SWP_NOMOVE Or SWP_NOZORDER)
    81. Else
    82. '--error connecting to video source---
    83. DestroyWindow(hWnd)
    84. End If
    85. End Sub
    86. Private Sub stopPreviewCamera()
    87. SendMessage(hWnd, WM_CAP_DRIVER_DISCONNECT, CamSource, 0)
    88. DestroyWindow(hWnd)
    89. End Sub
    90. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    91. cameraSource()
    92. Button4.Enabled = False
    93. Button1.Enabled = False
    94. Button2.Enabled = False
    95. Button3.Enabled = False
    96. End Sub
    97. Private Sub ListBox1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
    98. Label1.Visible = False
    99. previewCamera(PictureBox1)
    100. Button1.Enabled = True
    101. Button4.Enabled = False
    102. Button2.Enabled = True
    103. End Sub
    104. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    105. CamSource = ListBox1.SelectedIndex
    106. '---preview the selected video source
    107. End Sub
    108. 'stop preview
    109. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    110. stopPreviewCamera()
    111. Button4.Enabled = True
    112. Button1.Enabled = False
    113. End Sub
    114. ' recording
    115. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    116. Button3.Enabled = True
    117. Button2.Enabled = False
    118. SendMessage(hWnd, WM_CAP_SEQUENCE, 0, 0)
    119. End Sub
    120. ' stop recording and ask to save video
    121. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    122. Dim save As Integer
    123. save = MsgBox("Do you want to save your recording video", MsgBoxStyle.YesNo + MsgBoxStyle.Information, "Recording Video")
    124. If (save = MsgBoxResult.Yes) Then
    125. Dim saveName As New SaveFileDialog
    126. saveName.Filter = "Avi file(*.avi)|*.avi"
    127. If saveName.ShowDialog = Windows.Forms.DialogResult.OK Then
    128. ' SendMessage(hWnd, WM_CAP_FILE_SAVEAS, 0, "C:\RecordedVideo.avi")
    129. SendMessage(hWnd, WM_CAP_FILE_SAVEAS, 0, saveName.FileName)
    130. End If
    131. End If
    132. Me.Cursor = System.Windows.Forms.Cursors.Default
    133. Button2.Enabled = True
    134. Button3.Enabled = False
    135. End Sub
    136. ' preview
    137. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    138. CamSource = ListBox1.SelectedIndex
    139. previewCamera(PictureBox1)
    140. Button4.Enabled = False
    141. Button1.Enabled = True
    142. End Sub
    143. End Class


    Vielen dank im voraus und Liebe Grüße

    Zcared
    @Zcared Das sieht eher nicht gut aus, denn um das nachzuvollziehen, brauchen wir nicht nur die avicap32.dll, sondern auch die (noch) unbekannte Kamera.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Zcared schrieb:

    Also nur
    Wir haben nix außer Deinem Code, wir können also nur rumstochern.
    Was sagt das Handbuch?
    Wo ist der Code her?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Zcared Das sieht mir nach einer Inkompatibilität zwischen der DLL und diesem Code sowie Deiner Kamera aus, dieser Dode (DLL ggf. auch) ist nicht für Deine Kamera gemacht bzw. getuned.
    Such mal, ob Du für Deine Kamera ein entsprechendes Interface findest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oh ok also liegt es an meiner kamera? bzw einfach nur das sie nicht zu dem Code past?
    weil an sich läuft das Programm ja, es ist nur so das der Save button versagt. Ich komme soweit als das ich den Speicherort
    auswählen kann, dann jedoch wird keine Datei erzeugt

    Zcared schrieb:

    Ich komme soweit als das ich den Speicherort auswählen kann, dann jedoch wird keine Datei erzeugt
    Dann bleibt noch übrig, dass die Parameterübergabe des Strings (letzter Parameter) nicht korrekt ist:

    Zcared schrieb:

    VB.NET-Quellcode

    1. Declare Function SendMessage Lib"user32"Alias"SendMessageA" _
    2. (ByVal hwnd As Integer, ByVal Msg As Integer, _
    3. ByVal wParam As Integer, _
    4. <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) _ ' dieser hier
    5. As Integer
    Du kannst hier mehrere Überladungen deklarieren, da musst Du echt probieren.
    Sieh Dir hier mal ein paar Möglichkeiten an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!