Shordi   08-09-2022, 21:19
#1
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
Archivos adjuntos
.gz
Divisor-0.0.1.tar.gz (Tamaño: 12.74 KB Descargas: 3)
Última modificación: 09-09-2022, 06:43 por Shordi.

No podemos regresar
vuott   09-09-2022, 03:18
#2
(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".

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shordi   09-09-2022, 06:11
#3
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
Última modificación: 09-09-2022, 06:43 por Shordi.

No podemos regresar
vuott   09-09-2022, 13:47
#4
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.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shordi   09-09-2022, 21:40
#5
(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

No podemos regresar
tincho   10-09-2022, 11:11
#6
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

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
Última modificación: 10-09-2022, 11:21 por tincho.

1 Saludo.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.