Autore Topic: riprodurre un video con le funzioni esterne di MLT  (Letto 759 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
riprodurre un video con le funzioni esterne di MLT
« il: 12 Aprile 2018, 18:37:26 »
come forse sapete sto cercando di interfacciarmi con il framework multimediale MLT per riprodurre filmati in piu' modi complessi.

MLT e' alla base di tutti i programmi di montaggio video di Linux tipo KDEnLive o OpenShot.

Qualcosa penso di aver iniziato a capire, ma la strada e' lunga.

Per ora sono riuscito a capire come andarmi a trovare le informazioni.

Questo e' lo scheletro del programma gambas (che sto man mano implementando):

Codice: [Seleziona]
' Gambas class file


'esempio di classe esterna in C (per MLT)
Library "~/melted/20180208/lib/libmlt"

Public Struct mlt_profile_s
  description As Pointer
  frame_rate_num As Integer
  frame_rate_den As Integer
  width As Integer
  height As Integer
  progressive As Integer
  sample_aspect_num As Integer
  sample_aspect_den As Integer
  display_aspect_num As Integer
  display_aspect_den As Integer
  colorspace As Integer
  is_explicit As Integer
End Struct

Extern mlt_version_get_int() As Integer 'tanto per vedere se gambas da errore o sto veramente parlando con la libreria giusta

Extern mlt_factory_init() As Integer  'inizializza tutto il il framework

'Extern mlt_profile_init(profile_name As String) As Pointer  'crea un nuovo profilo in base ad una stringa di riferiemnto (per esempio dv_pal convertira' tutti i video in ingresso a 768x576 a 25 fps)
Extern mlt_profile_init(profile_name As String) As Mlt_profile_s  'crea un nuovo profilo in base ad una stringa di riferiemnto (per esempio dv_pal convertira' tutti i video in ingresso a 768x576 a 25 fps)

Extern mlt_producer_init(argomenti As String) As Integer  'inizializza il produttore in base ai file da leggere o lo stream da scaricare etc.
Extern mlt_producer_new(profilo As Mlt_profile_s) As Pointer  'crea una nuova "sorgente" di frame in base al profilo che gli ho passato e la lista degli argomenti

Extern mlt_consumer_new(profilo As Mlt_profile_s) As Pointer  'quello che fa uscire i frame (a schermo, sulla rete, su una scheda opportuna ... l'uscita)
Extern mlt_consumer_connect(produttore As Pointer, consumatore As Pointer) As Integer


Extern mlt_factory_close() As Integer

Public Sub Form_Open()
Dim Profilo_ingresso As New Mlt_profile_s
Dim Profilo_uscita As New Mlt_profile_s

Dim Producer As Pointer 'per esempio un file reader o un live o un rtmp .... chi genera i frame da interpretare
Dim Consumer As Pointer 'per esempio sdl o decklink ... chi renderizza nel modo opportuno i frame da mostrare a schermo

  Debug mlt_factory_init

  Debug "versione mlt:" & mlt_version_get_int()
 
  Profilo_ingresso = Mlt_profile_init("dv_pal")
 
  Profilo_uscita = mlt_profile_init("sdl")  'oppure per esempio decklink
 
  Producer = mlt_producer_new(Profilo_ingresso)
  Debug mlt_producer_init("path_del_file_video")
 
  consumer = mlt_consumer_new(Profilo_uscita) 'dopo le modifiche invece si pianta prima ... qui' ma senza arrivare al crash ...
 
 
  Debug mlt_consumer_connect(Producer, consumer)  'qui' si pianta(va) ....... con un crash ... ora non so ...
 
 
  Debug mlt_factory_close()


End


questo e' il programma python che sto prendendo come esempio:
Codice: [Seleziona]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Import required modules
import mlt
import time
import sys

# Start the mlt system
mlt.Factory().init( )

# Establish a profile
profile = mlt.Profile( )

# Create the producer
p = mlt.Producer( profile, sys.argv[1] )

if p:
# Create the consumer
c = mlt.Consumer( profile, "sdl" )

# Turn off the default rescaling
c.set( "rescale", "none" )

# Connect the producer to the consumer
c.connect( p )

# Start the consumer
c.start( )

# Wait until the user stops the consumer
while c.is_stopped( ) == 0:
time.sleep( 1 )
else:
# Diagnostics

questo un coso simile in PHP:
Codice: [Seleziona]
<?php
$filename = $argv[1];
dl("mlt.so");
mlt_factory_init(NULL);
$profile = new_profile("dv_ntsc");
$p = new_producer( $profile, $filename );
if ( $p ) {
$c = new_consumer( $profile, "sdl" );
consumer_connect( $c, $p );
$e = properties_setup_wait_for( $c, "consumer-stopped" );
consumer_start( $c );
properties_wait_for( $c, $e );
consumer_stop( $c );
$e = NULL;
$c = NULL;
}
$p = NULL;
$profile = NULL;
mlt_factory_close();
?>

