ffmpeg和php从视频中获取图像并将视频转换为ogg

son*_*rma 6 php video ffmpeg

我有一个视频托管网站,并已在我的本地服务器上成功安装了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)

Dav*_*ain 6

既然你实际上有三个问题让我逐步完成这个问题,但首先我对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从多媒体流中收集信息并以人类和机器可读的方式打印出来......

因此,要使用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命令的以下信息.

请注意,在大多数格式中,无法精确搜索,因此ffm​​peg将在位置之前寻找最接近的搜索点.当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃.在进行流复制时或使用-noaccurate_seek时,它将被保留.

还要确保输出路径是可写的.否则,您将收到如下错误:

[image2 @ 0x35ae280] Could not open file : /output/path/to/your/file
Run Code Online (Sandbox Code Playgroud)

Theora和Vorbis编码


这是我唯一无法测试的东西,因为我的ffmpeg构建没有

--enable-libtheora

您可以通过以上信息告诉我们.您基本上需要编译ffmpeg以使所需的库能够进入和解码为Theora视频格式和Vorbis音频格式.

这里有一些信息可以帮助您入门.

简短的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)

以下是可以找到大部分信息的链接.

希望这可以帮助.