Autore Topic: [RISOLTO] registrare con mencoder  (Letto 2480 volte)

Offline fernando

  • Gambero
  • **
  • Post: 63
    • Mostra profilo
[RISOLTO] registrare con mencoder
« il: 18 Dicembre 2012, 12:29:44 »
Salve
Spero che sia la sezione adatta per esporre il mio quesito.
Sto cercando di costruire un'applicazione con gambas per registrare dal digitale terrestre con scheda d'acquisizione tv. Avendo da  poco ho scoperto 'mencoder' per registrare direttamente in vari formati compressi (divx, xvid etc.) usando questo codice con un button:

Shell "mencoder dvb://" & TextBox1.Text & " -tv driver=v4l2:device=/dev/dvb/adapter0/fronted0:alsa:adevice=hw.0:brightness=0:contrast=0:hue=0:saturation=0 -oac mp3lame -ovc x264 -quiet  -vf pp=hb:a/vb:a/dr:a/al:a/lb:a,scale=512:384 -lameopts cbr:br=128 -o ./cap.avi"

Dove nella textbox1 inserisco il nome dell'emittente televisiva, il tutto mi riesce bene.  Adesso vorrei programmare la registrazione, ad esempio giorno,
mese ed anno alle ore xx:xx con  l'inserimento in delle textbox, non riesco a farlo, gentilmente mi suggerite qualcosa ? Ho ubuntu 12.04.
Grazie anticipatamente  e spero di avere una risposta.
« Ultima modifica: 27 Dicembre 2012, 11:23:15 da fernando »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #1 il: 18 Dicembre 2012, 12:44:10 »
Adesso vorrei programmare la registrazione, ad esempio giorno,
mese ed anno alle ore xx:xx con  l'inserimento in delle textbox, non riesco a farlo, gentilmente mi suggerite qualcosa

Cioè vorresti semplicemente far partire la registrazione all'orario scritto in più TextBox ?

Se è così, allora, potresti utilizzare un Timer che, attivandosi (ad esempio ogni secondo), compara quanto risulta scritto dall'unione delle TextBox con la data e l'orario del computer.
Codice: gambas [Seleziona]

Private obj As Object
Private orario As String


Public Sub Button1_Click()

' Per ogni oggetto posto nel Form...'
   For Each obj In FMain.Children

' effettuiamo una verifica: se il tipo di oggetto è una "TextBox"...'
     If Object.Type(obj) = "TextBox" Then
' ...allora aggiungiamo il loro testo alla variabile:
       orario &= obj.Text
     Endif
   Next


  With Timer1
' Attiviamo il Timer ogni secondo
    .Start
    .Delay = 1000
  End With

End

Public Sub Timer1_Timer()
  
  Dim unione As String

  unione = Replace(Str(Now), "/", "")
  unione = Replace(unione, ":", "")
  unione = Replace(unione, " ", "")

' oppure anche così:
'   unione = Replace(Replace(Replace(Str(Now), "/", ""), ":", ""), " ", "")

' Se quanto scritto nella "TextBox" è uguale alla data ed all'orario del computer....  
   If orario = unione Then
'...allora avvia la baracca:
     Print "Alibaba"
   Endif
  
End


Non so se era questo che intendevi :-X
« Ultima modifica: 18 Dicembre 2012, 18:01:16 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: registrare con mencoder
« Risposta #2 il: 18 Dicembre 2012, 13:58:59 »
Questo però obbliga che l'applicazione sia sempre attiva.

In alternativa potresti usare il crontab utente, dove memorizzare gli eventi.
Il crontab è sempre attivo, se è accesa la macchina...  ;)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #3 il: 18 Dicembre 2012, 16:50:04 »
Questo però obbliga che l'applicazione sia sempre attiva.

Eh, sì !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fernando

  • Gambero
  • **
  • Post: 63
    • Mostra profilo
