[php/ffmpeg] Tijdsduur van filmpje (flv) opvragen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Buur75
  • Registratie: December 2006
  • Laatst online: 10-04 15:21
Ik heb een ding gemaakt dat filmpjes kan uploaden. Ik probeer nu met ffmpeg een screenshot te maken van het middelste frame. Het is me al gelukt om er eentje van het eerste frame te maken, en het enige wat ik nog hoef te doen is daarbij een tijdstip opgeven van het frame dat ik wil hebben. Hoe kom ik er achter hoe lang het complete filmpje duurt? (Dat aantal seconden kan ik dan natuurlijk door twee delen).

Voor de geïnteresseerden die het nog niet weten; dit is overigens het commando om 1 screenshot te maken:
ffmpeg -i filmpje.flv -f image2 -vframes 1 -ss [tijdstip] thumb.jpg

Acties:
  • 0 Henk 'm!

  • _wm_
  • Registratie: Mei 2007
  • Laatst online: 29-04 21:51
kan je niet gewoon de -i functie gebruiken en dan een regexp er op los laten?

dus "ffmpeg -i film.flv"
dan krijg je een hele rij gegevens, waaronder: "Duration: iets"
en dat kan je met regexp weer extraheren:
preg_match('@Duration: (.*?),@', $output, $matches);

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
php-ffmpeg installeren

Acties:
  • 0 Henk 'm!

Verwijderd

ik ben zelf ook tegen dit probleem opgelopen en heb nog geen oplossing gevonden. php-ffmpeg zou inderdaad een betere oplossing zijn maar die extension is niet echt meer uptodate geloof ik. pin me er niet op vast. het probleem is dat ffmpeg op een rare manier naar stdout schrijft. ik heb me er niet echt verder in verdiept maar ik weet dat de updates tijdens dat ffmpeg bezig is worden geschreven door eerst een lijn met evenzoveel backspaces naar de console te schrijven als de laaste update.

een andere methode zou zijn om alle frames te dumpen en dan gewoon tellen zoals:
code:
1
ffmpeg -i [input] -r 1 -s 1x1 [tempdir]/frame_%5d.png

je kunt het dan natuurlijk ook gewoon uit de index uit de filename halen. wat dit doet is [input] recoden naar een filmpje met 1 frames per seconden en 1x1 pixels groot en elk frame los wegschrijven naar een .png bestand. kan ook een .jpg of gif zijn als dat iets uitmaakt dat zul je zelf moeten testen.

dit zou zeer snel moet gaan omdat het eigenlijk gewoon alle video data weggooid. als je een iets grotere resolutie kiest kun je ook meteen een filmstrip maken met thumbnails.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Zoiets werkt wel:
ffmpeg -i [input] 2>&1 | grep -Po 'Duration: \d{2}:\d{2}:\d{2}' | awk '{print $2}'


En het kan best wel netter, maar dit was het eerste dat in me opkwam :P


@Docey: als je gewoon ffmpeg -i gebruikt dan schrijft ie alle metadata van een video naar stderr en ben je direct klaar, het kan dus redelijk makkelijk :)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

ik had destijds al vermoed dat ffmpeg naar stderr schreef omdat stdout altijd blanco was. maar zoals ik al zij heb ik me er nooit echt verder in verdiept. klingt logisch om naar stderr te schrijven omdat ffmpeg de optie geeft om naar stdout de videodata te schrijven ipv file.

Acties:
  • 0 Henk 'm!

  • Buur75
  • Registratie: December 2006
  • Laatst online: 10-04 15:21
En hoe vang je die output die in de stderr staat dan af in je php-script?

Dit volgende geeft namelijk inderdaad een blanco output:
PHP:
1
2
3
$command = 'ffmpeg -i file.flv';
exec($command, $arrReturn);
print_r($arrReturn);
Maar dit geeft wel dingen op het scherm:
PHP:
1
2
3
$command = 'ffmpeg -h';
exec($command, $arrReturn);
print_r($arrReturn);


Hoe krijg ik die output van die eerste nou in een variabele?

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Omdat ffmpeg niet naar stdout schrijft maar stderror :)

Acties:
  • 0 Henk 'm!

  • Buur75
  • Registratie: December 2006
  • Laatst online: 10-04 15:21
Ja dat zeg ik toch. En hoe krijg ik dat in een variabele?

Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Redirect de stderr (2) naar de stdout (1). Kortom, even 2>&1 achter je commando zetten.

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!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017

RSD

Nog een mogelijkheid is het gebruik van de flvtool2. Je injecteert de flv met metadata en leest deze uit met een php functie.

Als je flv metadata bevat kun je tevens een mooie progress bar maken voor in de player.

[ Voor 26% gewijzigd door RSD op 12-09-2008 22:57 ]

Pagina: 1