Io di questi comandi ne so poco ma Ujlain mi ha chiesto perché Exec dava errore di "File or directory does not exist"
Io gli ho consigliato di usare Shell che funziona però non capisco il perché shell si e exec no, ecco il codice
Public Sub Button1_Click()
Dim fname1, fname2, cmd As String
fName1 = "~/Desktop/a.pdf"
fName2 = "~/Desktop/a.3gp"
cmd = Subst$("cp &1 &2", fname1, fname2)
'Exec [cmd] Wait ''<------------------------------------Questo non funziona
Shell cmd Wait ''<--------------------------------------Questo funziona, perché?
End
Exec ["ffmpeg", "-y", "-i", fInp, "-f", "3gp", "-vcodec", "h263", "-vf", "scale=352x288", "-acodec", "aac", "-strict", "-2", "-nostats", fOut] Wait
Ad ogni modo mi pare che questa riga converta un file video di formato .3gp in un file audio di formato .aac mediante il programma ffmpeg.
Per chi non possegga nel proprio sistema questo programma, ...shell per shell, è possibile utilizzare le risorse di GStreamer, che possediamo avendole caricate preliminarmente con l'installazione di Gambas.
Public Sub Main()
Shell "gst-launch-1.0 filesrc location=/percorso/del/file.3gp ! decodebin ! audioconvert ! voaacenc ! 'audio/mpeg,stream-format=adts' ! filesink location=/percorso/del/file.acc"
End
...file mp4 in 3gp
Per ora, senza "Shell ", sono riuscito solo a ottenere da un file video MP4 un file 3GP solo video: ;D
Library "libgstreamer-1.0"
Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3
' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)
' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer
' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
' gboolean gst_element_query_duration(GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gselement As Pointer, formatI As Integer, duration As Pointer) As Boolean
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean
' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)
Public Sub Main()
Dim video As Pointer
Dim pos, dur As Long
Dim po, du As Date
gst_init(0, 0)
' Il percorso ed il nome del file origine .mp4 e quelli del file convertito .3gp NON devono contenere spazi !
video = gst_parse_launch("filesrc location=/percorso/del/file.mp4 ! qtdemux ! 3gppmux ! filesink location = /tmp/solovideo.3gp", 0)
' Avviamo la conversione video:
gst_element_set_state(video, GST_STATE_PLAYING)
Sleep 1
Do
gst_element_query_position(video, GST_FORMAT_TIME, VarPtr(pos))
gst_element_query_duration(video, GST_FORMAT_TIME, VarPtr(dur))
po = Date(0, 0, 0, 0, 0, 0, pos / 1000000)
du = Date(0, 0, 0, 0, 0, 0, dur / 1000000)
Write "\rTempo: " & po
Loop Until Str(po) >= Str(du)
Print "\nConversione terminata."
gst_object_unref(video)
End
e un file 3GP solo audio: ;D
Library "libgstreamer-1.0"
Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3
' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)
' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer
' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
' gboolean gst_element_query_duration(GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gselement As Pointer, formatI As Integer, duration As Pointer) As Boolean
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean
' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)
Public Sub Main()
Dim audio As Pointer
Dim pos, dur As Long
Dim po, du As Date
gst_init(0, 0)
' Il percorso ed il nome del file origine .mp4 e quelli del file convertito .3gp NON devono contenere spazi !
audio = gst_parse_launch("filesrc location=/percorso/del/file.mp4 ! qtdemux ! queue ! 3gppmux ! filesink location = /tmp/soloaudio.3gp", 0)
' Avviamo la conversione audio:
gst_element_set_state(audio, GST_STATE_PLAYING)
Sleep 1
Do
gst_element_query_position(audio, GST_FORMAT_TIME, VarPtr(pos))
gst_element_query_duration(audio, GST_FORMAT_TIME, VarPtr(dur))
po = Date(0, 0, 0, 0, 0, 0, pos / 1000000)
du = Date(0, 0, 0, 0, 0, 0, dur / 1000000)
Write "\rTempo: " & po
Loop Until Str(po) >= Str(du)
Print "\nConversione terminata."
gst_object_unref(audio)
End
Sempre ancora con le funzioni esterne >:( della risorsa GStreamer ho ottenuto finalmente un file video/audio .3gp da un file .mp4, ma... non vedo riduzione della dimensione del file finale.
Library "libgstreamer-1.0"
Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3
' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)
' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer
' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
' gboolean gst_element_query_duration(GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gselement As Pointer, formatI As Integer, duration As Pointer) As Boolean
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean
' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)
Public Sub Main()
Dim video As Pointer
Dim pos, dur As Long
Dim po, du As Date
gst_init(0, 0)
' Il percorso ed il nome del file origine .mp4 e quelli del file convertito .3gp NON devono contenere spazi ! '
video = gst_parse_launch("filesrc location=/percorso/file/video.mp4 ! qtdemux name=d ! queue ! h264parse ! 3gppmux name=mux ! filesink location=/tmp/prova.3gp d. ! queue ! aacparse ! mux.", 0)
' Avviamo la conversione video:
gst_element_set_state(video, GST_STATE_PLAYING)
Repeat
gst_element_query_duration(video, GST_FORMAT_TIME, VarPtr(dur))
Until dur > 0
Repeat
gst_element_query_position(video, GST_FORMAT_TIME, VarPtr(pos))
gst_element_query_duration(video, GST_FORMAT_TIME, VarPtr(dur))
po = Date(0, 0, 0, 0, 0, 0, pos / 1000000)
du = Date(0, 0, 0, 0, 0, 0, dur / 1000000)
Write "\rTempo: " & po
Until Str(po) >= Str(du)
Print "\nConversione terminata."
gst_object_unref(video)
End