本文概述
WebM是一种开放的, 免版税的, 用于Web的媒体文件格式, 用于定义文件容器结构, 视频和音频格式。 WebM文件包含使用VP8或VP9视频编解码器压缩的视频流和使用Vorbis或Opus音频编解码器压缩的音频流。 WebM文件结构基于Matroska容器。 WebM是100%免费的, 并根据BSD样式的许可证开源。许多基于WebRTC的开源项目, 例如, 允许你从浏览器录制视频并将其上传到你的服务器, 并使用webm格式, 因为它是网络上最知名的格式之一。
有时, 由于各种原因, 你的用户将需要在浏览器外部录制的视频, 并且你的项目可能还需要通过简单地将视频转换为mp4版本, 从而为此类用户提供支持, 使其也可以在多个平台上播放。在本文中, 我们将与你分享一个有用的片段, 该片段使用PHP FFMpeg轻松将webm视频转换为mp4。
1.安装FFMpeg二进制文件
第一步, 你需要在开发计算机上安装FFMpeg。 FFmpeg是领先的多媒体框架, 能够解码, 编码, 转码, mux, demux, 流, 过滤和播放人类和机器创建的几乎所有内容。它支持最模糊的古代格式, 直至最前沿。无论它们是由某些标准委员会, 社区还是公司设计的。它还具有高度的可移植性:FFmpeg可以在各种构建环境, 机器体系结构和配置下, 跨Linux, Mac OS X, Microsoft Windows, BSD, Solaris等编译, 运行并通过我们的测试基础架构FATE。
为了将视频从webm转换为mp4, 我们将运行一些命令, 使你可以使用第三方PHP PHP库来实现此目的。你可以在其他平台上安装FFMpeg:
视窗
要在Windows中使用ffmpeg, 你需要从该网站下载二进制文件。如果你在窗口中, 还需要从路径中获得ffmpeg命令, 例如, 你应该能够在命令提示符下运行ffmpeg -version命令来打印ffmpeg的版本:
如果你不想在Windows中将可执行文件添加为环境变量, 则可以稍后在使用PHP创建ffmpeg实例的过程中设置二进制路径:
$ffmpeg = FFMpeg\FFMpeg::create(array(
'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg', 'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process
'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use
), $logger);
的Ubuntu
只需从终端运行以下命令:
sudo apt-get install ffmpeg
有关在其他操作系统上安装的更多信息和步骤, 请访问ffmpeg网站的官方下载页面。
2.安装PHP FFMpeg
为了使用PHP与FFMpeg进行交互, 你将需要编写自己的ffmpeg命令以使用shell_exec来执行它们, 或者使用为你执行此操作的库。我们正在谈论PHP-FFMpeg, 这是一个面向对象的库, 使你可以使用友好的开发人员语法使用FFmpeg / AVConv转换视频/音频文件。在Symfony项目中安装此库的首选方法是使用composer。
要将包装器添加到项目中, 请在终端(位于symfony项目的根目录中)中执行以下命令:
composer require php-ffmpeg/php-ffmpeg
安装后, 你将能够使用该库的名称空间。
3.转换视频
现在, 你已经在开发计算机上安装了ffmpeg并使用PHP编写了转换逻辑的包装器, 我们终于可以继续使用代码对其进行转换了。第一步, 你需要包括ffmpeg必需的名称空间, 在这种情况下, 我们只需要FFMpeg工具和x264类即可将视频转换为Mp4。你需要创建FFMpeg的静态实例并将其存储到变量中, 你可以按照文档中提到的方法在此方法中提供其他设置。
接下来, 你需要获取要转换的webm视频的绝对路径, 并将其作为我们先前创建的媒体处理对象的open方法的第一个参数提供。此方法返回一个Video对象, 该对象可用于保存, 进行修改等。在这种情况下, 我们只想将其保存为另一种格式, 因此你将需要创建X264编解码器的实例并将其作为第一个参数提供视频的保存方法。作为第二个参数, 你需要提供新mp4文件的目标路径, 仅此而已!
注意
作为《我们的代码世界》中的每个代码示例, 我们都尽可能地简单地编写它, 以使每个人都能理解它。你显然可以将其创建为一项服务, 以使你的控制器保持精简。
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
// Use the FFMpeg tool
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
// Create an instance of FFMpeg
$ffmpeg = FFMpeg::create();
// In this example we have a path for the videos
$videosDirectory = $this->get('kernel')->getRootDir() . '/../web/uploads';
// Open the webm video providing the absolute path
$video = $ffmpeg->open($videosDirectory . '/video.webm');
// Configure the new mp4 formax (x264)
$mp4Format = new X264();
// Fix for error "Encoding failed : Can't save to X264"
// See: https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues/310
$mp4Format->setAudioCodec("libmp3lame");
// Save the video in the same directory with the new format
$video->save($mp4Format, $videosDirectory . '/video.mp4');
return new Response("webm video succesfully converted to mp4");
}
}
访问以前的控制器的索引路由后, 现在在uploads目录中应该有2个文件, 原始的webm视频和新版本的mp4格式。
编码愉快!
评论前必须登录!
注册