【问题标题】:ffmpeg and php to get an image out of a video and convert video to oggffmpeg 和 php 从视频中获取图像并将视频转换为 ogg
【发布时间】:2015-08-06 05:53:40
【问题描述】:

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

【问题讨论】:

  • 为什么要在 OGG 中使用 Theora?如果您打算朝那个方向发展,那么为什么不在 WebM 中使用 VP8(或 VP9)呢?这是一种更现代的视频格式,而且(我猜这里)支持 Theora + OGG 的浏览器应该支持 VP8 + WebM。

标签: php video ffmpeg


【解决方案1】:

由于您实际上有一个三合一的问题,让我一步一步地完成这个问题,但首先我已经测试过有关 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 是可以找到大部分这些信息的链接。

希望这会有所帮助。

【讨论】:

  • 不错的答案,但您可以通过修改 ffprobe 命令来删除 grep 进程,如 FFmpeg Wiki: FFprobe Tips 中的持续时间示例所示。另外,scale filter-s 灵活得多,所以你可以用-vf scale=1024:-1 代替,只需要提供宽度或高度; ffmpeg 将在保留方面的同时计算另一个。
  • @LordNeckbeard - 感谢您的提示,完全不知道这一点,学到了新东西,很棒。更新了答案。
【解决方案2】:

对于 Linux:

//video converting...
shell_exec("$ffmpegPath  -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libx264 -acodec libfdk_aac sample.mp4");//for mp4
shell_exec("$ffmpegPath  -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libtheora -acodec libvorbis sample.ogg");//for ogg
shell_exec("$ffmpegPath  -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libvpx-acodec libvorbis sample.webm");//for webm

//Get theumbnail
shell_exec("$ffmpegPath -i input.flv -ss 00:00:14 -vframes 1 sample.png");
//you can change the -ss value you want.
//then if u want to check if you have already install ur ffmpeg just type in your terminal in linux "ffmpeg" see pic below

更多信息在这里https://www.ffmpeg.org/documentation.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多