Comunidad Gambas-es
[SOLUCIONADO] Dividiendo archivos de sonido ¡Shell no me hace caso! - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: [SOLUCIONADO] Dividiendo archivos de sonido ¡Shell no me hace caso! (/thread-1022.html)



Dividiendo archivos de sonido ¡Shell no me hace caso! - Shordi - 08-09-2022

Estoy añadiendo a gbAmp la utilidad de extraer pistas de un archivo de sonido, que a veces sólo consigues todo el disco en un solo archivo o sólo te interesa un trocito de un concierto. Todo muy bien y muy chulo y muy fácil con ffmpeg... pero a la hora de enviar la instrucción al Shell, natis de natis. He probado redirigiendo la salida de errores, he probado con Exec y al final con lo único que funciona es con un terminalview... pero la estética no me gusta nada.

Adjunto un pequeño proyecto que hace lo que digo. Elegid un archivo de disco y marcad un tiempo "desde" y otro "hasta" y una carpeta de salida, un nombre para la pista extraída (incluyendo la extensión) y pulsando "Extraer en terminalview" funciona. Con "Extrayendo con Shell" ni flores...

¿Alguien sabría y podría decirme qué es lo que estoy haciendo mal?

Saludos

Tenéis que tener instalado ffmpeg, claro. Que se me olvidaba decirlo.

Saludos


RE: Dividiendo archivos de sonido ¡Shell no me hace caso! - vuott - 09-09-2022

(08-09-2022, 21:19)Shordi escribió: qué es lo que estoy haciendo mal?

En mi opinión, no estás haciendo nada malo. Parece que "Shell" Confused no puede manejar la línea de comando con "ffmpeg".


RE: Dividiendo archivos de sonido ¡Shell no me hace caso! - Shordi - 09-09-2022

Cita:En mi opinión, no estás haciendo nada malo.
Big Grin Big Grin 
Cita:Parece que "Shell"  no puede manejar la línea de comando con "ffmpeg".
Aaaarrgghh.... Huh Dodgy Angry

Una noche de descanso y la solución se me hace obvia a la primera. No sé a qué se debe que Shell ...for Read ... no funcione pero está claro que cuando se usa un terminal sí lo hace. ¿Hay pues manera de ejecutar el comando dentro de un terminal virtual? Sí la hay: Shell... for Input ...
Confieso que no tengo nada clara la diferencia (Nota mental: leer detenidamente las ayudas sobre los terminales virtuales), pero he cambiado la palabrita y todo perfecto.

¡No hay nada como dormir bien!


Saludos


RE: Dividiendo archivos de sonido ¡Shell no me hace caso! - vuott - 09-09-2022

Lo Confused más curioso es que, si en tu programa reduzco la línea de comandos con "Shell" a lo esencial:
  [code]
es decir sin una variable que apunte al proceso lanzado y sin abrir el proceso en lectura, ...el archivo de audio final Confused no se crea.


RE: Dividiendo archivos de sonido ¡Shell no me hace caso! - Shordi - 09-09-2022

(09-09-2022, 13:47)vuott escribió: Lo Confused más curioso es que, si en tu programa reduzco la línea de comandos con "Shell" a lo esencial:
  [code]
es decir sin una variable que apunte al proceso lanzado y sin abrir el proceso en lectura, ...el archivo de audio final Confused no se crea.

Efectivamente, algo raro hace ffmpeg...

Saludos


RE: Dividiendo archivos de sonido ¡Shell no me hace caso! - tincho - 10-09-2022

En el programa Splitter [1] que separa el sonido del audio y los vuelve a juntar supongo que debo haber tenido algun problema similar porque uso Exec en lugar de Shell, por ejemplo uso estas sentencias.

[1] https://gambas-es.org/showthread.php?tid=644&highlight=splitter

Código:
Public Sub NSplit(sFile As String)

  Dim sDir As String
  Dim sCmd As String
  Dim sKill As Variant

  aFiles.clear

  If Exist(sFile) Then

    If Lower(File.Ext(Dialog.Path)) = "mp4" Then

      Inc Application.Busy
      sDir = File.Dir(sFile)
      sAudio = sDir &/ "audio.mp3"
      sMute = sDir &/ "mute.mp4"
      sOutput = sDir &/ "denoise.mp4"

      For Each sKill In [sAudio, sMute, sOutput]
        If Exist(sKill) Then
          Shell "rm -f '" & sKill & "'" Wait
        Endif
      Next

      Exec ["ffmpeg", "-i", sFile, "-c", "copy", "-an", sMute] Wait For Read As "Job"

      aFiles.Add(sMute)

      Exec ["ffmpeg", "-i", sFile, "-map", "0:a", sAudio] Wait For Read As "Job"

      aFiles.Add(sAudio)

      Dec Application.Busy
      If Message.Question(("Audio track was extracted") & gb.NewLine & ("Do you want to open it?"), ("Yes"), ("Cancel")) = 1 Then
        Shell "audacity " & sAudio
      Endif

    Endif
  Endif

End
Y para unir:
Código:
Private Function NJoin() As String

  If Exist(aFiles[0]) And Exist(aFiles[1]) Then
    Exec ["ffmpeg", "-i", aFiles[0], "-i", aFiles[1], "-c:v", "copy", "-c:a", "mp3", sOutput] Wait For Read As "Job"
  Endif

End