gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:46:22 24 4
gpt4 key购买 nike

我最近开始开发一个用户可以上传视频的网站,我是 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 的原子,它是描述文件内容的数据 block 。播放器软件需要读取此 block 才能开始播放,如果在磁盘上找到该文件,则在本地这不是问题,但如果在文件末尾找到该文件,则从 HTTP 下载时会阻止文件播放,因为必须先下载整个文件才能开始播放。你猜怎么着,FFMpeg 将 MOOV 原子放在文件末尾,因此默认情况下它不适合 HTTP 渐进式播放。

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

关于php - FFMPEG 与 PHP 将视频转换为 mp4 和快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15421161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com