gpt4 book ai didi

php - 查询音视频文件信息

转载 作者:可可西里 更新时间:2023-11-01 13:40:44 26 4
gpt4 key购买 nike

我想要一个 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 尝试理解输出,实际上会更快。几个月前,我出于类似目的开发了以下 shell 命令。

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表示显示 MOVIE.AVI 的信息 ( -i)。 2>&1我相信将输出重定向到管道而不是屏幕(这是很久以前做的,所以我不清楚)
grep 'Duration'将获取输入(这是 ffmpeg -i MOVIE.AVI 2>&1 的输出),找到单词“Duration”,并仅输出包含该单词的行。
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

换句话说,包含“持续时间”的行的第四个“部分”是实际持续时间……以小时、分钟和秒为单位(小数点后 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 开始在 shell 中工作,则必须删除此小数。命令(我用来从小时、分钟和秒计算秒数)只执行整数数学运算。如果您希望在持续时间内保留小数点,此时您必须将小时、分钟和秒返回给 PHP 并在那里进行解析。通过将上面的内容替换为以下内容最容易做到这一点:
echo $fulltime

这将在您调用 shell_exec() 后向 PHP 返回一个字符串,例如“00:30:00.1”。 ,然后您可以使用 explode(':',$string) 轻松解析.

要继续直接从 shell 获取秒数:

在得到小时、分钟和秒后,神奇的线条出现了:
echo `expr 3600 \* $hour + 60 \* $minute + $second`
expr command 表示执行数学表达式。不幸的是,它相当愚蠢。首先,需要对特殊字符进行转义( * 在 UNIX 中是通配符,因此您必须使用 \* 来表示乘法)。接下来,它只执行整数数学。如您所见,将小时乘以 3600,分钟乘以 60,然后将它们加在一起是相当容易的。

整个庞大命令的输出将只是一个数字。视频持续的秒数。它应该适用于所有视频格式。

请注意,这只是持续时间。至于视频编码器和音频编码器,您可能希望使用类似的方法,最后减去数学。一个通用的解决方案是:
ffmpeg -i MOVIE.AVI 2>&1 | grep 'Something unique to the line you want' | cut -d ' ' -f <the "section" you want>

它的输出可以继续在 shell 中解析(就像我上面对时间所做的那样),也可以将其传递给 PHP。

关于php - 查询音视频文件信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com