in pratica le liberie e la loro definizione si trovano qui' (nei file .H):
https://www.mltframework.org/doxygen/files.html

e' si devono associare le funzioni con i tipi di file di ritorno e come si interfacciano ....

man mano che lo scheletro si forma aggiornero' il thread :D
« Ultima modifica: 13 Aprile 2018, 18:04:38 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #1 il: 12 Aprile 2018, 21:12:03 »
Codice: [Seleziona]
......
'crea un nuovo profilo in base ad una stringa di riferiemnto (per esempio dv_pal convertira' tutti i video in ingresso a 768x576 a 25 fps)
Extern mlt_profile_init(profile_name As String) As Pointer
.......

Public Sub Form_Open()
Dim Profilo As Pointer

 ......

Questa dichiarazione va bene.
Intervengo soltanto per dire che, poiché con la variabile di tipo Puntatore in realtà hai sostiuito in questo caso la Struttura dichiarata in questo file header: " https://github.com/mltframework/mlt/blob/master/src/framework/mlt_profile.h ", qualora tu voglia "esplicitarla" puoi ovviamente dichiararla in Gambas come segue:

Codice: [Seleziona]
library "......"

Public Struct mlt_profile_s
  description As Pointer
  frame_rate_num As Integer
  frame_rate_den As Integer
  width As Integer
  height As Integer
  progressive As Integer
  sample_aspect_num As Integer
  sample_aspect_den As Integer
  display_aspect_num As Integer
  display_aspect_den As Integer
  colorspace As Integer
  is_explicit As Integer
End Struct

-----

'crea un nuovo profilo in base ad una stringa di riferiemnto (per esempio dv_pal convertira' tutti i video in ingresso a 768x576 a 25 fps)
Extern mlt_profile_init(profile_name As String) As mlt_profile_s
.......

Public Sub Form_Open()
Dim Profilo As mlt_profile_s     '  Non serve la parola NEW, poiché la Struttura verrà inizializzata dalla funzione "mlt_profile_init()"

 ......
« 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 allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #2 il: 12 Aprile 2018, 23:06:39 »
Domani ci lavoro ancora
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #3 il: 13 Aprile 2018, 13:07:25 »
iniziano i dolori ... crash alla connessione di producer e consumer ... codice aggiornato in testa
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #4 il: 13 Aprile 2018, 13:09:23 »


Avanzando passo passo in quale parte de codice va in tilt il programma ?


« Ultima modifica: 13 Aprile 2018, 14:37:59 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 allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #5 il: 13 Aprile 2018, 17:35:15 »
penso non sia corretta la procedura di inizializzazione del consumer.....
« Ultima modifica: 13 Aprile 2018, 18:07:26 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #6 il: 13 Aprile 2018, 18:08:57 »
fatta qualche modifica per cercare di armonizzare il tutto .. ora al crash nenache c'arrivo :D

cannot find shared library etc .... quando provo a fare il consumer (quello che deve renderizzare a schermo/o altra periferica) i frames ...
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #7 il: 13 Aprile 2018, 19:48:29 »
fatta qualche modifica per cercare di armonizzare il tutto .. ora al crash nenache c'arrivo :D

cannot find shared library etc ....

...un disastro completo !     :death:



Vediamo un po'....iniziamo dal problema della dichiarazione della libreria.
La gestione delle librerie esterne e delle funzioni in esse contenute è cosa molto delicata. 

Dimmi l'intero percorso della libreria esterna utilizzata, comprensiva del nome intero (cioè pure il .so ed eventuali numeri di versione facenti parte del nome).

« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #8 il: 13 Aprile 2018, 20:07:50 »
...secondo dubbio:

nel tuo codice questa funzione esterna
 mlt_repository mlt_factory_init( const char *directory )
perché la dichiari
  Extern mlt_factory_init() As Integer
