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):
' 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:
#!/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:
<?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.htmle' 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