none
Tester le micro de sa Webcam ou le micro par défaut. RRS feed

  • Question

  • Bonjour !

    Comment faire pour tester le micro de sa Webcam (VB 2008).

    Avec un code que j'ai trouvé, j'ai l'image mais je souhaiterais ajouter le test micro. Par exemple un image qui change ou un message dit dans un label que le micro fonctionne bien. Même s'il n'y a pas de niveau d'écoute ce n'est pas important.

    A moins qu'il faille tester le micro par défaut ? mais là encore, je ne sais pas faire. p(-_-)q

    Merci

    • Type modifié Aurel Bera lundi 28 juillet 2014 07:34 disc
    • Type modifié Aurel Bera mercredi 6 août 2014 06:50
    dimanche 20 juillet 2014 15:23

Réponses

  • Eurêka !

    J'ai trouvé la solution avec Core Audio API. Non seulement j'ai le micro (entrée) mais j'ai aussi la sortie audio.

    En prime, vous avez la barre de progression (ProgressBar) verticale et non horizontale. Mais vous pouvez la changer.

    Mais comme je suis un gentil, j'ai fait un ZIP dans lequel vous trouvez les DLL Core Audio API ainsi que la source en VB 2008. Si besoin, contactez moi.

    Le ZIP :
    http://michel.billaud2.free.fr/tmp/VolumeControl.zip

    Par contre, je ne sais pas si c'est possible d'avoir le nom du périphérique avec Core Audio API.

    J'ai ajouté deux TrackBar pour règler le volume et deux CheckBox pour "Muet".

    • Modifié Michel56100 mercredi 6 août 2014 01:06
    • Marqué comme réponse Aurel Bera mercredi 6 août 2014 06:50
    mercredi 6 août 2014 00:10