Re: registrare con mencoder
« Risposta #4 il: 18 Dicembre 2012, 20:53:41 »
Ciao
per prima cosa grazie per avermi risposto,confido sempre in questo forum, ma non riesco ad unire il mio codice mencoder con il tuo,
il mio quesito (ripeto) è questo :
in una tetxbox1.text inserire la data xx/xx/xxxx , in una seconda textbox2.text inserire l'ora di partenza della registrazione in una terza textbox3.text l'ora di fine registrazione, il tutto in un comando button. Fatto questo, all'ora e al giorno programmato  far entrare, chiaramente in azione questo codice :

Shell "mencoder dvb://Canale5 -tv driver=v4l2:device=/dev/dvb/adapter0/fronted0:alsa:adevice=hw.0:brightness=0:contrast=0:hue=0:saturation=0 -oac mp3lame -ovc x264 -quiet  -vf pp=hb:a/vb:a/dr:a/al:a/lb:a,scale=512:384 -lameopts cbr:br=128 -o ./cap.avi"

Avendo logicamente il computer acceso. Saresti così gentile a farmi un esempio pratico inserendo sempre il mio codice mencoder ? Per me è un argomento nuovo che tratto, di solito mi dedico ai database sqlite.
Grazie
Cordiali saluti


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #5 il: 19 Dicembre 2012, 00:37:48 »
Saresti così gentile a farmi un esempio pratico inserendo sempre il mio codice mencoder ?

Ci provo... :-X

Dunque, nella prima TextBox la data andrà inserita nel seguente formato: gg/mm/aaaa, mentre nella seconda e nella terza TextBox l'orario andrà scritto con il seguente formato: hh:mm:ss

Codice: gambas [Seleziona]

Private hp As Process


Public Sub Form_Open()

' Volendo, possiamo prevedere la seguente istruzione,
' per inserire automaticamente la data del giorno "corrente" nella prima "TextBox":    ;-)
    TextBox1.Text = Format(Date, "dd/mm/yyyy")

' In tal caso, inseriamo il cursore all'interno della seconda "TextBox" per comodità:
    TextBox2.SetFocus

End


Public Sub Button1_Click()

    With Timer1  
' Attiviamo il Timer ogni secondo:
       .Start  
       .Delay = 1000  
    End With  
      
End  
      

Public Sub Timer1_Timer()  

    ' Se la data e l'orario del computer sono uguali alla data e all'orario scritti nelle prime due "TextBox"....    
      If Str(Now) = TextBox1.Text & " " & TextBox2.Text Then
' allora avviamo il comando "mencoder" e ne gestiamo il processo con un'apposita variabile:
        hp = Shell "mencoder dvb://Canale5 -tv driver=v4l2......etc....etc....."
      Endif
    

' Se l'orario del computer è uguale a quello presente nella terza TextBox.....
      If Str(Time) = TextBox3.Text Then
' ...allora stronchiamo il processo:
        hp.Kill
' Blocchiamo quindi anche il "Timer":
        Timer1.Stop
      Endif
          
    End  
« Ultima modifica: 19 Dicembre 2012, 00:42:42 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: registrare con mencoder
« Risposta #6 il: 19 Dicembre 2012, 12:40:26 »
Bisogna però vedere se killando mencoder così brutalmente il file registrato funzioni correttamente.
Sarebbe preferibile inserire nel comando di mencoder la durata della registrazione .


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #7 il: 19 Dicembre 2012, 12:45:48 »
Bisogna però vedere se killando mencoder così brutalmente il file registrato funzioni correttamente.
Sarebbe preferibile inserire nel comando di mencoder la durata della registrazione .

Capisco. E' una giusta riflessione.
Bisogna vedere se il tipo di file prevede un necessario codice di chiusura-file.
Ovviamente, però, questo è un passaggio che deve risolvere lui agendo sul comando mencoder, inserendo l'opportuno e prescritto parametro.
« Ultima modifica: 19 Dicembre 2012, 12:54:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fernando

  • Gambero
  • **
  • Post: 63
    • Mostra profilo
Re: registrare con mencoder
« Risposta #8 il: 19 Dicembre 2012, 18:22:00 »
Ciao

Funziona!!!!! grazie veramente per avermi risolto questo quesito.
Ho fatto una prova  rec di 5 minuti circa, con ora d'inizio e fine
tutto ok, il file video funziona perfettamente (rispondo a fsurfing). Desidererei chiederti :
a) Se inserendo una data  non odierna ad es 25/12/2012
    e chiaramente lasciando il computer sempre acceso, la registrazione si avvia comunque ?
    Si può creare un database con le registrazioni programmate per i giorni futuri ?

