Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di Edipo
    Registrato dal
    May 2003
    Messaggi
    1,239

    PHP, video gallery e thumbs

    Ciao a tutti, volevo domandarvi fin dove può arrivare l'operabilità di PHP nel discorso video e mi spiego.
    Devo realizzare una galleria di video (di vari formati e codifiche) dove poter visualizzare ogni singolo in formato flash, quindi occorre convertire i file in FLV (php e librerie possono?), e poi ci sarebbero le anteprime, cosidette Thumbs (PHP è in grado di generarle in automatico?) stile youtube o simili.
    Quindi, questi erano i miei dubbi...cosa ne sapete sull'argomento?
    Grazie in anticipo.
    "Il tempo aiuta a dimenticare e il destino regala sempre una seconda occasione.
    Ma aprirsi all'amore significa rendersi vulnerabili".

    Nicholas Sparks

  2. #2
    allora, sono discorsi simili ma diversi

    devi usare ffmpeg per fare questo tipo di operazione, ovvero la conversione dei video e la creazione dei thumbnail!

    C'è un apposita estensione che può essere comoda per effettuare la creazione dei thumbnail ma la vera e propria conversione ti conviene gestirla in altro modo, ovvero tramite uno script in cron che parte ogni 5 minuti, prende l'elenco dei nuovi video inseriti e li converte in FLV usando ffmpeg. Ovviamente se ci sta più di 5 minuti lo script quando viene rilanciato con il cron deve uscire in automatico perché uno sta già lavorando

    In questo modo lanci un comando per convertire il video da avi/mov/mpeg/divx e cosi via in flv, riducendo le dimensioni se serve, riducendo la qualità video onde di ritrovarsi con un file gigante e mettendo il video al suo posto flaggando correttamente il video inserito come completato

    non è efficentissimo, nel senso che sarebbe più utile una specie di servizio di sistema che sta acceso e, tramite una coda interna in memoria, quando riceve una richiesta dallo script web, prende ed effettua la conversione del video dando le informazioni sulla percentuale e sul risultato finale ... ovviamente la finalizzazione della conversione lo deve fare il servizio cosi che se l'utente chiude il browser viene comunque fatto senza problemi.

    Il servizio lo si può anche scrivere in PHP e puoi farlo lavorare tramite la shared memory o tramite le unix sockets (o le socket su TCP se magari hai più server e vuoi distribuire il lavoro, però in questo caso dovresti avere i video su uno storage remoto con NFS cosi da poterci accedere da qualsiasi server di conversione). Inoltre lo stesso servizio può eventualmente effettuare la riconversione di più video contemporaneamente, magari 2 per unità logica del processore, e dare i tempi di attesa per le riconversioni

    Tutto questo lo puoi sempre fare con php, che non sarebbe altro che il gestore delle varie componenti, però sinceramente se lo fai con un linguaggio compilato cosi le performance son migliori, non sarebbe male ... C# con mono o se conosci C puoi usare lui ... al massimo fai una prima versione, semplice, in PHP e poi la rielabori e la riscrivi

  3. #3
    Utente di HTML.it L'avatar di polinet
    Registrato dal
    Nov 2000
    Messaggi
    993
    Ogni volta che leggo un post di DANIELE_DLL rimango stupefatto!
    Sei sempre il migliore!!!!!
    ¿Hasta la pasta?

  4. #4
    Utente di HTML.it L'avatar di Edipo
    Registrato dal
    May 2003
    Messaggi
    1,239
    Sono di sasso...una risposta cosi particolareggiata e completa non l'ho mai ricevuta.
    Compliementi.
    Quindi riepilogando:
    LATO SERVER: ffmpeg installato e gestito da script e gestito a sua volta da CRON (comando che organizza processi suppongo, al momento però sono su una macchina win2003server con FastCGI e quanto ne consegue per poter eseguire pagine php, mentre ho letto che questi appartiene ad ambiente unix), il tutto gestito da php che quando riceve una richiesta, la elabora e restiuisce "Il gioco è fatto!" all'utente.
    LATO CLIENT: l'utente inserisce il video e attende che lo stesso venga inviato e convertito, in attesa del messaggio "Il gioco è fatto!".

    Dubbi: come potrei risolvere il problema con cron?
    Cron esegue questo script di cui mi hai parlato che a sua volta interagisce col soft di conversione?
    Potrei semplificarmi la vita avvisando l'utente che, una volta "uplodato", dovrà attendere alcune ore prima che il video venga pubblicato, quindi creando una sorta di coda sul server che "senza fretta" converte, crea le thumbs e immette in rete?

    "Il tempo aiuta a dimenticare e il destino regala sempre una seconda occasione.
    Ma aprirsi all'amore significa rendersi vulnerabili".

    Nicholas Sparks

  5. #5
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    Originariamente inviato da polinet
    Ogni volta che leggo un post di DANIELE_DLL rimango stupefatto!
    Sei sempre il migliore!!!!!
    quasi quanto heidi nel footer di daniele?

    ad ogni modo sono d' accordo con daniele, anche se ovviamente la sua soluzione richiederebbe risorse(linguaggi/sw lato server) superiori rispetto alla combinata php/ffmpeg, ma il risultato sicuramente è eccellente.
    Se il servizio di cui t occupi è rivolto ad un pannel di amministrazione di un sito 'MONOADMIN' (Accesso unico dell' ammintratore) allora sicuramente daniele è andato oltre pensando ad una situazione di multiutenza, viceversa php/ffmpeg sarebbe già sufficente.

    ffmpeg e scaricabile (nn ricordo se gratuitamente o meno) e installabile solo su macchine Linux, e ha a corredo molteplici ozioni di conversione utilizzabili direttamente nella stringa di chiamata a ffmpeg, con parametri (come diceva daniele) di controllo, gestione della compressione, formato, dimensioni ecc... il tutto accuratamente documentato

    aspetto smentite



    P.S. : ciao poli e ciao Daniel
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  6. #6
    [ot]ciao dott, io sto a casa un pò un cesso, cmq ora ti mando pvt [/ot]

    @edipo:

    Qui ci sta l'ultima build di ffmpeg NON UFFICIALE per windows (il che vuol dire che non viene rilasciata dagli sviluppatori ma da un terzo ... non che funziona male o ha problemi )
    http://arrozcru.no-ip.org/ffmpeg_builds/

    Per cron puoi risolvere con le soluzioni pianificate di windows, che è praticamente un cron a tutti gli effetti

    comunque secondo me non ti conviene usare cron ma un servizio ad hoc, riguardo a questo c'è un estensione di php che ti permette di trasformare un applicativo in un servizio di windows (guarda su pecl.php.net)

    Alternativamente a tutto ciò potresti usare cygwin o colinux, però la soluzione diviene abbastanza complessa ... colinux ti permette di far girare linux in ambiente windows senza alcun tipo di emulazione o virtualizzazione bensì facendo poggiare il kernel di linux sulle chiamate di windows e li ci puoi mettere quello che ti pare ... però ripeto è una soluzione macchinosa

    La soluzione ottimale, a questo punto, direi che è quella del servizio che parte all'avvio di windows, come servizio di sistema, e si occupa di lanciare i comandi per le conversioni

  7. #7
    Utente di HTML.it L'avatar di polinet
    Registrato dal
    Nov 2000
    Messaggi
    993
    Mi documeto a riguardo del tema.
    Molto interessante.

    ¿Hasta la pasta?

  8. #8
    Ti do anche qualche altro suggerimento, o per lo meno ci provo

    Puoi utilizzare l'estensione
    http://pecl.php.net/package/win32ps
    http://it.php.net/w32api

    dato che sei su windows, per permettere al servizio di decidere se può partire a convertire un altro processo o meno (puoi fare un fork del servizio di conversione se usi PHP o avvii un thread se usi C# ad esempio)

    Per quanto riguarda la possibilità di eseguire del codice PHP come un vero e proprio servizio di sistema dai un occhio qua
    http://netevil.org/blog/2005/sep/run...rvice-on-win32

    e anche
    http://it.php.net/win32service

    ------

    un esempio concreto del servizio scritto in php potrebbe essere
    Codice PHP:
    if ($argv[1] == 'run')
    {
      
    set_time_limit(0);

      
    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP);

      if (
    socket_bind($socket/** ASCOLTA SOLO IN LOCALE **/ '127.0.0.1'/** SULLA PORTA **/ 9999) == false)
      {
        die(
    socket_strerror(socket_last_error());
      }

      if (
    socket_set_option($socketSOL_SOCKETSO_REUSEADDR1) == false)
      { 
        die(
    socket_strerror(socket_last_error()); 
      }

      if (
    socket_set_nonblock($socket) == false)
      { 
        die(
    socket_strerror(socket_last_error()); 
      } 

      if (
    socket_listen($socket10) == false)
      {
        die(
    socket_strerror(socket_last_error());
      }

      
    win32_start_service_ctrl_dispatcher('nome-servizio-php');

      while (
    WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message())
      {
        
    $readSocket = array(&$socket);
        if ((
    $numberOfEvents socket_select($readSocket$writeSocket NULL$errorSocket NULL0) === false)
        {
          die(
    'Error while executing socket_select');
        }
        else if (
    $numberOfEvents 0)
        {
          
    acquireClient($socket);
        }
      }

    Questo codice non l'ho minimamente testato, ma grosso modo dovrebbe essere corretto! Con questo codice si attiva la socket che si mette in ascolto SOLO in locale sulla porta 9999 e poi parte il servizio dove dentro verifica se c'è qualche evento di tipo lettura sulla socket che abbiamo messo in ascolto ... l'evento di lettura per le socket in ascolto vuol dire che c'è una richiesta di connessione.

    La funzione che ho messo li, acquireClient a cui viene passata la socket dovrebbe fare qualcosa tipo

    Codice PHP:
    function acquireClient(&$ServerSocket)
    {
      
    $clientSocket socket_accept($ServerSocket);
      
      if ((
    $pid pcntl_ fork()) == -1)
      {
        die(
    'Unable to fork! Can't process the request!');
      }
      else if ($pid === 0)
      {
        /** Richiama una terza funzione che usa le funzioni socket_read e socket_write per dialogare con il processo chiamante **/
        /** Una volta fatto il tutto deve essere TASSATIVAMENTE chiamata la funzione exit(); altrimenti il processo figlio va ad eseguire la roba del processo padre! **/
        exit();
      }
      else
      {
        /** Processo padre, può tornare nel normale ciclo **/
        return;
      }

    qui c'è un elenco di link
    http://www.php.net/socket_create
    http://www.php.net/socket_bind
    http://www.php.net/socket_listen
    http://www.php.net/socket_set_option
    http://www.php.net/socket_set_nonblock
    http://www.php.net/socket_accept
    http://www.php.net/socket_read
    http://www.php.net/socket_write
    http://www.php.net/pcntl_fork
    http://www.php.net/win32_start_service_ctrl_dispatcher
    http://www.php.net/win32_get_last_control_message()

    Studiati SOPRATTUTTO il funzionamento della funzione pcntl_fork! Inoltre c'è da vedere se può lavorare bene con la gestione dei servizi di windows perché li lavorano con i thread

    Detto questo, se dovesserò esserci problemi con i servizi, ti basta scartare i servizi di windows e, non ricordo dove sta sul web, usi un servizio che non fa altro che avviare un processo, in questo caso lo script php.
    Deve per forza essere un servizio perché essendo su un dedicato non può essere altro

    Inoltre se scrivi questo servizio, o pseudo-tale, puoi anche implementare altre funzionalità di controllo e statisitche. Usando la funzione w32api dovresti essere in grado di definire "l'affinità" di un processo su un dato processore ed in questo modo usando le librerie di statistica sui processi e sul carico della macchina puoi decidere dove mettere il tutto

  9. #9
    Ultima cosa per davvero

    Riguardo FFMpeg esiste un'estensione PHP che potrebbe facilitare non di poco l'estrazione delle informazioni riguardanti il video in modo da lasciare all'eseguibile esclusivamente il lavoro di conversione

    Qui trovate il link all'estensione
    http://ffmpeg-php.sourceforge.net/

    Per esempio se volete leggere le informazioni riguardanti un video, una volta uploadato
    Codice PHP:
    $movie = new ffmpeg_movie($path_to_videofalse);
    echo 
    'Titolo: ' $movie->getTitle() . 
    '
    ;
    echo 
    'Width x Height x FPS: ' $movie->getFrameWidth() . 'x' $movie->getFrameHeight() . 'x' $movie->getFrameRate()
    echo 
    'Codec Video: ' $movie->getVideoCodec() . '
    '
    ;
    echo 
    'Codec Audio: ' $movie->getVideoCodec() . '
    '

    se per esempio volete estrarre un frame dal video per fare una thumbnail, prendendolo magari dopo i primi 5 minuti ed inserendolo in una cornice nera della dimensione di 150px per 150px mantenendo le proporzioni, si può fare

    Codice PHP:
    $newWidth 150$newHeight 150$bgColor = array(0,0,0);
    $width $movie->getFrameWidth(); $height $movie->getFrameHeight();
    if (
    $width $height)
    {
      
    $width $newWidth $height = ($height $width) * $newWidth 
    }
    else
    {
      
    $height  $newHeight $width = ($width $height) * $newHeight 
    }
    $frameImage $movie->getFrame($movie->getFrameRate() * 60)->resize($width$height)->toGDImage();

    $finalImage imagecreatetruecolor($newWidth$newHeight);
    $bgColorResource imagecreatecolor($finalImage$bgColor[0], $bgColor[1], $bgColor[2]);
    imagefill($finalImage00$bgColorResource);
    imagecopy($finalImage$frameImage00, ($newWidth-$width)/2, ($newheight-$height)/2$width$height);
    imagejpeg($finalImage$path_to_thumbnail85); 
    ovviamente questo è solo un esempio, perché si potrebbe aggiungere a questo l'estrazione di un frame ogni N secondi per creare una piccola gif animata che illustri la sequenza o ancora si potrebberò creare N thumbnail in base alle differenze di immagini tra i vari frame utilizzando come riferimento i frame chiave

    Per fare quest'ultima cosa si potrebbe usare:
    http://libpuzzle.pureftpd.org/project/libpuzzle
    http://libpuzzle.pureftpd.org/project/libpuzzle/doc
    http://libpuzzle.pureftpd.org/project/libpuzzle/php
    http://download.pureftpd.org/pub/pur...doc/README-PHP

    Ovviamente bisogna considerare che non si possono confrontare tutti i frame delle immagini con ogni simile altrimenti ci vorrebbe decisamente troppo, però se si prende un frame ogni minuto al massimo ci sono N confronti da fare corrispondente, in numero, alla lunghezza del minuto.

    -------------

    Qui ci sono un paio di link utili, ovvero una classe che wrappa le funzionalità di ffmpeg che potete trovare all'indirizzo
    http://www.phpclasses.org/browse/package/3747.html

    mentre qua potete trovare un pò di idee utili
    http://www.paolomainardi.com/2007/08...outube-in-php/
    http://vexxhost.com/blog/2007/05/20/...ng-ffmpeg-php/

  10. #10
    tutto molto interessante, complimenti ...ma mi sorge un dubbio: tutto ciò di cui sopra discusso, è realizzabile solo qualora si disponga di un server dedicato dove si possa installare software, e da quello che mi sembra di capire, nn è realizzabile su un semplicie servizio di hosting linux ...corretto? :master:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.