2

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

4

2 回答 2

4

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 放在开头。

于 2013-03-14T23:00:45.887 回答
1

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

于 2013-05-17T01:01:23.387 回答