繁体   English   中英

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

请注意,实际上将视频放大是无法改善质量,反而会增加处理时间以及文件大小。

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

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

您是否尝试过-preset veryslow -qp 0 阅读SirDarius的建议链接,将其作为预设以实现无损H.264最佳压缩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM