【问题标题】:FFMPEG with PHP convert video to mp4 and snapshotsFFMPEG 与 PHP 将视频转换为 mp4 和快照
【发布时间】:2013-03-14 22:10:18
【问题描述】:

我最近开始在一个用户可以上传视频的网站上工作,我是 ffmpeg 的初学者,但是我一直在寻找和寻找如何做这些我想做的事情,但大多数都不是不为我工作。

我想将任何视频类型转换为.mp4 并尽可能保持质量。现在我的代码只适用于 .mov.mp4 上传,但是 .avi 没有转换(它甚至不会为这些文件创建新文件)。

我也想从视频中截取高质量的截图,但是我现在得到的截图质量似乎非常低,所以我不知道这是怎么回事。

我现在使用的代码是这样的:

$ffmpeg = "/Users/USERNAME/ffmpeg/ffmpeg";
$src    = "/Applications/MAMP/htdocs/lounge/videos/".$filename."_original.".$ext;
$img    = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_1.jpg";
$img2   = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_2.jpg";
$img3   = "/Applications/MAMP/htdocs/lounge/videos/thumbnails/".$filename."_3.jpg";
$video  = "/Applications/MAMP/htdocs/lounge/videos/".$filename.".mp4";

$src = preg_replace("/ /", "\ ", $src);
$img = preg_replace("/ /", "\ ", $img);

$imgOutput  = shell_exec("$ffmpeg -ss 1 -i $src -s 960x540 -f image2 -vframes 1 $img");
$imgOutput2 = shell_exec("$ffmpeg -ss 15 -i $src -s 960x540 -f image2 -vframes 1 $img2");
$imgOutput3 = shell_exec("$ffmpeg -ss 30 -i $src -s 960x540 -f image2 -vframes 1 $img3");

$videoOuput = shell_exec("$ffmpeg -y -i $src 2>&1 -s vga $video");

如何输出 720p 或 1080p 视频?

【问题讨论】:

  • 如果你想要高质量的截图,放弃那个 .jpg 并使用 .png
  • 1080p 视频是-s 1920x1080,720p 视频是-s 1280x720
  • 好吧,我确实使用了 720p 视频,但与原始视频相比,它仍然有点像素化。
  • 原件尺寸是多少?因为将不良视频拉伸到 720p 不会提高其质量。
  • 我刚刚测试的最后一张图片是 720p 视频,但我还是将其转换为 720p,所以它显示了质量差异,这比我想要的要差。 (虽然我知道你不能得到确切的质量,但它应该能够接近)

标签: php macos ffmpeg html5-video video-encoding


【解决方案1】:

FFMpeg 是一个非常强大的解决方案,但是您需要习惯它的众多选项才能获得您想要的。

首先,您需要确定播放视频的软件/硬件。

我在这里假设视频将在可能使用 Flash 播放器或 HTML5 播放器(例如,JWPlayer 两者兼有)的网站上播放。

然后,您需要找到最适合您所需质量的视频和音频格式。 请注意.mp4 只是一个容器,可以包含各种视频和音频格式。 FFMpeg 足够智能,默认情况下将 AVC (H.264) 用于视频,将 AAC 用于音频,这很好,但可能不会给你完美的结果,除非你指定你想要的比特率或质量。

在继续下一步之前,请阅读这个非常有用的链接http://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide

如果您想确保可预测的网络吞吐量,您可能应该使用 ABR 或 CBR 模式,或者如果您主要关心质量,则应该使用 CRF 模式(18 到 20 会提供出色的质量)。

调整视频大小本身就是一个复杂的话题。您会发现自己面对的是具有非方形样本纵横比的视频,这意味着该视频的观看尺寸与实际宽度或高度不同,或者只是您将尝试以 4:3 比例观看的视频调整为 16:9 的比例,导致变形。

使用-s 选项实际上会插入一个scale 过滤器,该过滤器默认使用双线性过滤算法来调整视频帧的大小。这通常足以满足您的需求,但如果您要对视频执行其他处理步骤,有时明确使用过滤器会更有趣。例如:

-vf "scale=-1:720"

这强制720像素的高度,但确保输出比例与输入比例相同,因此视频不会变形。

请注意,实际上将视频放大并不会提高其质量,而是会增加处理时间以及文件大小。

最后,在对将通过 HTTP 播放的文件进行 MP4 编码后,必须注意一个问题。 MP4 文件包含一个称为 MOOV 的原子,它是描述文件内容的数据块。播放器软件需要读取此块才能开始播放,如果在磁盘上找到文件,这在本地不是问题,但如果在文件末尾找到文件,则在从 HTTP 下载时阻止文件播放,因为必须先下载整个文件才能开始播放。 猜猜看,FFMpeg 将 MOOV atom 放在文件末尾,因此默认情况下不适合 HTTP 渐进式播放。

您必须使用 qt-faststart 或 MP4Box 之类的工具来修改文件以将 MOOV atom 放在开头。

【讨论】:

    【解决方案2】:

    你试过-preset veryslow -qp 0吗?阅读 SirDarius 的 suggested link 作为无损 H.264 最佳压缩的预设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 2015-07-02
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多