Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De ...
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
Hooola hermanos,

ahora un codigo para ejecutar solo ficheros audio MP3 con las Clases MediaPipeline y MediaControl del Componente gb.media.

El codigo tiene una propia función para conocer en particular la "versión", el "layer" y el "bitrate" del fichero MP3 que se va ejecutando. Conocendo lel tamaño del fichero y su bitrate es posible conocer la duración de el fichero MP3.

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, dcd, snk As MediaControl
 Dim fileMP3 As String
 Dim dur, i As Integer
 Dim tm As Date
  
  fileMP3 = "/ruta/del/archivo.mp3"
  If Not Exist(fileMP3) Then Error.Raise("Chico, tu fichero mp3 no existe !")
  
  pl = New MediaPipeline
  
  src = New MediaControl(pl, "filesrc")
  src["location"] = fileMP3
  dcd = New MediaControl(pl, "mad")
  snk = New MediaControl(pl, "alsasink")
  src.LinkTo(dcd)
  dcd.LinkTo(snk)
  
  pl.Play()
  
' Invoca la función para obtener la duración del archivo audio MP3:
  dur = DurataMP3(fileMP3)
  
  tm = Now
  
  Repeat
    i = DateDiff(tm, Now, gb.Millisecond)
    Write "\rTiempo transcurrido: " & Date(0, 0, 0, 0, 0, 0, i)
    Wait 0.01
  Until i >= dur
  
' Libera la memoria y se va terminando:
   pl.Stop
   pl.Close
  
   Write "\nEjecución terminada !"
  
End


Private Function DurataMP3(mp3 As String) As Integer
 
 Dim s, ver_mp3, layer As String
 Dim j, frequenza, durata As Integer
 Dim vB, lB, brB, frB As Byte
 Dim initium, bitrate As Short
  
  Print "File audio mp3: "; File.Name(mp3)
  
  s = File.Load(mp3)
  Print "\nDimensión: "; Len(s); " byte"
  
  initium = 1
  
  For j = initium To Len(s) - 1
    If (Asc(s, j) = 255) And (Asc(s, j + 1) > 241) And (Asc(s, j + 2) > 15) Then
 
' Se detecta la versión del archivo MP3:
      vB = Asc(s, j + 1) And 24
      Select Case vB
        Case 0
          ver_mp3 = "2.5"
        Case 16
          ver_mp3 = "2"
        Case 24
          ver_mp3 = "1"
      End Select
      
' Se detecta el "Layer" del fichero mp3:
      lB = Asc(s, j + 1) And 6
      Select Case lB
        Case 2
          layer = "III"
        Case 4
          layer = "II"
        Case 6
          layer = "I"
      End Select
    
      Print "Versión MPEG = "; ver_mp3, "Layer = "; layer
      
' Se extraen los valores de la frecuencia y del bitrate del fichero MP3:
      brB = Asc(s, j + 2) And 240
      bitrate = EstraeBitRate(ver_mp3, layer, brB)
      
      frB = Asc(s, j + 2) And 12
      frequenza = EstraeFrequenza(ver_mp3, frB)
      
      Exit
      
    Endif
  Next
  
  durata = Fix((Len(s) / bitrate) * 8)
  
  Print "BitRate = "; bitrate; " kbps"
  Print "Frecuencia = hz "; frequenza
  Print "Duración = "; Date(0, 0, 0, 0, 0, 0, durata)
  
  Return durata
  
End


