2013-03-14 109 views
2

我最近开始了一个网站,用户可以上传视频到上工作,我用的ffmpeg一个初学者,但我一直在寻找,寻找如何做这些事情,我想要做,但是其中大部分都不适合我。FFMPEG用PHP转换视频的MP4和快照

我想任何视频类型转换为.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的视频?

+0

如果你想要真正高质量的截图,请删除.jpg并使用.png – Havenard 2013-03-14 22:12:42

+0

1080p视频是'-s 1920x1080'和720p视频是'-s 1280x720' – Havenard 2013-03-14 22:15:24

+0

好的,我确实使用过720p视频,但它是与原始图像相比仍然有点像。 – 2013-03-14 22:25:17

回答

4

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

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

我这里假设视频将要可能使用Flash播放器,或HTML5播放器(JWPlayer既是,例如)在网站上播放。

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

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

你或许应该使用ABR或CBR模式,如果你想确保predictible网络吞吐量,或者CRF模式(18至20会给你带来很大的质量),如果你担心主要是关于质量。

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

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

-vf "scale=-1:720" 

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

请注意,实际制作较大的视频并不会提高其质量,反而会增加处理时间以及文件大小。

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

您必须使用类似qt-faststart或MP4Box的工具来修改文件以将MOOV原子置于开头。

1

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