题
我想要一个PHP功能,该功能接收到文件的路径并返回有关它的一系列信息。 PHP文件可以调用FFMPEG。
返回的数据应该像
Array(
[mime] => video/ogg
[container] => Ogg
[video] => Theora
[audio] => Vorbis
[duration] => 20.3 // in seconds
)
Array(
[mime] => audio/ogg
[container] => Ogg
[video] =>
[audio] => FLAC
[duration] => 3
)
Array(
[mime] => image/gif
[container] => GIF
[video] => Animated GIF
[audio] =>
[duration] => 2
)
Array(
[mime] => video/webm
[container] => WebM
[video] => VP8
[audio] => Vorbis
[duration] => 900.7
)
false // not a media file
我从未与FFMPEG或PHP合作 shell_exec()
功能,但是FFMPEG似乎会以相当难的格式提供有关视频(或音频文件)的信息。我认为这样的事情是可能的。
解决方案
FFMPEG几乎可以完成您想要的一切,但是您正确地解析格式几乎是不可能的。实际上,如果您使用基于UNIX的系统来使用操作系统和FFMPEG的功能来进行解析,那就更快了,而不是让PHP尝试了解输出。几个月前,我开发了以下壳命令,出于类似的目的。
fulltime=`ffmpeg -i MOVIE.AVI 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//`;hour=`echo $fulltime | cut -d ':' -f 1`;minute=`echo $fulltime | cut -d ':' -f 2`;second=`echo $fulltime | cut -d ':' -f 3 | cut -d '.' -f 1`;echo `expr 3600 \* $hour + 60 \* $minute + $second`
管道(|
)告诉unix将上一个命令的输出作为下一个命令的输入。半彩色(;
)告诉UNIX开始新命令。 UNIX Shell还允许在线变量创建。要创建一个变量,您只说 var=value
. 。要回忆起此变量,您必须使用美元符号,例如 $var
.
我的命令实质上是输出的 ffmpeg -i MOVIE.AVI 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
并将其存储为 fulltime
. 。该命令进一步分解:
ffmpeg -i MOVIE.AVI 2>&1
表示显示信息的意思(-i
)for movie.avi。这 2>&1
我相信将输出重定向到管道而不是屏幕上(永远使这是永远的,所以我对此不清楚)
grep 'Duration'
将输入输入(这是 ffmpeg -i MOVIE.AVI 2>&1
),找到“持续时间”一词,仅输出包含该单词的行。
cut -d ' ' -f 4
将获取输入(上一个语句的输出),将其分配在每个空间(' '
),仅输出其中的四个。这是因为FFMPEG的输出看起来像:
MOVIE.AVI
video encoder, yada yada
audio encoder, yada yada
bitrates and stuff
Duration: hh:mm:ss fulltime: 00:30:00.1
换句话说,包含“持续时间”的行的第四个“段”是实际的持续时间...在小时,分钟和秒内(十进制位置)。
sed s/,//
意味着替换','一无所有。这样做可能是一个充分的理由。
之后,我创建了三个变量 hour
, minute
, , 和 second
:
hour=`echo $fulltime | cut -d ':' -f 1`;
minute=`echo $fulltime | cut -d ':' -f 2`;
second=`echo $fulltime | cut -d ':' -f 3 | cut -d '.' -f 1`;
请注意,我将小时设置为输出 echo $fulltime | cut -d ':' -f 1
. 。如果我要在每个结肠上分开时间,请抓住第一部分(:
)
我在几分钟内做相似的事情,然后我在几秒钟内只做同样的事情,只有我在最后砍下了任何小数。如果您在外壳工作,则必须删除此小数 expr
命令(我用来计算小时,分钟和秒的秒数)仅执行整数数学。如果您希望将小数保持持续时间,那么此时,您必须将小时,分钟和秒的时间归还给PHP,然后在那里进行解析。这将最容易通过以上替换上述内容来完成:
echo $fulltime
打电话后,这将返回诸如“ 00:30:00.1”之类的字符串 shell_exec()
, ,然后您可以轻松地使用它 explode(':',$string)
.
继续直接从Shell获取秒数:
在获得了数小时,几分钟和几秒钟之后,神奇的路线出现了:
echo `expr 3600 \* $hour + 60 \* $minute + $second`
这 expr
命令说要执行数学表达。不幸的是,这很愚蠢。首先,需要逃脱特殊角色(*
是Unix的通配符,因此您必须使用 \*
表示倍增)。接下来,它仅执行整数数学。如您所见,将小时乘以3600,分钟60,然后将它们全部添加在一起,这很容易。
整个大量命令的输出将只是一个数字。视频持续的秒数。它应该适用于所有视频格式。
请注意,这只是持续时间。至于视频编码器和音频编码器,您需要使用类似的方法,最终减去数学。通用解决方案将是:
ffmpeg -i MOVIE.AVI 2>&1 | grep 'Something unique to the line you want' | cut -d ' ' -f <the "section" you want>
可以将其输出可以继续在外壳中解析(就像我在时间上一样),也可以将其传递给PHP。
其他提示
我会看看 媒体信息. 。如果您传递 - 输出= XML,它将给您类似的东西:
<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo>
<File>
<track type="General">
<Complete_name>Movie.webm</Complete_name>
<Format>Matroska</Format>
<File_size>215 MiB</File_size>
<Duration>28mn 39s</Duration>
<Overall_bit_rate>1 049 Kbps</Overall_bit_rate>
<Movie_name>Safari</Movie_name>
<Writing_application>Lavf52.78.0</Writing_application>
<Writing_library>Lavf52.78.0</Writing_library>
</track>
<track type="Video">
<ID>1</ID>
<Format>V_VP8</Format>
<Codec_ID>V_VP8</Codec_ID>
<Duration>28mn 39s</Duration>
<Bit_rate>529 Kbps</Bit_rate>
<Width>768 pixels</Width>
<Height>432 pixels</Height>
<Display_aspect_ratio>16:9</Display_aspect_ratio>
<Frame_rate>25.000 fps</Frame_rate>
<Bits__Pixel_Frame_>0.064</Bits__Pixel_Frame_>
<Stream_size>108 MiB (50%)</Stream_size>
<Language>Norwegian</Language>
</track>
<track type="Audio">
<ID>2</ID>
<Format>Vorbis</Format>
<Format_settings__Floor>1</Format_settings__Floor>
<Codec_ID>A_VORBIS</Codec_ID>
<Duration>28mn 39s</Duration>
<Bit_rate_mode>Constant</Bit_rate_mode>
<Bit_rate>500 Kbps</Bit_rate>
<Channel_s_>2 channels</Channel_s_>
<Sampling_rate>48.0 KHz</Sampling_rate>
<Resolution>16 bits</Resolution>
<Stream_size>102 MiB (48%)</Stream_size>
<Writing_library>libVorbis 20090709 (UTC 2009-07-09)</Writing_library>
<Language>Norwegian</Language>
</track>
</File>
</Mediainfo>
可能想尝试这个家伙。当您可以利用图书馆时,总是很好:http://www.phpclasses.org/browse/file/1582.html