cioè: senza parametro formale dichiarato, ma soprattutto perché dici che questa funzione restituisce un Intero ?   ???
« 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 allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #9 il: 15 Aprile 2018, 18:36:33 »
Library "~/melted/20180208/lib/libmlt" 'nel senso che nella mia_home/melted/20180208/lib/ ci sono questi file:
Citazione
drwxr-xr-x 5 v1p3r v1p3r      4096 feb  8 15:29 .
drwxr-xr-x 6 v1p3r v1p3r      4096 feb  8 15:17 ..
drwxr-xr-x 2 v1p3r v1p3r      4096 feb  8 15:25 frei0r-1
-rw-r--r-- 1 v1p3r v1p3r 163545566 feb  8 15:28 libavcodec.a
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavcodec.so -> libavcodec.so.58.10.100
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavcodec.so.58 -> libavcodec.so.58.10.100
-rwxr-xr-x 1 v1p3r v1p3r  13444760 feb  8 15:28 libavcodec.so.58.10.100
-rw-r--r-- 1 v1p3r v1p3r   2552564 feb  8 15:28 libavdevice.a
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavdevice.so -> libavdevice.so.58.1.100
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavdevice.so.58 -> libavdevice.so.58.1.100
-rwxr-xr-x 1 v1p3r v1p3r    101064 feb  8 15:28 libavdevice.so.58.1.100
-rw-r--r-- 1 v1p3r v1p3r  29342136 feb  8 15:28 libavfilter.a
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavfilter.so -> libavfilter.so.7.11.101
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavfilter.so.7 -> libavfilter.so.7.11.101
-rwxr-xr-x 1 v1p3r v1p3r   2788288 feb  8 15:28 libavfilter.so.7.11.101
-rw-r--r-- 1 v1p3r v1p3r  54000970 feb  8 15:28 libavformat.a
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavformat.so -> libavformat.so.58.9.100
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libavformat.so.58 -> libavformat.so.58.9.100
-rwxr-xr-x 1 v1p3r v1p3r   2360264 feb  8 15:28 libavformat.so.58.9.100
-rw-r--r-- 1 v1p3r v1p3r   2963014 feb  8 15:28 libavutil.a
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:28 libavutil.so -> libavutil.so.56.7.100
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:28 libavutil.so.56 -> libavutil.so.56.7.100
-rwxr-xr-x 1 v1p3r v1p3r    441224 feb  8 15:28 libavutil.so.56.7.100
lrwxrwxrwx 1 v1p3r v1p3r        19 feb  8 15:29 libmelted.so -> libmelted.so.0.3.11
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:29 libmelted++.so -> libmelted++.so.0.3.11
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:29 libmelted++.so.0 -> libmelted++.so.0.3.11
-rwxr-xr-x 1 v1p3r v1p3r    194560 feb  8 15:29 libmelted.so.0.3.11
-rwxr-xr-x 1 v1p3r v1p3r     19728 feb  8 15:29 libmelted++.so.0.3.11
lrwxrwxrwx 1 v1p3r v1p3r        19 feb  8 15:29 libmelted.so.2 -> libmelted.so.0.3.11
lrwxrwxrwx 1 v1p3r v1p3r        15 feb  8 15:29 libmlt.so -> libmlt.so.6.7.0
lrwxrwxrwx 1 v1p3r v1p3r        17 feb  8 15:29 libmlt++.so -> libmlt++.so.6.7.0
lrwxrwxrwx 1 v1p3r v1p3r        17 feb  8 15:29 libmlt++.so.3 -> libmlt++.so.6.7.0
lrwxrwxrwx 1 v1p3r v1p3r        15 feb  8 15:29 libmlt.so.6 -> libmlt.so.6.7.0
-rwxr-xr-x 1 v1p3r v1p3r    848024 feb  8 15:29 libmlt.so.6.7.0
-rwxr-xr-x 1 v1p3r v1p3r    516432 feb  8 15:29 libmlt++.so.6.7.0
-rw-r--r-- 1 v1p3r v1p3r    631744 feb  8 15:24 libmp3lame.a
-rwxr-xr-x 1 v1p3r v1p3r       960 feb  8 15:24 libmp3lame.la
lrwxrwxrwx 1 v1p3r v1p3r        19 feb  8 15:24 libmp3lame.so -> libmp3lame.so.0.0.0
lrwxrwxrwx 1 v1p3r v1p3r        19 feb  8 15:24 libmp3lame.so.0 -> libmp3lame.so.0.0.0
-rwxr-xr-x 1 v1p3r v1p3r    499096 feb  8 15:24 libmp3lame.so.0.0.0
lrwxrwxrwx 1 v1p3r v1p3r        17 feb  8 15:29 libmvcp.so -> libmvcp.so.0.3.11
-rwxr-xr-x 1 v1p3r v1p3r    169032 feb  8 15:29 libmvcp.so.0.3.11
lrwxrwxrwx 1 v1p3r v1p3r        17 feb  8 15:29 libmvcp.so.2 -> libmvcp.so.0.3.11
-rw-r--r-- 1 v1p3r v1p3r    693892 feb  8 15:28 libpostproc.a
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libpostproc.so -> libpostproc.so.55.0.100
lrwxrwxrwx 1 v1p3r v1p3r        23 feb  8 15:28 libpostproc.so.55 -> libpostproc.so.55.0.100
-rwxr-xr-x 1 v1p3r v1p3r    121016 feb  8 15:28 libpostproc.so.55.0.100
-rw-r--r-- 1 v1p3r v1p3r    696966 feb  8 15:28 libswresample.a
lrwxrwxrwx 1 v1p3r v1p3r        24 feb  8 15:28 libswresample.so -> libswresample.so.3.0.101
lrwxrwxrwx 1 v1p3r v1p3r        24 feb  8 15:28 libswresample.so.3 -> libswresample.so.3.0.101
-rwxr-xr-x 1 v1p3r v1p3r    117048 feb  8 15:28 libswresample.so.3.0.101
-rw-r--r-- 1 v1p3r v1p3r   5855438 feb  8 15:28 libswscale.a
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:28 libswscale.so -> libswscale.so.5.0.101
lrwxrwxrwx 1 v1p3r v1p3r        21 feb  8 15:28 libswscale.so.5 -> libswscale.so.5.0.101
-rwxr-xr-x 1 v1p3r v1p3r    526640 feb  8 15:28 libswscale.so.5.0.101
-rw-r--r-- 1 v1p3r v1p3r   3326906 feb  8 15:24 libvpx.a
lrwxrwxrwx 1 v1p3r v1p3r        15 feb  8 15:24 libvpx.so -> libvpx.so.5.0.0
lrwxrwxrwx 1 v1p3r v1p3r        15 feb  8 15:24 libvpx.so.5 -> libvpx.so.5.0.0
lrwxrwxrwx 1 v1p3r v1p3r        15 feb  8 15:24 libvpx.so.5.0 -> libvpx.so.5.0.0
-rwxr-xr-x 1 v1p3r v1p3r   2501216 feb  8 15:24 libvpx.so.5.0.0
lrwxrwxrwx 1 v1p3r v1p3r        14 feb  8 15:25 libx264.so -> libx264.so.149
-rwxr-xr-x 1 v1p3r v1p3r   1307024 feb  8 15:25 libx264.so.149
drwxr-xr-x 2 v1p3r v1p3r      4096 feb  8 15:29 mlt
drwxr-xr-x 2 v1p3r v1p3r      4096 feb  8 15:29 pkgconfig

