【问题标题】:Video editing using PHP使用 PHP 编辑视频
【发布时间】:2021-09-20 08:53:49
【问题描述】:

是否可以使用 PHP 在上传的视频上录制声音?

【问题讨论】:

    标签: php video video-streaming


    【解决方案1】:

    不,你不能,至少不能只使用 PHP,因为 PHP 本身不提供录制声音和编辑视频所需的库。

    要实际录制视频和声音,您需要在服务器上安装像 ffmpeg(有 a handy extension for PHP)用于视频编辑和 SoX 用于声音的库。例如,您可以使用 PHP 中的@987654324@ 函数访问这些程序。不过,实现不会那么简单。

    【讨论】:

      【解决方案2】:

      您可以使用 MLT 库和我的课程。你可以从这个链接下载它https://github.com/1fer/mlt

      特点

      • 剪切和加入视频
      • 加入带有转场的视频
      • 10 个带有选项的现成过渡
      • 可自定义的擦除过渡
      • 添加背景音频
      • 添加水印
      • 使用选项添加文本覆盖
      • 添加动画文本
      • 在后台运行渲染
      • 获取渲染进度百分比

      要在服务器上安装这个融化库,请使用以下命令: sudo apt install melt

      查看文档如何使用它,例如,加入剪辑使用此代码:

      require __DIR__ . '/vendor/autoload.php';
      
      $videoProcessing = new Andchir\VideoProcessing([
          'melt_path' => '/usr/bin/melt',
          'session_start' => true
      ]);
      

      // Join clips

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['joinClips' => [
              $rootPath . '/uploads/tmp/Social.mp4',
              $rootPath . '/uploads/tmp/Dog.mp4',
              $rootPath . '/uploads/tmp/Swans.mp4'
          ]])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out1.mp4');
      

      // Black color and fade transition

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              'colour:black', ['out' => 24],
              $rootPath . '/uploads/tmp/Dog.mp4'
          ]])
          ->addOption(['mix' => 25])
          ->addOption(['mixer' => 'luma'])
          ->addOption(['inputSource' => [
              'colour:black', ['out' => 24]
          ]])
          ->addOption(['mix' => 25])
          ->addOption(['mixer' => 'luma'])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out2.mp4'); 
      

      // Join clips with transition

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4',
              $rootPath . '/uploads/tmp/Dog.mp4'
          ]])
          ->addOption(['mix' => 25])
          ->addOption(['mixer' => 'luma'])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out3.mp4'); 
      

      // Cut clips and join with transition

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Social.mp4', ['in' => 200, 'out' => 275]
          ]])
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Dog.mp4', ['in' => 50, 'out' => 125]
          ]])
          ->addReadyMadeTransition('fade', 25)
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['in' => 50, 'out' => 125]
          ]])
          ->addReadyMadeTransition('shiftRightIn', 25, [
              'width' => 1280,
              'height' => 720
          ])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out4.mp4');  
      

      // Add background audio with delay

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['in' => 50, 'out' => 125]
          ]])
          ->disableAudio()
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Dog.mp4', ['in' => 50, 'out' => 200]
          ]])
          ->addReadyMadeTransition('shiftLeftIn', 25)
          ->addBackgroundAudio($rootPath . '/uploads/tmp/Reformat.mp3', ['in' => 0, 'out' => 150, 'delay' => 50])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out7.mp4');
      

      // Add watermark

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['in' => 50, 'out' => 125]
          ]])
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Dog.mp4', ['in' => 50, 'out' => 200]
          ]])
          ->addWatermark($rootPath . '/uploads/tmp/SampleLogo.png', false, [
              'distort' => 1
          ])
          ->addReadyMadeTransition('shiftLeftIn', 25)
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out8.mp4'); 
      

      // Add text overlay

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['out' => 120]
          ]])
          ->addTextOverlay('This is my best video', true, [
              'fgcolour' => '#004fed',
              'olcolour' => '#fff200',
              'outline' => 3,
              'pad' => '50x0',
              'size' => 80,
              'weight' => 700,
              'style' => 'italic',
              'halign' => 'center',
              'valign' => 'top',
              'family' => 'Ubuntu'
          ])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out10.mp4');
      

      // Animated text

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['out' => 120]
          ]])
          ->addTextOverlay('This is my best video', true, [
              'pad' => '50x0',
              'size' => 80,
              'halign' => 'center',
              'valign' => 'top',
              'family' => 'Ubuntu',
              'slideFrom' => 'bottom',
              'duration' => 50,
              'inOpacity' => 0,
              'outOpacity' => 100
          ])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out11.mp4');
      

      // Rendering

      $videoProcessing
          ->setProfile('hdv_720_25p')
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Swans.mp4', ['out' => 120]
          ]])
          ->disableAudio()
          ->addOption(['inputSource' => [
              $rootPath . '/uploads/tmp/Dog.mp4', ['out' => 120]
          ]])
          ->addReadyMadeTransition('shiftLeftIn', 25)
          ->addBackgroundAudio($rootPath . '/uploads/tmp/Reformat.mp3', ['out' => 215])
          ->setOutputVideoOptions($rootPath . '/uploads/tmp/out.mp4');
      

      // Start rendering in background

      $progressLogPath = $videoProcessing->render();  
      

      // Rendering progress

      $percent = $videoProcessing->getRenderingPercent();
      

      您还可以制作一些滤镜效果,如 Instagram 等。在这里阅读更多: https://www.mltframework.org/plugins/PluginsFilters/

      【讨论】:

      • 如何在课堂上设置自定义字体系列?
      • 嗨@AzazKhan,我在答案末尾添加了答案
      • 看起来不错。是否可以添加带有图像背景的文本或类似的东西?就像我的想法是“video1”->“文本解释器”->“video2”这可能吗?
      • 嗨@Toskan,你当然可以。只需使用 addTextOverlay 方法和 addWatermark
      • 事情是 addTextOverlay 覆盖到视频,对吧?因此,一个人从视频中损失了几秒钟。但我认为最简单的解决方案就是为图像+文本本身创建一个视频
      【解决方案3】:

      我会说不,因为我不知道 PHP 有任何硬件层(客户端)...可能可以使用 AJAX,但我不认为所以。

      但是 PHP 可能能够用提供的声音文件覆盖视频,如果你找到了一个库,这应该可以工作。

      【讨论】:

        【解决方案4】:

        奇怪的想法。
        PHP 用于服务器端脚本,但只能在客户端录制语音(需要声卡/编解码器)
        PHP 无能为力。
        如果您在客户端询问 JavaScript,它可能会更加相关。 但是,如果 Adob​​e Flash 技术,最适合此类任务的使用和功能齐全的东西。 如果您没有注意到 - 如果您右键单击某个 Flash 横幅,您会看到一个属性页面,在该页面的其他功能上方您可以看到录音。

        【讨论】:

          【解决方案5】:

          从技术上讲,您可以编写一个与 C 库绑定以进行音频/视频编辑的 PHP 插件。但是,这可能不是最好的路径。更好的选择是从 PHP 调用 ffmpeg/mencoder/... 进程。

          【讨论】:

            【解决方案6】:

            PHP 用于服务器端脚本,但只能在客户端录制声音(需要声卡/编解码器)

            PHP 无能为力。

            【讨论】:

              【解决方案7】:

              您可以使用 PHP 使用第三方服务(如 Shotstack 视频编辑 API)来编辑视频。他们有一个PHP library,可让您执行各种视频编辑和操作。

              该库以 Composer 包的形式提供,因此您可以使用以下方式安装它:

              composer require shotstack/shotstack-sdk-php
              

              以下代码是修剪视频剪辑起点和终点的示例:

              <?php
              
              require 'vendor/autoload.php';
              
              use Shotstack\Client\Api\EditApi;
              use Shotstack\Client\Configuration;
              use Shotstack\Client\Model\Edit;
              use Shotstack\Client\Model\Output;
              use Shotstack\Client\Model\Timeline;
              use Shotstack\Client\Model\Track;
              use Shotstack\Client\Model\Clip;
              use Shotstack\Client\Model\VideoAsset;
              
              $config = Configuration::getDefaultConfiguration()
                  ->setHost('https://api.shotstack.io/stage')
                  ->setApiKey('x-api-key', 'REGISTER FOR A KEY');
              
              $client = new EditApi(null, $config);
              
              $videoAsset = new VideoAsset();
              $videoAsset
                  ->setSrc('https://s3-ap-southeast-2.amazonaws.com/shotstack-assets/footage/skater.hd.mp4')
                  ->setTrim(3);
              
              $videoClip = new Clip();
              $videoClip
                  ->setAsset($videoAsset)
                  ->setLength(8)
                  ->setStart(0);
              
              $track = new Track();
              $track->setClips([$videoClip]);
              
              $timeline = new Timeline();
              $timeline->setTracks([$track]);
              
              $output = new Output();
              $output
                  ->setFormat('mp4')
                  ->setResolution('hd');
              
              $edit = new Edit();
              $edit
                  ->setTimeline($timeline)
                  ->setOutput($output);
              
              $render = $client->postRender($edit)->getResponse();
              
              sleep(30);
              
              $video = $client->getRender($render->getId())->getResponse();
              
              if ($video->getStatus() === 'done') {
                  echo $video->getUrl();
              }
              
              

              图书馆是开源的,但它本身的平台是一项付费服务​​,提供免费帐户选项。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-16
                • 1970-01-01
                • 2020-06-28
                • 2015-08-18
                • 1970-01-01
                • 2020-01-21
                相关资源
                最近更新 更多