我有一个视频托管网站,并已在我的本地服务器上成功安装了ffmpeg.事情总体上起作用,但我无法获得视频时长,也不知道如何将视频转换为ogg格式.我可以将视频转换为mp4但不确定相同的代码是否也可以转换为ogg.
还有一件事是我可以在视频开头从视频中获取缩略图,但我想在50秒后获得它.
$base = basename($uploadfile, $safe_file['ext']);
$new_file = $base.'mp4';
$new_image = $base.'jpg';
$new_image_path = $live_img.$new_image;
$new_flv = $live_dir.$new_file;
equire 'vendor/autoload.php';
//ececute ffmpeg generate mp4
exec('ffmpeg -i '.$uploadfile.' -f mp4 -s 896x504 '.$new_flv.'');
//execute ffmpeg and create thumb
exec('ffmpeg -i '.$uploadfile.' -f mjpeg -vframes 71 -s 768x432 -an '.$new_image_path.'');
Run Code Online (Sandbox Code Playgroud)
既然你实际上有三个问题让我逐步完成这个问题,但首先我对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
Run Code Online (Sandbox Code Playgroud)
由于你安装了ffmpeg,你可能也有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>";
Run Code Online (Sandbox Code Playgroud)
- 更新 -
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>";
Run Code Online (Sandbox Code Playgroud)
ffmpeg docs页面上有一个示例,它解释了如何使用以下参数从调用ffmpeg的视频中提取多个缩略图:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
Run Code Online (Sandbox Code Playgroud)
这将从视频中每秒提取一个视频帧,并将其输出到名为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>";
Run Code Online (Sandbox Code Playgroud)
但请注意有关该-ss命令的以下信息.
请注意,在大多数格式中,无法精确搜索,因此ffmpeg将在位置之前寻找最接近的搜索点.当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃.在进行流复制时或使用-noaccurate_seek时,它将被保留.
还要确保输出路径是可写的.否则,您将收到如下错误:
[image2 @ 0x35ae280] Could not open file : /output/path/to/your/file
Run Code Online (Sandbox Code Playgroud)
这是我唯一无法测试的东西,因为我的ffmpeg构建没有
--enable-libtheora
您可以通过以上信息告诉我们.您基本上需要编译ffmpeg以使所需的库能够进入和解码为Theora视频格式和Vorbis音频格式.
这里有一些信息可以帮助您入门.
如果您有使用上述库的自定义构建,则应该能够执行以下操作:
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>";
Run Code Online (Sandbox Code Playgroud)
以下是可以找到大部分信息的链接.
希望这可以帮助.