2010-11-11 3 views
1

J'utilise habituellement midentify, qui recrache une chaîne bien formaté, qui est facile à preg_matchComment extraire la taille de l'image et la longueur de ffmpeg, en PHP?

Il ne tient cependant pas parfois, je veux faire une méthode de repli par ffmpeg. Le hello.avi de ffmpeg crache ceci:

Input #0, avi, from 'hello.avi': 
    Metadata: 
    encoder   : Nandub v1.0rc2 
    Duration: 01:11:16.56, start: 0.000000, bitrate: 1202 kb/s 
    Stream #0.0: Video: mpeg4, yuv420p, 640x336 [PAR 1:1 DAR 40:21], 25 tbr, 25 tbn, 25 tbc 
    Stream #0.1: Audio: mp3, 48000 Hz, 2 channels, s16, 117 kb/s 
At least one output file must be specified 

J'ai besoin de la largeur et la hauteur de la taille du cadre réel, ainsi que la durée.

Quelle serait la meilleure façon d'extraire ceci d'ici? Je ne suis pas familier avec regex.

Répondre

2

Durée est facile:

preg_match('/Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/', $source, $matches); 
$matches[1] == '01:11:16.56'; 

La taille est plus difficile. Je vais deviner que tout ensemble de nombres séparés par rien, sauf un caractère x sera les dimensions:

preg_match('/(\d+)x(\d+)/', $source, $matches); 
$matches[1] == '640'; 
$matches[2] == '336'; 
0

Je voudrais utiliser l'extension ffmpeg pour PHP. Téléchargez et installez à partir de http://ffmpeg-php.sourceforge.net/ puis:

extension_loaded ('ffmpeg') ou die ('Erreur lors du chargement de ffmpeg');

$ ffmpegInstance = nouveau ffmpeg_movie ('hello.avi');

echo "getDuration:". $ ffmpegInstance-> getDuration(). "getFrameCount:". $ ffmpegInstance-> getFrameCount(). "getFrameRate:". $ ffmpegInstance-> getFrameRate(). "getFilename:". $ ffmpegInstance-> getFilename(). "getComment:". $ ffmpegInstance-> getComment(). "getTitle:". $ ffmpegInstance-> getTitle(). "getAuthor:". $ ffmpegInstance-> getAuthor(). "getCopyright:". $ ffmpegInstance-> getCopyright(). "getArtist:". $ ffmpegInstance-> getArtist(). "getGenre:". $ ffmpegInstance-> getGenre(). "getTrackNumber:". $ ffmpegInstance-> getTrackNumber(). "getYear:". $ ffmpegInstance-> getYear(). "getFrameHeight:". $ ffmpegInstance-> getFrameHeight(). "getFrameWidth:". $ ffmpegInstance-> getFrameWidth(). "getPixelFormat:". $ ffmpegInstance-> getPixelFormat(). "getBitRate:". $ ffmpegInstance-> getBitRate(). "getVideoBitRate:". $ ffmpegInstance-> getVideoBitRate(). "getAudioBitRate:". $ ffmpegInstance-> getAudioBitRate(). "getAudioSampleRate:". $ ffmpegInstance-> getAudioSampleRate(). "getVideoCodec:". $ ffmpegInstance-> getVideoCodec(). "getAudioCodec:". $ ffmpegInstance-> getAudioCodec(). "getAudioChannels:". $ ffmpegInstance-> getAudioChannels(). "hasAudio:".$ ffmpegInstance-> hasAudio();

0

Je veux juste ajouter la version légèrement modifiée de la réponse du @ lonesomeday:

cette partie est correcte mais si vous avez la chaîne comme celui-ci:

Duration: 00:05:40.11, start: 0.000000, bitrate: 60847 kb/s 
Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1/0x31637661), 
yuv420p(tv, bt709), 1920x1080, 60846 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 5994 
tbc (default) 

cette

preg_match('/(\d+)x(\d+)/', $source, $matches); 

renverra

$matches[1] == '0'; 
$matches[2] == '31637661'; 

donc je l'ai modifié un peu:

preg_match('/(\d{2,4})x(\d{2,4})/', $source, $matches); 

De cette façon, correspondre à l'habitude un chiffre ou plus de 4 chiffres.

Questions connexes