个性化阅读
专注于IT技术分析

如何在Symfony 3中使用FFMpeg将webm视频转换为mp4

本文概述

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中的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格式。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中使用FFMpeg将webm视频转换为mp4

评论 抢沙发

评论前必须登录!