Toutes les réponses

  • Bon, j'ai trouvé un code mais il ne fonctionne pas chez moi. :(

    J'ai l'erreur suivante : n’est pas une application Win32 valide. (Exception de HRESULT : 0x800700C1)

    L'erreur se produi lorsque je clique sur le bouton FindButton.

        Private Sub FindButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FindButton.Click
            Dim audioDevices As New CaptureDevicesCollection
            Dim x As Integer = 0
            While x < audioDevices.Count
                ComboBox1.Items.Add(audioDevices.Item(x).Description)
                x = x + 1
            End While
            ComboBox1.SelectedIndex = 0
        End Sub

    Imports Microsoft.DirectX.DirectSound
    Imports System.Threading
    Imports System.Collections.Specialized

    Public Class Sound_Card_Form
        Private Const SAMPLES As Integer = 8
        Private Shared SAMPLE_FORMAT_ARRAY As Integer() = {SAMPLES, 2, 1}
        Public Shared audioDevices As CaptureDevicesCollection
        Private Shared m_deviceNames As StringCollection
        Private deviceName As String = "(none)"
        Private deviceIndex As Integer = -1
        Private buffer As Microsoft.DirectX.DirectSound.CaptureBuffer
        Private liveVolumeThread As System.Threading.Thread
        Private m_sampleDelay As Integer = 100
        Private m_frameDelay As Integer = 10
        Private m_autoStart As Boolean = True

        Function Demarre() As Integer
            Call Me.Arret()
            Dim audioDevices As New CaptureDevicesCollection
            deviceIndex = ComboBox1.SelectedIndex
            If deviceIndex <> -1 Then
                ' initialize the capture buffer and start the animation thread 
                Dim cap As New Capture(audioDevices(deviceIndex).DriverGuid)
                Dim desc As New CaptureBufferDescription()
                Dim wf As New WaveFormat()
                wf.BitsPerSample = 16
                wf.SamplesPerSecond = 44100
                wf.Channels = 2
                wf.BlockAlign = CShort(wf.Channels * wf.BitsPerSample / 8)
                wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond
                wf.FormatTag = WaveFormatTag.Pcm
                desc.Format = wf
                desc.BufferBytes = SAMPLES * wf.BlockAlign
                buffer = New Microsoft.DirectX.DirectSound.CaptureBuffer(desc, cap)
                buffer.Start(True)
                ' Start a seperate thread to read the buffer and update the progress bars 
                liveVolumeThread = New Thread(AddressOf updateProgress) 'Thread starts at updateProgress 
                Control.CheckForIllegalCrossThreadCalls = False ' This is needed otherwise the form will not update 
                liveVolumeThread.Priority = ThreadPriority.Lowest ' Thread works in the background 
                liveVolumeThread.Start()
            End If
        End Function

        Function Arret() As Integer
            If liveVolumeThread IsNot Nothing Then
                liveVolumeThread.Abort()
                liveVolumeThread.Join()
                liveVolumeThread = Nothing
            End If
            If buffer IsNot Nothing Then
                If buffer.Capturing Then
                    buffer.[Stop]()
                End If
                buffer.Dispose()
                buffer = Nothing
            End If
        End Function

        Function updateProgress() As Integer
            While True
                Dim tempFrameDelay As Integer = m_frameDelay
                Dim tempSampleDelay As Integer = m_sampleDelay
                Dim samples__1 As Array = buffer.Read(0, GetType(Int16), LockFlag.FromWriteCursor, SAMPLE_FORMAT_ARRAY)
                ' for each channel, determine the step size necessary for each iteration 
                Dim leftGoal As Integer = 0
                Dim rightGoal As Integer = 0
                ' Sum the 8 samples 
                For i As Integer = 0 To SAMPLES - 1
                    leftGoal += CType(samples__1.GetValue(i, 0, 0), Int16)
                    rightGoal += CType(samples__1.GetValue(i, 1, 0), Int16)
                Next
                ' Calculate the average of the 8 samples 
                leftGoal = CInt(Math.Abs(leftGoal \ SAMPLES))
                rightGoal = CInt(Math.Abs(rightGoal \ SAMPLES))
                Dim range1 As Double = leftGoal - ProgressBar1.Value ' calculates the difference between new and the current progress bar value 
                Dim range2 As Double = rightGoal - ProgressBar2.Value
                ' Assign the exact current value to the progress bar 
                Dim exactValue1 As Double = ProgressBar1.Value
                Dim exactValue2 As Double = ProgressBar2.Value
                Dim stepSize1 As Double = range1 / tempSampleDelay * tempFrameDelay
                ' Limit the value range to positive values 
                If Math.Abs(stepSize1) < 0.01 Then
                    stepSize1 = Math.Sign(range1) * 0.01
                End If
                Dim absStepSize1 As Double = Math.Abs(stepSize1)
                Dim stepSize2 As Double = range2 / tempSampleDelay * tempFrameDelay
                If Math.Abs(stepSize2) < 0.01 Then
                    stepSize2 = Math.Sign(range2) * 0.01
                End If
                Dim absStepSize2 As Double = Math.Abs(stepSize2)
                ' increment/decrement the bars' values until both equal their desired goals, 
                ' sleeping between iterations 
                If (ProgressBar1.Value = leftGoal) AndAlso (ProgressBar2.Value = rightGoal) Then
                    Thread.Sleep(tempSampleDelay)
                Else
                    Do
                        If ProgressBar1.Value <> leftGoal Then
                            If absStepSize1 < Math.Abs(leftGoal - ProgressBar1.Value) Then
                                exactValue1 += stepSize1
                                ProgressBar1.Value = CInt(Math.Truncate(Math.Round(exactValue1)))
                                'This is the real value 
                                'decibels = 20 * Log10(ProgressBar1.Value/ 32768.0) 
                            Else
                                ProgressBar1.Value = leftGoal
                            End If
                        End If
                        If ProgressBar2.Value <> rightGoal Then
                            If absStepSize2 < Math.Abs(rightGoal - ProgressBar2.Value) Then
                                exactValue2 += stepSize2
                                ProgressBar2.Value = CInt(Math.Truncate(Math.Round(exactValue2)))
                            Else
                                ProgressBar2.Value = rightGoal
                            End If
                        End If
                        Thread.Sleep(tempFrameDelay)
                    Loop While (ProgressBar1.Value <> leftGoal) OrElse (ProgressBar2.Value <> rightGoal)
                End If
            End While
        End Function

        Private Sub FindButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FindButton.Click
            Dim audioDevices As New CaptureDevicesCollection
            Dim x As Integer = 0
            While x < audioDevices.Count
                ComboBox1.Items.Add(audioDevices.Item(x).Description)
                x = x + 1
            End While
            ComboBox1.SelectedIndex = 0
        End Sub

        Private Sub StartButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles StartButton.Click
            Me.Demarre()
        End Sub
    End Class

    dimanche 20 juillet 2014 16:22
  • Bon, je crois que cela vient de la version 64 Bits de mon Windows 8.1. :(

    Quelqu'un a une autre solution que DirectX ?

    Merci

    dimanche 20 juillet 2014 17:14
  • Bonjour

    Essayez de changer la cible entre X86/X64/AnyCpu.

    Voir cet article :

    BadImageFormatException was unhandled Exception

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 21 juillet 2014 09:22
  • Bonjour,

    j'ai bien précisé qu'il s'agit de VB 2008. Donc, je ne peux pas changer pour AnyCPU, X86 ou X64. Ou alors c'est caché parce que le lien que vous m'avez donné concerne plus VB 2010 ou VB 2012.

    C'est bien DirectX qui ne veut pas fonctionner.

    Y a-t-il un autre moyen que DirectX ? Merci

    lundi 21 juillet 2014 17:44
  • Voir la réponse de John Douthat dans ce thread (pas la réponse marquee, et  même s'il parle de C# et pas VB.NET):

    Setting 32-bit x86 build target in Visual C# 2008 Express Edition?

    Bien cordialement


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 22 juillet 2014 08:22
  • Bonjour,

    vous-voulez dire que ce code ne fonctionne pas avec VB 2008 mais plutôt avec C# 2008 ?

    Merci

    mardi 22 juillet 2014 13:02
  • Non, il vous explique comment forcer X86 en place d’Any Cpu en vous indiquant les options dans les menus.
    Même si cet article c'est pour C#, les mêmes options sont disponibles pour VB.Net.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 22 juillet 2014 13:05
  • Re !

    Ah eh bien, je ne trouve pas comment procéder pour VB 2008.

    Dites, pourquoi tous les jours je dois me reconnecter bien que j'ai coché la case garder la session ouverte ?

    mardi 22 juillet 2014 13:08
  • Oops, c'était CCleaner qui supprimait ma session. :)
    mardi 22 juillet 2014 13:23
  • J'ai beau chercher partout, je ne vois pas où définir x86.
    mardi 22 juillet 2014 13:38
  • Essayez la solution marquée dans le lien propose ci-dessus.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 23 juillet 2014 07:12
  • Bonjour,

    j'utilise la version Visual Basic 2008 Express et il n'y a pas "Configuration Manager".

    Je n'ai pas la présentation : http://1.bp.blogspot.com/-x6N9Hd_MZ50/US5J_yMkwyI/AAAAAAAAkk0/b70avlefFCk/s1600/Solution_Property_Pages_big.gif

    Voici que j'ai : http://michel.billaud2.free.fr/tmp/VB2008.jpg

    paramètres avancés du compilateur.


    mercredi 23 juillet 2014 13:49
  • Dans le menu Générer vous avez Gestion de configurations ou quelque chose similaire (dernier option dans le menu)?

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 24 juillet 2014 09:06
  • Bon jour,

    dans le menu "Générer", on peut soit générer ou publier l'application. Aucun choix x86, AnyCPU ou x64. A ma connaissance, dans VB 2008 Express  il n'y a pas de possibilité de compiler en 64 bits.

    lundi 28 juillet 2014 18:10
  • J'ai trouvé un autre code avec l'API Core Audio mais il ne marche pas.

    C'est dans le Form1.Load que ça ne fonctionne pas. DeviceCapture et DeviceRender. Merci

    Imports CoreAudioApi
    
    Public Class Form1
        Dim DevicesCapture As MMDevice : Dim DeviceRender As MMDevice : Dim DevEnum As MMDeviceEnumerator
        Dim _Channels As New Channels
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DevicesCapture = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eCapture, ERole.eMultimedia)
            DeviceRender = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia)
        End Sub
    
        Structure Channels
            'Microphone par défaut
            Public GET_IN_MASTER As Integer
            Public GET_IN_LeftChannel As Integer
            Public GET_IN_RightChannel As Integer
            'Speakers par défaut
            Public GET_OUT_MASTER As Integer
            Public GET_OUT_LeftChannel As Integer
            Public GET_OUT_RightChannel As Integer
    
            'Défini les valeur Micro et Speakers
            Public SET_IN_MASTER As Integer
            Public SET_OUT_MASTER As Integer
        End Structure
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            _Channels.GET_IN_LeftChannel = CInt(DevicesCapture.AudioMeterInformation.PeakValues(0) * 100)
            _Channels.GET_IN_RightChannel = CInt(DevicesCapture.AudioMeterInformation.PeakValues(1) * 100)
            _Channels.GET_IN_MASTER = CInt(DevicesCapture.AudioMeterInformation.MasterPeakValue * 100)
            _Channels.GET_OUT_LeftChannel = CInt(DeviceRender.AudioMeterInformation.PeakValues(0) * 100)
            _Channels.GET_OUT_RightChannel = CInt(DeviceRender.AudioMeterInformation.PeakValues(1) * 100)
            _Channels.GET_OUT_MASTER = CInt(DeviceRender.AudioMeterInformation.MasterPeakValue * 100)
    
            VPB_IN_MASTER.Value = _Channels.GET_IN_MASTER
            VPB_IN_LEFT.Value = _Channels.GET_IN_LeftChannel
            VPB_IN_RIGHT.Value = _Channels.GET_IN_RightChannel
    
            VPB_OUT_MASTER.Value = _Channels.GET_OUT_MASTER
            VPB_OUT_Left.Value = _Channels.GET_OUT_LeftChannel
            VPB_OUT_Right.Value = _Channels.GET_OUT_RightChannel
        End Sub
    End Class
    
    Public Class VerticalProgressBar
        Inherits ProgressBar
    
        Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
            Get
                Dim cp As CreateParams = MyBase.CreateParams
                cp.Style = cp.Style Or &H4
                Return cp
            End Get
        End Property
    End Class
    

    dimanche 3 août 2014 01:27
  • Bonjour,

    regarder ce lien vous avez la réponse a votre question : http://www.codeproject.com/Articles/285964/WPF-Webcam-Control

    Cordialement,

    dimanche 3 août 2014 05:57
  • Bonjour,

    le code dans la page est pour VS 2012.

    J'ai viré VB 2008 pour installer VB 2010. Pareil, rien ne fonctionnait. J'ai viré VB 2010 pour installer VB 2012. J'ai bien choisi x86. Eh bien blocage. VB 2012 ne répond plus. Avec AnyCPU, j'avais la même chose qu'avec VB 2008.

    Du coup, je suis revenu à VB 2008 et j'ai viré VB 2012. Après cela, Windows 8.1 était instable. Avec un grand :( avec écran à fond bleu... arrêt inopiné de Windows.

    J'ai réinstallé Windows du coup !

    mardi 5 août 2014 14:48
  • Bonsoir,

    C'est cette ligne qui pose problème :

    Dim audioDevices As New CaptureDevicesCollection

    mardi 5 août 2014 22:08
  • Eurêka !

    J'ai trouvé la solution avec Core Audio API. Non seulement j'ai le micro (entrée) mais j'ai aussi la sortie audio.

    En prime, vous avez la barre de progression (ProgressBar) verticale et non horizontale. Mais vous pouvez la changer.

    Mais comme je suis un gentil, j'ai fait un ZIP dans lequel vous trouvez les DLL Core Audio API ainsi que la source en VB 2008. Si besoin, contactez moi.

    Le ZIP :
    http://michel.billaud2.free.fr/tmp/VolumeControl.zip

    Par contre, je ne sais pas si c'est possible d'avoir le nom du périphérique avec Core Audio API.

    J'ai ajouté deux TrackBar pour règler le volume et deux CheckBox pour "Muet".

    • Modifié Michel56100 mercredi 6 août 2014 01:06
    • Marqué comme réponse Aurel Bera mercredi 6 août 2014 06:50
    mercredi 6 août 2014 00:10