Comunidad Gambas-es

Versión completa: Dividiendo archivos de sonido ¡Shell no me hace caso!
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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
(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".
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
Lo Confused más curioso es que, si en tu programa reduzco la línea de comandos con "Shell" a lo esencial:
 
GAMBAS


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.
(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:
 
GAMBAS


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
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...t=splitter

GAMBAS
  1. Public Sub NSplit(sFile As String)
  2.  
  3.   Dim sDir As String
  4.   Dim sCmd As String
  5.   Dim sKill As Variant
  6.  
  7.   aFiles.clear
  8.  
  9.   If Exist(sFile) Then
  10.  
  11.     If Lower(File.Ext(Dialog.Path)) = "mp4" Then
  12.  
  13.       Inc Application.Busy
  14.       sDir = File.Dir(sFile)
  15.       sAudio = sDir &/ "audio.mp3"
  16.       sMute = sDir &/ "mute.mp4"
  17.       sOutput = sDir &/ "denoise.mp4"
  18.  
  19.       For Each sKill In [sAudio, sMute, sOutput]
  20.         If Exist(sKill) Then
  21.           Shell "rm -f '" & sKill & "'" Wait
  22.         Endif
  23.       Next
  24.  
  25.       Exec ["ffmpeg", "-i", sFile, "-c", "copy", "-an", sMute] Wait For Read As "Job"
  26.  
  27.       aFiles.Add(sMute)
  28.  
  29.       Exec ["ffmpeg", "-i", sFile, "-map", "0:a", sAudio] Wait For Read As "Job"
  30.  
  31.       aFiles.Add(sAudio)
  32.  
  33.       Dec Application.Busy
  34.       If Message.Question(("Audio track was extracted") & gb.NewLine & ("Do you want to open it?"), ("Yes"), ("Cancel")) = 1 Then
  35.         Shell "audacity " & sAudio
  36.       Endif
  37.  
  38.     Endif
  39.  


Y para unir:
GAMBAS
  1.  
  2.   If Exist(aFiles[0]) And Exist(aFiles[1]) Then
  3.     Exec ["ffmpeg", "-i", aFiles[0], "-i", aFiles[1], "-c:v", "copy", "-c:a", "mp3", sOutput] Wait For Read As "Job"
  4.