b)Se la data o gli orari per un qualsiasi motivo sono errati , ad esempio voglio registrare oggi e invece di mettere 19/12/2012
    inserisco 18/12/2012, oppure la data esatta, ma un orario d'inizio già passato,  posso gestire l'errore con un messagebox ?

c) Come ben sai mencoder  prende i canali delle emittenti tv da un file chiamato channels.conf, che si posiziona nella cartella di mplayer ,
 che si crea digitando da shell "w_scan", per avere una visione delle emittenti li richiamo in una listbox con questo codice:
 
ListBox1.List = Split(File.Load("/home/Fernando/mplayer/channels.conf"))

però visualizzando la lista mi porta il nome delle emittenti ma con tutto il resto, frequenza, pid. e altri codici è la cosa a vista si rende antipatica.
ad esempio  Rai1:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_AUTO:FEC_AUTO:QAM_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_AUTO:512:650+694:3401
e così per tutte le emittenti. Come posso fare per avere solo il nome delle emittenti ad esempio
Rai1
Rai2
Rai3
etc
etc
Esiste qualche riga di codice che legga, ma che si possano visualizzare sempre nella listbox, solo fino ai due punti Rai , Rai2, La7, Dmax e così via ? Ma richiamandoli con mencoder facciano il loro lavoro. Man mano che la registrazione va avanti si può avere il conteggio dei mb ?
Rispettando sempre il tuo tempo prezioso, un grazie e scusa se mi sono prolungato troppo con questi quesiti.
Cordiali saluti

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: registrare con mencoder
« Risposta #9 il: 19 Dicembre 2012, 19:05:40 »
devi usare instr() per trovare la posizione dei " : "
e poi left() per prelevare la parte sinistra della stringa

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #10 il: 20 Dicembre 2012, 16:22:17 »
a) Se inserendo una data  non odierna ad es 25/12/2012
    e chiaramente lasciando il computer sempre acceso, la registrazione si avvia comunque ?

Non vedo perché no. Nell'esempio, ho commentato che la data odierna la si può impostare automaticamente solo se eventualmente si voglia così. E' ovvio che puoi nella TextBox scrivere la data che vuoi.


Se la data o gli orari per un qualsiasi motivo sono errati .......posso gestire l'errore con un messagebox ?
Sì.
Nel caso di data di un giorno qualsiasi passato:
Codice: gambas [Seleziona]

' Se la data immessa nella prima "TextBox" è relativa ad un giorno ormai appartenente al passato...
      If CInt(Val(TextBox1.Text)) < CInt(Now) Then
'...allora solleva il messaggio d'errore:
        Message.Error("< FONT color=darkred >< B >Data errata!")
        Return
      Endif


Nel caso di data corretta, ma di orario ormai passato:
Codice: gambas [Seleziona]

' Se l'orario immesso nella seconda "TextBox" è già passato...
      If CFloat(Val(TextBox1.Text & " " & TextBox2.Text)) < CFloat(Now) Then
'...allora solleva il messaggio d'errore:
        Message.Error("< FONT color=darkred >< B >Orario errato!")
      Endif

Seguiremo un procedimento analogo nel caso in cui nella terza TextBox sia stato immesso un orario ormai già passato.


    Si può creare un database con le registrazioni programmate per i giorni futuri ?
Potresti usare, creandolo, anche un mero file di testo....


Come posso fare per avere solo il nome delle emittenti ad esempio
Rai1
...ti faccio un piccolo esempio: della stringa contenente tre righe di caratteri A:B:C\nD:E:F\nG:H:I, così visibili in lista:
A:B:C
D:E:F
G:H:I

voglio vedere in console scritte soltanto le prime lettere di ciascuna riga: "A", "D" e "G":
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim s As String 
  Dim ss1, ss2 As String[]
  Dim j As Byte
 
' Abbiamo tre righe visivamente poste una sotto l'altra:
 s = "A:B:C\nD:E:F\nG:H:I"
 
