Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB 6] DirectShow riproduzione audio

    Apro questa discussione perchè con la precedente (DirectSound e temporizzazione) mi sembrava di essere ormai andato fuori tema.

    Riespongo a tutti voi il mio problema e confido in un vostro aiuto.

    Come si intuisce dal titolo il problema lo ho riscontrato in una procedura per risprodurre file multimediali con directshow (DirectX 8.0)
    Infatti riesco a riprodurre perfettamente tutti i file video ma non riesco a riprodurre file audio, tranne i wma.
    Il codice ve lo riporto di seguito:

    [CODE]
    Global DSAudio As IBasicAudio
    Global DSVideo As IBasicVideo2
    Global DSWindow As IVideoWindow
    Global DSControl As IMediaControl
    Global DSPos As IMediaPosition

    Global Const WS_VISIBLE = &H10000000
    Sub DS_OpenFile(FileName As String, Fhwnd As Long, Optional fullScreen As Boolean = False)
    Dim A As Boolean
    Dim rectTop As Long
    Dim rectleft As Long
    Dim rectWidth As Long
    Dim rectHeight As Long
    On Error Resume Next

    Call DS_termina

    Set DSControl = New FilgraphManager '
    Call DSControl.RenderFile(FileName)
    Set DSAudio = DSControl
    DSAudio.Volume = 0
    DSAudio.Balance = 0

    Set DSVideo = DSControl
    ...
    Set DSWindow = DSControl
    DSWindow.WindowStyle = &H10000000
    DSWindow.Top = rectTop
    DSWindow.Left = rectleft
    DSWindow.Width = rectWidth
    DSWindow.Height = rectHeight
    DSWindow.Owner = Fhwnd
    DSWindow.FullScreenMode = fullScreen

    Set DSPos = DSControl
    DSPos.Rate = 1
    A = DSPos.CanSeekForward

    End Sub

    L'ultima riga la ho inserita in una delle mie ultime prove per cercare di capire la natura dell'errore. E ho scoperto che tutti quei file audio che non funzionano restituiscono False al metodo CanSeekForward. Penso quindi che il problema sia centrato qui, ma non so proprio come risolverlo.

    Spero che qualcuno di voi lo sappia.
    Aspetto con ansia vostre notizie. A presto

  2. #2

  3. #3
    nussono sa darmi una mano?

  4. #4
    a me come te l'ho postato riproduce qualsiasi file legge mediaplayer
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  5. #5
    Il fatto è che il codice è praticamente uguale. Inoltre riproduce tutti i video e i wma mentre per i file wave ed mp3 o mi da errore o, per la maggior parte delle volte, si blocca tutta l'applicazione.

    A nessuno è mai capitata una cosa simile?
    Non dovrebbe essere un problema del DirectShow visto che mediaplayer quei file li legge benissimo.
    Non riesco proprio a capire

    Grazie ancora a xegallo per l'interessamento.

  6. #6
    Articolo trovato su un sito web...

    DirectShow è un componente perfetto per il multimediale essendo in grado di leggere AVI, Mpeg, mp3, mov e ogni file supportato dal computer. DirectShow è inoltre in grado di comprimere i filmati, convertire wav in Mp3 e addirittura effettuare cattura video. Sapendolo fare. E' infatti molto difficile trovare materiale sull'argomento che peraltro è abbastanza complesso ma che dà grandi soddisfazioni in caso di successo.



    Le variabili da inserire nel modulo sono le seguenti
    codice:
    Global DSAudio As IBasicAudio
    Global DSVideo As IBasicVideo
    Global DSWindow As IVideoWindow
    Global DSControl As IMediaControl
    Global DSPos As IMediaPosition
    
    Global Const WS_VISIBLE = &H10000000
    DSAudio e DSVideo sono le due variabili che controllano l'audio e il video; DSWindow contiene le proprietà di visualizzazione del filmato (dimensione o pieno schermo). DSControl serve per controllare il filmato e DSPos la posizione. Infine la costante serve a specificare che il filmato deve essere visibile. Ora il codice per l'inizializzazione da eseguire prima del play (la struttura è sempre la stessa di DirectX : Inizializzazione >> Esecuzione >> Chiusura.
    codice:
    Sub DS_OpenFile(Filename As String, _
    rectTop As Integer, _
    rectLeft As Integer, _
    rectWidth As Integer, _
    rectHeight As Integer, _
    FhWnd As Long, Optional fullScreen As Boolean = False)
    On Error Resume Next
    
    'Puliamo prima di caricare un nuovo file
    Call DS_termina
    
    Set DSControl = New FilgraphManager 'crea il controllo
    Call DSControl.RenderFile(Filename) 'carica il file
    'crea il controllo del volume
    Set DSAudio = DSControl
    DSAudio.Volume = 0 'regola il volume come normale
    DSAudio.Balance = 0 'centra l'audio
    
    Set DSWindow = DSControl 'crea l'oggetto che contiene il video(se presente
    DSWindow.WindowStyle = &H10000000 'finestra visibile
    DSWindow.Top = rectTop 'dimensioni del controllo
    DSWindow.Left = rectLeft
    DSWindow.Width = rectWidth
    DSWindow.Height = rectHeight
    DSWindow.Owner = FhWnd
    DSWindow.FullScreenMode = fullScreen
    
    Set DSPos = DSControl 'crea il controllo della posizione
    DSPos.Rate = 1
    
    End Sub
    
     
    
    Public Sub DS_termina()
    On Error Resume Next
    
    'fermiamo il file se sta già in esecuzione
    DSControl.Stop
    DSWindow.Owner = 0
    'distruggi tutto
    Set DSAudio = Nothing
    Set DSVideo = Nothing
    Set DSControl = Nothing
    Set DSWindow = Nothing
    Set DSPos = Nothing
    
    End Sub



    Spieghiamo il codice. La funzione termina è la prima che deve essere eseguita in quanto pulisce il sistema da eventuali file multimediali già in esecuizioni (ovviamente si tratta del caso in cui state caricando un secondo filmato). La funzione termina esegue lo stop del filmato (DSControl.Stop) e imposta a 0 il bersaglio. Tutte le variabili vengono impostate su nothing.

    La funzione openFile richiede la posizione del filmato (o brano audio), la dimensione della finestra o del controllo, la proprietà hwnd del form o del controllo (bersaglio del rendering) e un valore booleano per specificare se il filmato deve essere a fullscreeen. Dato che esistono moltissimi casi di filmati che possono generare errori ma continuare a funzionare (filmati senza audio o addirittura filmati senza video! oh fatto la prova) è meglio usare ON ERROR RESUME NEXT. Le istruzioni
    codice:
    Set DSControl = New FilgraphManager 'crea il controllo
    Call DSControl.RenderFile(Filename) 'carica il file
    creano il controllo del file e con renderFile lo carica.
    codice:
    Set DSAudio = DSControl
    DSAudio.Volume = 0 'regola il volume come normale
    DSAudio.Balance = 0 'centra l'audio
    Con queste istruzioni creiamo il controllo audio e settiamo l'audio e il balance (nota l'audio va da 0 a -10000, il balance da +10000 a -10000).

    Creiamo poi la zona di visualizzazione e la impostiamo
    codice:
    Set DSWindow = DSControl 'crea l'oggetto che contiene il video(se presente
    DSWindow.WindowStyle = &H10000000 'finestra visibile
    DSWindow.Top = rectTop 'dimensioni del controllo
    DSWindow.Left = rectLeft
    DSWindow.Width = rectWidth
    DSWindow.Height = rectHeight
    DSWindow.Owner = FhWnd
    DSWindow.FullScreenMode = fullScreen
    Left, top, width e height sono le dimensioni dello schermo ottenibili da form e componenti (occhio sono in pixel). Owner deve contenere il bersaglio (proprietà hWnd). Se si imposta fullScreen a true il filmato sarà a pieno schermo (anche durante la riproduzione), altrimento con false sarà nel controllo.

    Creiamo infine il controllo della posizione
    codice:
    Set DSPos = DSControl 'crea il controllo della posizione
    DSPos.Rate = 1
    Rate indica la velocità di riproduzione (modificabile in corsa). Ricordate 1 = velocita normale , 2= x2 , 0.5 = 1/2

    Ora non ci resta che eseguire il play.
    codice:
    DSPos.CurrentPosition = 0
    Call DSControl.Run
    CurrentPosition è la posizione da cui partire (0 è l'inizio). Run fa partire il filmato.

    Ora se il filmato è valido comparirà nel controllo o sarà visualizzato a pieno schermo (se la proprietà fullscreen è True). Nel caso si tratti di audio ovviamente si sentirà solo l'audio.

    Per fermare il brano dovete eseguire l'istruzione

    Call DSControl.Stop

    Ricordate di eseguire termina alla chiusura del programma.

    -------------
    Spero ti sia di aiuto

  7. #7
    Ti ringrazio molto per l'interessamente ma purtroppo il mio problema non penso stia nella correttezza del cosice.
    Per due motivi: primo perchè è praticamente uguale a tutti i codici per directshow che ho visto finora, seconodo perchè funziona con tutti i file video e i wma.
    Il mio sospetto è che ci sia un problemma alla DLL o qualcosa di esterno.

    Infatti, com ho già detto, non viene generato alcun errore, ma appena si arriva alla riga di istruzione che effettua il rendering del file l'applicazione si blocca e sono costretto a chiudere tutto VB terminando l'operazione.
    Solo raramente riesco a terminare l'operazione di apertura del file. Ma a quel punto non riesco a riprodurlo (stòparlando sempre di wav ed mp3). Infatti la funzione CanSeekForward mi restituisce Falsa. Questo significa che il fila non può essere riprodotto in avanti.

    Questi problemi sono i più ba*****, non si riesce a capire il problema e di conseguenza non posso neanche tentare una soluzione.

    Comunque vi ringrazio di nuovo tutti per l'interessamento. Capisco che non è una cosa semplice.

    Sperando di risolvere il problema, vi saluto.

    Alla prossima

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.