Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FFMPEG和PHP将视频转换为mp4和快照_Php_Macos_Ffmpeg_Html5 Video_Video Encoding - Fatal编程技术网

FFMPEG和PHP将视频转换为mp4和快照

FFMPEG和PHP将视频转换为mp4和快照,php,macos,ffmpeg,html5-video,video-encoding,Php,Macos,Ffmpeg,Html5 Video,Video Encoding,我最近开始在一个网站上工作,用户可以上传视频到,我是ffmpeg的初学者,但是我一直在搜索如何做这些我想做的事情,但是大多数都不适合我 我想将任何视频类型转换为.mp4,并尽可能保持质量。现在我的代码只适用于.mov和.mp4上传,但是.avi没有转换(它甚至没有为这些文件创建新文件) 我也想从视频中获得高质量的截图,但我现在得到的截图质量似乎很低,所以我不知道这是怎么回事 我现在使用的代码是: $ffmpeg = "/Users/USERNAME/ffmpeg/ffmpeg"; $src

我最近开始在一个网站上工作,用户可以上传视频到,我是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进行音频处理,这很好,但除非指定所需的比特率或质量,否则可能无法提供完美的结果

在继续之前,请阅读此非常有用的链接

如果您想确保可预测的网络吞吐量,您可能应该使用ABR或CBR模式,或者如果您主要关注质量,则使用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 atom放在开头。

您是否尝试过
-preset veryslow-qp 0
?阅读SirDarius'作为无损H.264最佳压缩的预设。

如果你想要真正高质量的屏幕截图,请删除.jpg并使用.png1080p视频
-s 1920x1080
和720p视频
-s 1280x720
好吧,我确实使用了720p视频,然而,与原稿相比,它仍然有点像素化。原稿的大小是多少?因为将一个不好的视频拉伸到720p不会提高其质量。我刚才测试的最后一个图像是一个720p视频,但我正在将其转换为720p,因此它显示了质量差异,这比我想要的更差。(虽然我知道你不能得到确切的质量,但应该可以接近)