我通常使用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
我需要实际帧大小的宽度和高度,以及持续时间。
从这里提取这个的最佳方法是什么?我不熟悉正则表达式。
答案 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位数。