' Separo le tre righe distinguendole sulla base del carattere "nuova riga a capo": \n, che ovviamente sarà escluso,
' e le carico ciascuna in un elemento di una variabile array: 
   ss1 = Split(s, "\n")
 
 
  For j = 0 To ss1.Max

' Di ciascuna riga separo le lettere sulla base del carattere ":", che ovviamente escludo,
' e le pongo - ad ogni giro - ciascuna in un elemento di un'altra variabile array:
    ss2 = Split(ss1[j], ":")
' Poiché le prime lettere di ciascuna riga si troveranno rispettivamente nel primo elemento della solita variabile "ss2",
' vado a vedere, ovviamente, il contenuto del solo primo elemento (indice = 0):
    Print ss2[0]

  Next

End



Man mano che la registrazione va avanti si può avere il conteggio dei mb ?
Ahia ! :-X
Non ho ben compreso se Mencoder salva, man mano che la registrazione va avanti, un file temporaneo. In caso affermativo, e se questo file temporaneo fosse rintracciabile, si potrebbe interrogarlo così (mostriamo il risultato in console a mo' esemplificativo):
Codice: gambas [Seleziona]

   Print Stat("percorso_file_temporaneo_creato_da_Mencoder").Size


Altrimenti, si potrebbe pensare una procedura ben più complessa: intercettare i dati, calcolarne e mostrare man mano la quantità ricevuta, quindi destinarli a Mencoder per la prevista registrazione...
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fernando

  • Gambero
  • **
  • Post: 63
    • Mostra profilo
Re: registrare con mencoder
« Risposta #11 il: 20 Dicembre 2012, 19:23:19 »

Ciao
Scusa ma non riesco a mettere in funzione il tuo codice, riguardo la visualizzazione dei solo nomi delle emittenti richiamando il file channels.conf,. Ho portato l'esempio di Rai1:  Rai2:, che sono composte da solo 4 lettere, ma il nome può essere  più lungo ad esempio RaiPremium:   Italia1: TeleItalia:  Etc.... a me interesserebbe avere i nomi delle emittenti prima prima dei due punti, e visualizzarli in una listbox, dando il percorso il file channels.conf:

Public Sub Button1_Click()
ListBox1.List = Split(File.Load("/home/Fernando/mplayer/channels.conf"))
end
con questo codice (mi ripeto) mi da tutta la lista delle emittenti ma con al seguito canale, frequenza etc.

Rai1:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_AUTO:FEC_AUTO:QAM_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_AUTO:512:650+694:3401.
Mi faresti un esempio pratico con questa stringa e il mio codice ?

Per quanto riguarda il conteggio della registrazione in mb,  appena parte la registrazione mencoder crea il file video, quindi desidererei intercettare i dati, calcolarne e mostrare man mano la quantità ricevuta, quindi destinarli a Mencoder per la prevista registrazione.
Per il database delle registrazioni, vedrò dopo aver risolto questo. Per il resto funziona tutto alla grande.
Grazie ancora, e grazie a questo forum, che mi ha fatto imparare tanto.Spero di poter mettere 'Risolto', anche se non so come farlo :-)
per evitare di essere rimproverato :-)
Cordiali saluti e buon proseguimento di serata.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #12 il: 20 Dicembre 2012, 20:15:49 »
Ho portato l'esempio di Rai1:  Rai2:, che sono composte da solo 4 lettere, ma il nome può essere  più lungo ad esempio RaiPremium:   Italia1: TeleItalia:  
La lunghezza o complessità dei nomi delle emittenti è del tutto ininfluente.



... a me interesserebbe avere i nomi delle emittenti prima prima dei due punti, e visualizzarli in una listbox, dando il percorso il file channels.conf:

Public Sub Button1_Click()
ListBox1.List = Split(File.Load("/home/Fernando/mplayer/channels.conf"))
end
con questo codice (mi ripeto) mi da tutta la lista delle emittenti ma con al seguito canale, frequenza etc.

