我有一个视频托管站点,并且已在本地服务器上成功安装了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.'');
最佳答案
既然您实际上有一个三合一的问题,让我一步一步地进行此操作,但是首先我已经测试了有关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获得持续时间,您可以执行以下操作:
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
要从某个特定时间点提取一个缩略图,您必须将
-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
命令的以下信息。还要确保您的输出路径是可写的。否则,您将收到如下所示的错误:
[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是可以找到大多数这些信息的链接。
希望这可以帮助。
关于php - ffmpeg和php从视频中获取图像并将视频转换为ogg,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31847790/