我想要一个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

成立 http://getid3.sourceforge.net/ 搜索PHP音频解析器

希望这可以帮助,

Chears

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top