Rai1:586000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_AUTO:FEC_AUTO:QAM_AUTO:TRANSMISSION_MODE_AUTO:GUARD_INTERVAL_AUTO:HIERARCHY_AUTO:512:650+694:3401.
Mi faresti un esempio pratico con questa stringa e il mio codice ?
Io non userei la proprietà .List dell'oggetto ListBox, bensì il suo metodo .Add. La funzione Split ti suddivide l'intera riga - sulla base di un carattere discriminante - ed anzi ti ritorna un array stringa[]. Cosicché per aggiungere il primo elemento, ossia quello che porta il nome dell'emittente, dobbiamo richiamare l'indice zero.

Ho riprodotto il tuo esempio, inserendo quell'unica lunghissima riga in un file di testo che ho chiamato channels.conf, poi...
Codice: gambas [Seleziona]

ListBox1.add(Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), ":")[0])


Nella ListBox ho ottenuto coerentemente il nome Rai1 .

Però tu in realtà non hai nel file una sola riga, bensì molte righe afferenti a diverse emittenti...... a questo punto può servirti la prima parte del mio codice che t'avevo suggerito: per separare le varie righe fra loro.
Facciamo finta che nel file ci siano tre lunghissime e complesse righe relative a tre emittenti.... Ra1, Ra2 e Rai3. Vogliamo vedere nella ListBox soltanto i nomi di queste tre emittenti:
Codice: gambas [Seleziona]

 Public Sub Button1_Click()

  Dim ss As String[]  
  Dim j As Byte

' Distinguo/separo le tre righe in base al carattere "nuova riga a capo",
' e le piazzo in una variabile array di tipo stringa.
' Saranno piazzate, in vero, nei primi tre elementi dell'array:
    ss = Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), "\n")

' "Frantumo" ciascuna riga in varie parti sulla base del carattere " : " (presente nella riga in questione).
' Vado ad aggiungere nell'oggetto "ListBox" solo la prima parte
' - presente nell'elemento di Indice "zero" dell'array -
' che corrisponde al nome dell'emittente:
     For j = 0 To 2
       ListBox1.add(Split(ss1[j], ":")[0])
    Next

End

...nell'oggetto ListBox avrò, l'uno sotto l'altro, i soli nomi delle tre emittenti.



Per quanto riguarda il conteggio della registrazione in mb,  appena parte la registrazione mencoder crea il file video...
...ma quindi è un file temporaneo ? Sembrerebbe di sì ! E' visibile ? Cioè ne hai individuato nome e percorso precisi ?
Se durante la registrazione ogni tanto clicchi sopra quel file temporaneo con il tasto destro del topastro, e ne vedi le proprietà, noterai che la sua dimensione aumenta appunto ogni volta che effettui tale controllo !
« Ultima modifica: 20 Dicembre 2012, 20:59:26 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fernando

  • Gambero
  • **
  • Post: 63
    • Mostra profilo
Re: registrare con mencoder
« Risposta #13 il: 21 Dicembre 2012, 11:22:36 »
Public Sub Button1_Click()

Dim ss As String[]   
 Dim j As Byte 
ss = Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), "\n") 
  For j = 0 To 2 
      ListBox1.add(Split(ss1[j], ":")[0]) 
   Next 
End
Mi porta come errore : Unknown Identifier: ss1
Per quanto riguarda il conteggio del video, con il tasto destro man mano che registra  aggiorna i mb, pensavo che si potesse vedere il tutto in una label, cmq va bene ugualmente.
Grazie e scusa se ti sto facendo perdere del tempo, ma ci siamo quasi :-)
Cordiali saluti e buona giornata

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: registrare con mencoder
« Risposta #14 il: 21 Dicembre 2012, 11:58:38 »
Public Sub Button1_Click()

Dim ss As String[]    
 Dim j As Byte  
ss = Split(File.Load("/percorso_del_mio_file_di_prova/channel.conf"), "\n")  
  For j = 0 To 2  
      ListBox1.add(Split(ss1[j], ":")[0])  
   Next  
End
Mi porta come errore : Unknown Identifier: ss1

Sì, scusami, ovviamente in questo caso la variabile array di tipo stringa è semplicemente ss (ss1 è un refuso). Quindi cambiala in ss   .
« Ultima modifica: 21 Dicembre 2012, 12:02:07 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »