由于您实际上有一个三合一的问题,让我一步一步地完成这个问题,但首先我已经测试过有关 ffmpeg 构建的版本和启用功能的一些信息。
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Hyper fast Audio and Video encoder
持续时间
既然您已经安装了 ffmpeg,那么您可能也安装了 ffprobe。
ffprobe
ffprobe 从多媒体流中收集信息并以人类和机器可读的方式打印出来...
所以要使用 ffprobe 获取持续时间,您可以执行以下操作:
exec('ffprobe -i input-file.mp4 -show_format | grep duration 2>&1', $result);
echo "<pre>";
var_dump($result[0]); // string(19) "duration=104.022000"
echo "</pre>";
-- 更新--
LordNeckbeard 非常友好地指出,这里没有必要使用 grep 实用程序。而且由于它是一个基于 Unix 的工具,因此并不存在于所有操作系统上,因此他的建议是绝对正确的。
所以这是一个不使用grep 的示例,可以在以下http://trac.ffmpeg.org/wiki/FFprobeTips 页面上找到。
exec('ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input-file.mov 2>&1', $result);
echo "<pre>";
var_dump($result[0]); // string(11) "5634.401068"
echo "</pre>";
缩略图
ffmpeg 文档页面上有一个示例,它解释了如何使用以下参数从视频通话 ffmpeg 中提取多个缩略图:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这将每秒从视频中提取一个视频帧,并将它们输出到名为 foo-001.jpeg、foo-002.jpeg 等的文件中。图像将重新缩放以适应新的 WxH 值。
如果您只想提取有限数量的帧,可以使用上述命令结合 -vframes 或 -t 选项,或结合 -ss 从某个时间点开始提取。
要从某个时间点提取一个缩略图,您必须将-ss 命令与-vframes(-frames:v 的别名)结合使用。
这是一个示例:
exec('ffmpeg -i input.mp4 -r 1 -ss 00:00:50 -vf scale=1024:-1 -vframes 1 output.jpeg 2>&1', $result);
echo "<pre>";
print_r($result);
echo "</pre>";
但请注意-ss 命令的以下信息。
请注意,在大多数格式中,不可能精确查找,因此 ffmpeg 将查找位置之前最近的查找点。当转码和 -accurate_seek 启用(默认)时,搜索点和位置之间的这个额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,将被保留。
还要确保您的输出路径是可写的。否则你会得到一个看起来像这样的错误:
[image2 @ 0x35ae280] Could not open file : /output/path/to/your/file
Theora 和 Vorbis 编码
这是我唯一无法测试的东西,因为我的 ffmpeg 版本没有
--enable-libtheora
从上面的信息可以看出标志。您基本上需要编译 ffmpeg 以使所需的库能够对 Theora 视频格式和 Vorbis 音频格式进行编码和解码。
这里有一些信息可以帮助您开始。
A Brief Theora and Vorbis Encoding Guide
如果您有使用上述库的自定义构建,您应该能够执行以下操作:
exec('ffmpeg -i input.mkv -codec:v libtheora -qscale:v 7 -codec:a libvorbis -qscale:a 5 output.ogv 2>&1', $result);
echo "<pre>";
print_r($result);
echo "</pre>";
Here 是可以找到大部分这些信息的链接。
希望这会有所帮助。