per quel che riguarda il factory init penso di aver semplicemente fatto un'ipostesi su come funzionava l'esempio in php ...
https://github.com/mltframework/mlt/blob/master/src/swig/php/play.php
Codice: [Seleziona]
mlt_factory_init(NULL);
quindi non pensavo servisse che ritornasse nulla se non un valore cosi' tanto per spararlo a debug e che come parametro prendesse solamente il nulla ...

era prima che andassi a vedere come erano definite le funzioni nei file header.

Pero' per la cronaca, la libreria la trova senz'altro nelle chiamate precedenti.

il programma restituisce valori che sono compativili con le istruzioni impartite, elaborate dalle funzioni esterne .... quindi in realta' e' un errore che viene inputato alle libreie non trovate .. ma erroneamente (penso)
« Ultima modifica: 15 Aprile 2018, 19:06:12 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:riprodurre un video con le funzioni esterne di MLT
« Risposta #10 il: 15 Aprile 2018, 18:58:20 »
Library "~/melted/20180208/lib/libmlt" 'nel senso che nella mia_home/melted/20180208/lib/ ci sono questi file:

Nella dichiarazione della libreria, quando la libreria esterna si trova al di fuori dei percorsi standard (/usr/lib/...) devi spcificare per esteso il suo percorso !


per quel che riguarda il factory init penso di aver semplicemente fatto un'ipostesi su come funzionava l'esempio in php ...
https://github.com/mltframework/mlt/blob/master/src/swig/php/play.php
Codice: [Seleziona]
mlt_factory_init(NULL);
quindi non pensavo servisse che ritornasse nulla se non un valore cosi' tanto per spararlo a debug e che come parametro prendesse solamente il nulla ...

era prima che andassi a vedere come erano definite le funzioni nei file header

...per quel che riguarda la funzione esterna in questione, il suo prototipo è dichiarato -  come sai - nel file header " mlt_factory.h ", come segue:
Codice: [Seleziona]
extern mlt_repository mlt_factory_init( const char *directory )
Quindi ritorna qualcosa, ossia " mlt_repository ", che è dichiarato nel file sorgente " mlt_repository.c ", e più precisamente è una Struttura, non un intero !

A mio modesto avviso, poi, se non utilizzi nel prosieguo del codice quella Struttura, la funzione esterna mlt_factory_init( ) non ti serve a niente.   :-\
« Ultima modifica: 18 Aprile 2018, 02:05:46 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. »