FFMPEG与PHP转换视频到mp4和快照


FFMPEG with PHP convert video to mp4 and snapshots

我最近开始在一个用户可以上传视频的网站上工作,我是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视频?

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像素的高度,但确保输出比例与输入比例相同,因此视频不会变形。

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

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

您必须使用qt-faststart或MP4Box等工具来修改文件,以便将MOOV原子放在开头。

您试过-preset veryslow -qp 0吗?阅读SirDarius建议的链接,作为无损H.264最佳压缩的预设。