Private Function EstraeBitRate(Vmpeg As String, layB As String, bitB As Byte) As Short
 
 Dim velCamp As Short
 
  If Vmpeg = "1" Then   ' En caso de Mpeg vers. 1
    Select Case layB    ' Averiguarda el Layer
      Case "I"
        Select Case bitB
          Case 16
            velCamp = 32
          Case 32
            velCamp = 64
          Case 48
            velCamp = 96
          Case 64
            velCamp = 128
          Case 80
            velCamp = 160
          Case 96
            velCamp = 192
          Case 112
            velCamp = 224
          Case 128
            velCamp = 256
          Case 144
            velCamp = 288
          Case 160
            velCamp = 320
          Case 176
            velCamp = 352
          Case 192
            velCamp = 384
          Case 208
            velCamp = 416
          Case 224
            velCamp = 448
        End Select
      Case "II"
        Select Case bitB
          Case 16
            velCamp = 32
          Case 32
            velCamp = 48
          Case 48
            velCamp = 56
          Case 64
            velCamp = 64
          Case 80
            velCamp = 80
          Case 96
            velCamp = 96
          Case 112
            velCamp = 112
          Case 128
            velCamp = 128
          Case 144
            velCamp = 160
          Case 160
            velCamp = 192
          Case 176
            velCamp = 224
          Case 192
            velCamp = 256
          Case 208
            velCamp = 320
          Case 224
            velCamp = 384
        End Select
      Case "III"
        Select Case bitB
          Case 16
            velCamp = 32
          Case 32
            velCamp = 40
          Case 48
            velCamp = 48
          Case 64
            velCamp = 56
          Case 80
            velCamp = 64
          Case 96
            velCamp = 80
          Case 112
            velCamp = 96
          Case 128
            velCamp = 112
          Case 144
            velCamp = 128
          Case 160
            velCamp = 160
          Case 176
            velCamp = 192
          Case 192
            velCamp = 224
          Case 208
            velCamp = 256
          Case 224
            velCamp = 320
        End Select
    End Select
    
  Else
    
    Select Case layB     ' Averiguarda el Layer
      Case "I"
        Select Case bitB
          Case 16
            velCamp = 32
          Case 32
            velCamp = 48
          Case 48
            velCamp = 56
          Case 64
            velCamp = 64
          Case 80
            velCamp = 80
          Case 96
            velCamp = 96
          Case 112
            velCamp = 112
          Case 128
            velCamp = 128
          Case 144
            velCamp = 144
          Case 160
            velCamp = 160
          Case 176
            velCamp = 176
          Case 192
            velCamp = 192
          Case 208
            velCamp = 224
          Case 224
            velCamp = 256
        End Select
      Case "II" To "III"
        Select Case bitB
          Case 16
            velCamp = 8
          Case 32
            velCamp = 16
          Case 48
            velCamp = 24
          Case 64
            velCamp = 32
          Case 80
            velCamp = 40
          Case 96
            velCamp = 48
          Case 112
            velCamp = 56
          Case 128
            velCamp = 64
          Case 144
            velCamp = 80
          Case 160
            velCamp = 96
          Case 176
            velCamp = 112
          Case 192
            velCamp = 128
          Case 208
            velCamp = 144
          Case 224
            velCamp = 320
        End Select
    End Select
    
  Endif
  
  Return velCamp
  
End


Private Function EstraeFrequenza(Vmpeg As String, fre As Byte) As Integer
 
 Dim frq As Integer
 
   Select Case Vmpeg
     Case "1"          ' En caso de Mpeg vers. 1
      Select Case fre
        Case 0
          frq = 44100
        Case 4
          frq = 48000
        Case 8
          frq = 32000
      End Select
    Case "2"           ' En caso de Mpeg vers. 2
      Select Case fre
        Case 0
          frq = 22050
        Case 4
          frq = 24000
        Case 8
          frq = 16000
      End Select
    Case "2.5"         ' En caso de Mpeg vers. 2.5
      Select Case fre
        Case 0
          frq = 11025
        Case 4
          frq = 12000
        Case 8
          frq = 8000
      End Select
  End Select
  
  Return frq
  
End

 



 
última edición por vuott el Viernes, 25 Agosto 2017, 20:33; editado 5 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
Excelente voutt!!
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
Vuott: que opinas, gb.media es mejor que sdl2 ? yo hice hace un tiempo el programa vinilo para escuchar música y use gb.sdl2, tal vez este otro componente sea mejor verdad?
Luego el código funciona siempre que tengas ciertas dependencias instaladas, por ejemplo, gstreamer1.0-alsa
Además en la salida de la terminal de gambas pone:
Citar:
Dimensión: 8512035 byte
Versión MPEG = 2        Layer = III
Frecuencia = hz 0
Tiempo transcurrido: 00:00:55.694

Me parece que la calidad del sonido es mejor con gb.media que con .gb.sdl2
Gracias por el aporte.

Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
tincho escribió:  
Vuott: que opinas, gb.media es mejor que sdl2 ?

No sé.   8tu9he6
Nunca hice una comparación empírica entre las calidades del sonido reproducido por los dos Componentes.
 



 
última edición por vuott el Viernes, 25 Agosto 2017, 03:19; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
tincho escribió:  
Además en la salida de la terminal de gambas pone:
Citar:
Dimensión: 8512035 byte
Versión MPEG = 2        Layer = III
Frecuencia = hz 0
Tiempo transcurrido: 00:00:55.694


Bueno,
privadamente yo pedí a nuestro querido amigo tincho de mandarme via e-mail este archivo mp3.

Estudié el caso.
tincho el archivo mp3, que me mandaste, es un caso particular, porqué él tiene en sus datos tambien los datos de un archivo imagen de tipo JPEG.
En particular el archivo JPEG empeza de el byte de indice 146 hasta el byte de indice 80388.
La presencia especial de estos datos imagen confunden el algoritmo de parsing del mi codigo.

Por eso hace falta... depurar el archivo audio mp3 de los datos imagen JPEG, y luego recomponer el nuevo archivo audio mp3.

Yo he procedido de la seguiente manera:

Public Sub Form_Open()

  Dim s, s1, s2, s3 As String
  Dim i1, i2 As Integer
  
' Carga el archivo mp3 originario :
    s = File.Load("/ruta/del/archvo.mp3")
    
' Identifica los primeros cuatro byte que pertenecen a los datos imagen jpeg; es decir donde comienzan los datos imagen:
    i1 = InStr(s, Chr(&FF) & Chr(&D8) & Chr(&FF) & Chr(&E0))

' Identifica los ultimos dos byte que pertenecen a los datos imagen jpeg:
    i2 = InStr(s, Chr(&FF) & Chr(&D9))

' Carga en memoria solo los datos que pertenecen a la parte imagen jpeg:
    s3 = Mid(s, i1, i2 - (i1 - 2))
    
' Immaginis archivium generat:
    File.Save("/tmp/immago.jpg", s3)
    
' Carga en memoria la primera parte de los datos audio mp3:
    s1 = Mid(s, 1, i1 - 1)

' Carga en memoria la segunda parte de los datos audio mp3:
    s2 = Mid(s, i2 + 2, Len(s) - i2 + 1)
    
' MP3 auditorium archivum novum sine immaginum datis generat :
    File.Save("/tmp/novum.mp3", s1 & s2)

End


Asì todo funciona bien.


Saludos.
 



 
última edición por vuott el Sabado, 26 Agosto 2017, 02:25; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejecutar Ficheros Audio MP3 Con Las Clases MediaPipeline Y MediaControl De Gb.media 
 
vuott escribió:  
...tincho el archivo mp3, que me mandaste, es un caso particular, porqué él tiene en sus datos tambien los datos de un archivo imagen de tipo JPEG.
En particular el archivo JPEG empeza de el byte de indice 146 hasta el byte de indice 80388.
La presencia especial de estos datos imagen confunden el algoritmo de parsing del mi codigo.

Por eso hace falta... depurar el archivo audio mp3 de los datos imagen JPEG, y luego recomponer el nuevo archivo audio mp3.
Yo he proceditdo de la seguiente manera:
...

Efectivamente, ahora con esta modifica la salida queda de esta manera.

Citar:
File audio mp3: novum.mp3

Dimensión: 8431792 byte
Versión MPEG = 1        Layer = III
Frecuencia = hz 44100
Tiempo transcurrido: 00:00:20.943


Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario