FFMPEG in PHP script via Crontab aanroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een VPS server met daarop FFMPEG geïnstalleerd. Vanuit een PHP script roep ik dit script aan wat vervolgens een film gaan verwerken. Als ik dit script aanroep via de browser werkt het perfect. Nu wil ik het echter automatiseren zodat het 's nachts gebeurt. Verwerken van films kost namelijk nogal wat rekenkracht. Daarvoor maak ik gebruik van Cronjob in Plesk 8.6.

Cronjob: cd /srv/www/vhosts/domein/httpdocs/domein; php ffmpeg.php

PHP:
1
2
3
4
5
6
7
8
9
// Dit is maar een gedeelte van het script.
// Maak previewfilm in flv formaat.
exec("/usr/local/bin/ffmpeg -i films/temp/$bestand_origineel -ar 44100 -ab 96 -f flv -ss 00:00:02.000 -t 00:00:22.000 -vhook '/usr/local/lib/vhook/watermark.so -f afbeeldingen/wm.gif -m 1 -t FFFFFF00' -qmax 10 films/flv/$bestand.flv");

// Maak thumbnail om te tonen op de website.
exec("/usr/local/bin/ffmpeg -i films/temp/$bestand_origineel -ss 00:00:05.000 -t 00:00:05.000 -s 120x90 films/thumbnails/$bestand.jpg");

// Maak de film opnieuw aan naar wmv formaat en plaats een watermerk erbij.
exec("/usr/local/bin/ffmpeg -i films/temp/$bestand_origineel -target pal-vcd -vhook '/usr/local/lib/vhook/watermark.so -f afbeeldingen/wm.gif -m 1 -t FFFFFF00' films/films/$bestand.wmv");


Nu heb ik al veel gezocht op vele websites, veel combinaties geprobeerd, maar het lukt niet. Ik krijg telkens de volgende foutmelding terug via de e-mail. Je zou zeggen dat hij ffmpeg niet kan vinden, maar hij krijgt toch het volledige pad mee.
sh /ffmpeg: no such file or directory

Echter krijgt hij het volledige pad en het werkt wel wanneer ik het vanuit de browser aanroep.

[ Voor 3% gewijzigd door Verwijderd op 03-02-2009 09:49 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Waarschijnlijk draait cron onder een andere gebruiker die geen toegang heeft tot /usr/local/bin/.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op dinsdag 03 februari 2009 @ 09:46:
Waarschijnlijk draait cron onder een andere gebruiker die geen toegang heeft tot /usr/local/bin/.
Wat zou daar dan een mogelijke oplossing voor zijn om het wel goed te laten werken?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Euhm, wat dacht je van toegang geven? Of uberhaupt eens te beginnen uit te zoeken onder welke user cron draait en of deze wel of niet bij ffmpeg mag enz enz.

Ik wil je trouwens aanraden om jezelf wat initiatiefvoller en zelfredzamer op te stellen in vergelijking met je voorgaande topics.

[ Voor 29% gewijzigd door Janoz op 03-02-2009 10:09 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

exec("/usr/local/bin/ffmpeg -i films/temp/$bestand_origineel -ar 44100 -ab 96 -f flv -ss 00:00:02.000 -t 00:00:22.000 -vhook '/usr/local/lib/vhook/watermark.so -f afbeeldingen/wm.gif -m 1 -t FFFFFF00' -qmax 10 films/flv/$bestand.flv");
En wat is je start dir als je dat crontabje start ? Precies, vast niet dezelfde als je 'm via het web aanroept. Ergo : gebruik volledige paden.

[ Voor 3% gewijzigd door een moderator op 03-02-2009 12:30 . Reden: Groeten??? ;) ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
igmar schreef op dinsdag 03 februari 2009 @ 12:07:
[...]


En wat is je start dir als je dat crontabje start ? Precies, vast niet dezelfde als je 'm via het web aanroept. Ergo : gebruik volledige paden.
Heb de afgelopen dagen veel geleerd maar geen oplossing gevonden.

Misschien vreemde vraag, het script wordt wel door een andere gebruiker (via ftp) geupload. Weet niet of dat een probleem vormt.

Apache draait als wwwrun binnen de groep www. Wat ik ook probeer hij blijft aangeven dat hij /ffmpeg niet kan vinden. Het staat wel op die locatie. Je had het over volledige paden, maar die gebruik ik toch ook in mijn script.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Verwijderd schreef op maandag 09 februari 2009 @ 09:54:
[...]
Apache draait als wwwrun binnen de groep www. Wat ik ook probeer hij blijft aangeven dat hij /ffmpeg niet kan vinden. Het staat wel op die locatie. Je had het over volledige paden, maar die gebruik ik toch ook in mijn script.
Staat 'ie in /ffmpeg of in /usr/local/bin/ffmpeg?

Je kan inloggen op die VPS? Met 'which ffmpeg' zou je het volledige pad moeten krijgen. Misschien toch het verkeerde pad?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
rutgerw schreef op maandag 09 februari 2009 @ 10:08:
[...]


Staat 'ie in /ffmpeg of in /usr/local/bin/ffmpeg?

Je kan inloggen op die VPS? Met 'which ffmpeg' zou je het volledige pad moeten krijgen. Misschien toch het verkeerde pad?
which ffmpeg zegt:
/usr/local/bin/ffmpeg

Dit staat ook zo in mijn script dus dat zou moeten kloppen. Al begin ik steeds meer te twijfelen over mijn cronjob commando wel juist is. Op mijn zoektoch door internet kom ik verschillende versies tegen. Ik maak nu gebruik van de volgende.

/usr/bin/php5 /srv/www/vhosts/domeinnaam/httpdocs/test/ffmpeg.php

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
en (zoals hier al gemeld): wat gebeurt er als je alle relatieve paden door absolute paden vervangt?

Acties:
  • 0 Henk 'm!

  • JJerome
  • Registratie: Oktober 2007
  • Laatst online: 27-07 15:33
Klopt het pad naar je PHP binary überhaupt wel?

Probeer het anders even met wget aangezien je php bestand toch in je httpdocs staat.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op maandag 09 februari 2009 @ 09:54:
Apache draait als wwwrun binnen de groep www. Wat ik ook probeer hij blijft aangeven dat hij /ffmpeg niet kan vinden. Het staat wel op die locatie. Je had het over volledige paden, maar die gebruik ik toch ook in mijn script.
En zoek nu eens uit onder welke user de cron scripts draaien.

En daarnaast met mijn bovenbuurman. Weet je zeker dat de melding 'file not found' slaat op ffmpeg, en niet gewoon op de film die je wilt converteren?

[ Voor 16% gewijzigd door Janoz op 09-02-2009 11:31 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • ruuds
  • Registratie: Maart 2001
  • Laatst online: 19-09 14:08
Ik gebruik FFMPEG icm de libx264 library voor een website, en deze schrijft blijkbaar logbestanden weg in de directory waar ffmpeg ook in staat. Wellicht ook een puntje om rekening mee te houden, alhoewel ik niet zeker weet of dat bij andere encodings/encoders ook is.

Acties:
  • 0 Henk 'm!

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 20-09 18:03
Een paar tips:
• Vind eerst uit of de desbetreffende gebruiker wel een shell mag draaien, als de gebruikers-regel in /etc/passwd eindigd met ":/bin/false" dan is dit niet het geval... (Dit is hoogstwaarschijnlijk echt wel het geval, maar toch...)
• Vind eerst uit of het script wel goed draait als je als dezelfde cron-gebruiker het script handmatig aanroept. Meestal kun je dan meer zien gebeuren.
• Probeer eens 'env' uit te voeren in je script, dan kun je in elk geval de omgeving variabelen vinden zoals PATH e.d. En zet eens een hoop debugging aan, ik neem tenminste aan dat dat kan.
• Misschien helpt het om het cron-script gewoon eens in bash te schrijven, of gedeeltelijk in bash?

Dat zijn dingen die mij zo te binnen schieten als ik dit lees.

offtopic:
Waarschijnlijk is "at" beter te gebruiken voor je dan cronjobs, dan kun je aangeven dat een bepaalde taak om die-en-die-tijd uitgevoerd dient te worden...

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Van absolute paden maak ik al gebruik, heb ik niet vertelt eigenlijk. Ook dat lost het probleem niet op. Voor een voorbeeld zie het onderstaande script.

Ook de locatie van php en ffmpeg heb ik controleert en zijn correct. Heb ook getest met wget en dan voert hij het script goed uit net als via een browser. Maar wget wordt als root uitgevoerd, de crontab staat ingesteld onder een andere gebruiker.

FFMpeg staat in usr/bin/ffmpeg en kan daar geen log bestanden in vinden.

In passwd staat de volgende regel voor de gebruiker waar ook de crontab is ingesteld in Plesk.
gebruiker:x:10001:2524::/srv/www/vhosts/domein.nl:/bin/false

Heb nu de cronjob als root ingesteld. Niet helemaal veilig lijkt mij, maar zo kan ik kijken hoe het met de rechten staat. Toch heb ik het vermoeden dat mijn cronjob niet volledig is. Volgens een kennis van mij moet je in de cronjob ook een vermelding naar FFMpeg maken. Als ik dat doe dan ziet hij de rest van de cronjob als input/output wat natuurlijk ook niet goed is.

Mijn huidige cronjob - die niet werkt:
/usr/bin/php5 /srv/www/vhosts/domein/httpdocs/website/ffmpeg.php

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if(file_exists("/srv/www/vhosts/domein/httpdocs/website/films/temp/$bestand_origineel") and empty($foutenlijst)){
    // Bestand bestaat.             
    echo "Bestand in behandeling: $bestand_origineel\n\n";
    
    // Maak previewfilm in flv formaat.
    exec("/usr/local/bin/ffmpeg -i /srv/www/vhosts/domein/httpdocs/autostrada/films/temp/$bestand_origineel -ar 44100 -ab 96 -f flv -ss 00:00:02.000 -t 00:00:22.000 -vhook '/usr/local/lib/vhook/watermark.so -f afbeeldingen/wm2.gif -m 1 -t FFFFFF00' -qmax 10 /srv/www/vhosts/domein/httpdocs/website/films/flv/$bestand.flv");
    
    // Maak thumbnail om te tonen op de website.
    exec("/usr/local/bin/ffmpeg -i /srv/www/vhosts/domein/httpdocs/website/films/temp/$bestand_origineel -ss 00:00:05.000 -t 00:00:05.000 -s 120x90 /srv/www/vhosts/domein/httpdocs/website/films/thumbnails/$bestand.jpg");
    
    // Maak de film opnieuw aan naar wmv formaat en plaats een watermerk erbij.
    exec("/usr/local/bin/ffmpeg -i /srv/www/vhosts/domein/httpdocs/website/films/temp/$bestand_origineel -target pal-vcd -vhook '/usr/local/lib/vhook/watermark.so -f afbeeldingen/wm2.gif -m 1 -t FFFFFF00' /srv/www/vhosts/domein/httpdocs/website/films/films/$bestand.wmv");
    
    // Werk de gegevens in de database bij.
    $query_update = "UPDATE as_films SET status='3' WHERE id='". $record['id'] . "'";
    if(!$result_update = mysql_query($query_update)){
        // Query is mislukt.
        $foutenlijst .= "Het bijwerken van de gegevens in de database tabel van de film $bestand_origineel is mislukt, film is wel verwerkt. \n";
    }

    // Verwijder het originele bestand van de server.
    //unlink("films/temp/$bestand_origineel");
    
    // Eindtijd van verwerking.
    $eindtijd = date('H:i:s');
    $verschil = strtotime("$eindtijd") - strtotime("$begintijd");       
    echo " Voltooid in: ". $verschil / 60 . " minuten \n\n";
}else{
    // Bestand bestaat niet of er zijn fouten ontstaan in een vorige run.
    echo "Bestand: $bestand_origineel bestaat niet! \n\n";
    $foutenlijst .= "Bestand: $bestand_origineel bestaat niet, film is NIET verwerkt. \n ";
}

[ Voor 67% gewijzigd door Verwijderd op 17-02-2009 08:36 . Reden: Update met nieuwe bevindingen. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Na nog wat zoeken heb ik de onderstaande cronjob die uitgevoerd wordt. Mijn vraag is alleen of dit een juiste en veilige oplossing is? De cronjob wordt wel volledig goed uitgevoerd.

/usr/bin/lynx -source http://www.domein.nl/website/ffmpeg.php

Dit topic mag dus op slot. Heb tevens een handleiding gepubliceerd op mijn website hoe je FFMpeg op een vps/server kan installeren en hoe je cronjob moet instellen.

[ Voor 33% gewijzigd door Verwijderd op 20-02-2009 10:37 . Reden: Probleem opgelost ]


Acties:
  • 0 Henk 'm!

  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 17-09 20:10
Verwijderd schreef op dinsdag 17 februari 2009 @ 09:27:
Na nog wat zoeken heb ik de onderstaande cronjob die uitgevoerd wordt. Mijn vraag is alleen of dit een juiste en veilige oplossing is? De cronjob wordt wel volledig goed uitgevoerd.

/usr/bin/lynx -source http://www.domein.nl/website/ffmpeg.php

Dit topic mag dus op slot. Heb tevens een handleiding gepubliceerd op mijn website hoe je FFMpeg op een vps/server kan installeren en hoe je cronjob moet instellen.
FFMpeg via 'n cronjob aanroepen is niet handig, omdat je dan 1) als gebruiker altijd een bep. tijd moet wachten tot je filmpje geconverteerd gaat worden en 2) dat je niet weet of je klaar bent met transcoden van je batch als de volgende cronjob begint, waardoor je allerlei gekke conflicten krijgt.

Je kunt beter gebruik maken van 'n queueing service. In in Ruby on Rails app gebruik ik de combinatie van Starling/Workling. Starling is en messagequeue, waarin dan vanuit je app berichten worden geplaatst om een bep. file te gaan transcoden. A.d.v. de instellingen van Starling worden de geplaatste berichten een-voor-een netjes afgewerkt.

In het ideale geval laat je het transcoden door een andere machine dan de web frontend doen! Maar dat is ook een afweging tussen kosten en performance verlies. Als je site user-generated content (Video's) verwerkt, raadt ik je zeker aan om het transcoden op een apart systeem te laten plaatsvinden.

Het aanroepen van ffmpeg.php via het web lijkt me *geen* goed idee. Dit betekent in feite dat iedereen je ffmpeg kan starten, zo vaak en wanneer hij maar wil. Niet doen dus! Crontab is voor periodieke onderhouds scripts. Video's transcoden is geen periodiek onderhoud lijkt me.

Het opzetten van 'n transcoder via ffmpeg voor je app is niet moeilijk, je moet je alleen eerst verdiepen in 1) hoe ffmpeg werkt 2) hoe je taken vanuit je webapp kunt delegeren om ze in de achtergrond te laten uitvoeren.

Computeraar - Part-time Maker van Geluiden - https://neuroslasher.bandcamp.com


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ariejan schreef op maandag 23 februari 2009 @ 10:34:
[...]


FFMpeg via 'n cronjob aanroepen is niet handig, omdat je dan 1) als gebruiker altijd een bep. tijd moet wachten tot je filmpje geconverteerd gaat worden en 2) dat je niet weet of je klaar bent met transcoden van je batch als de volgende cronjob begint, waardoor je allerlei gekke conflicten krijgt.

Je kunt beter gebruik maken van 'n queueing service. In in Ruby on Rails app gebruik ik de combinatie van Starling/Workling. Starling is en messagequeue, waarin dan vanuit je app berichten worden geplaatst om een bep. file te gaan transcoden. A.d.v. de instellingen van Starling worden de geplaatste berichten een-voor-een netjes afgewerkt.

In het ideale geval laat je het transcoden door een andere machine dan de web frontend doen! Maar dat is ook een afweging tussen kosten en performance verlies. Als je site user-generated content (Video's) verwerkt, raadt ik je zeker aan om het transcoden op een apart systeem te laten plaatsvinden.

Het aanroepen van ffmpeg.php via het web lijkt me *geen* goed idee. Dit betekent in feite dat iedereen je ffmpeg kan starten, zo vaak en wanneer hij maar wil. Niet doen dus! Crontab is voor periodieke onderhouds scripts. Video's transcoden is geen periodiek onderhoud lijkt me.

Het opzetten van 'n transcoder via ffmpeg voor je app is niet moeilijk, je moet je alleen eerst verdiepen in 1) hoe ffmpeg werkt 2) hoe je taken vanuit je webapp kunt delegeren om ze in de achtergrond te laten uitvoeren.
De films worden alleen tussen 1 en 6 uur 's nachts verwerkt. De maximale capaciteit van een film is 100 MB. Daardoor is de kans klein dat bezoekers er overdag last van hebben. Mocht het zo zijn dat in verloop van de tijd veel films verwerkt moeten worden dan is een extra server een goed idee. Wat betreft het wachten. De films moeten eerst door de opdrachtgever gekeurd worden voordat ze verwerkt en getoond worden. Bezoekers moeten dus altijd wachten, ongeveer 1 dag.

FFMpeg werkt via de commandprompt dus een batch zou ook wel mogelijk zijn. Het php script zal echter wel beveiligd worden tegen ongeoorloofd gebruik. Mocht er iemand toch toegang krijgen tot het script gebeurd er niets bijzonders behalve het verwerken van films. Dit doet hij echter allen tussen 1 en 6.

Mocht je nog ideeën hebben die beter zijn dan hoor ik die graag en zoek ik die uit.

[ Voor 21% gewijzigd door Verwijderd op 24-02-2009 09:54 ]

Pagina: 1