如何从PHP中的ffmpeg中提取帧大小和长度?

时间:2010-11-11 19:41:10

标签: php ffmpeg

我通常使用midentify,它会发出一个格式很好的字符串,很容易preg_match

然而,它有时会失败,所以我想通过ffmpeg做一个回退方法。 ffmpeg -i hello.avi吐了出来:

    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

我需要实际帧大小的宽度和高度,以及持续时间。

从这里提取这个的最佳方法是什么?我不熟悉正则表达式。

3 个答案:

答案 0 :(得分:2)

持续时间很简单:

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

尺寸更难。我猜测除了x字符之外没有任何其他数字分隔的数字将是维度:

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

答案 1 :(得分:0)

我会使用PHP的ffmpeg扩展名。从http://ffmpeg-php.sourceforge.net/下载并安装:

extension_loaded('ffmpeg')或die('加载ffmpeg'时出错);

$ ffmpegInstance = new 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();

答案 2 :(得分:0)

我只想添加@ lonesomeday答案的略微修改版本:

这部分是正确的,但如果你有这样的字符串:

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)

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

将返回

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

所以我稍微修改了一下:

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

这样它就不会匹配一位数或超过4位数。