- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想要一个 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
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
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)
轻松解析.
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>
关于php - 查询音视频文件信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936816/
我是 Arduino 的新手(因为这个周末我必须学习它来完成一个学校项目)并且我无法让我的压电扬声器为闹钟发出声音。当草图运行时,一切正常。 LED 闪烁,但蜂鸣器不发声,这很奇怪,因为 LED 和蜂
我想知道是否有人遇到过在 iPhone SDK 中生成铃声的方法。我正在尝试生成 DTMF 音调,但似乎找不到任何实质性内容。我还希望能够指定播放音调的时间(即模拟按住按钮而不是简单地按下按钮....
我正在尝试制作一个可以在 Octave 音阶中水平滚动的钢琴应用程序。下面是另一个我尝试做的钢琴应用程序的示例。箭头在钢琴上滚动 Octave 。我已经了解了scrollview,但是似乎只允许通过滑
我正在我的 Android 应用程序中使用文本转语音 - TTS。我已经粘贴了下面的代码。TTS 工作正常,但是它说的语音/文本不是很清楚。它说的真的快速,以至于它不是完全可以理解的.. 我尝试设置
我正在调用一个带有号码的通话应用程序,然后通过 发送 dtmf 音 String number = "tel:+1234567,890#"; Intent c1 = new Intent(androi
我正在开展一个项目,该项目要求我的应用能够在通话期间以语音的上行链路频率发送 DTMF 音。 我的两个条件是: 我们不使用定制的 Android 平台 我们不需要root手机 我花了几天时间做功课,并
我需要制作一个IVR -auto dialer应用程序,它 => 调用免费电话 => 然后选择一个选项继续 => 然后输入一些代码 => 然后几秒钟后(一些广告/说 30 秒)需要输入另一个选项 前三
在我的 Twilio基于应用程序我通过 Twilio REST 创建拨出电话API。 当目标方响应时,我将他/她放到最近创建的 session 中。 在让他/她参加 session 之前,如何播放特定
Twilio 未从 Skype 检测到我的 DTMF 音。 我们用 twilio 建立了一个 IVR 系统,客户必须输入一个 7位客户编号。 我们的一些客户使用 voip 电话, 因此我们需要确保 t
我想在我的应用程序中以编程方式发送DTMF 铃声。在搜索时我找到了一个方法 public void playDtmfTone(字符数字) 这是 google 在 android 中发送 DTMF 的新
我读过一些有关 Android 中 DTMF 的文章。我想不可能通过流式传输 .wav 文件(或其他格式)进行自动电话调用并检测其他人(调用接收者)的输入。 我想制作一个应用程序来调用我/或其他人,并
我是一名优秀的程序员,十分优秀!