【发布时间】:2021-09-20 08:53:49
【问题描述】:
是否可以使用 PHP 在上传的视频上录制声音?
【问题讨论】:
标签: php video video-streaming
是否可以使用 PHP 在上传的视频上录制声音?
【问题讨论】:
标签: php video video-streaming
不,你不能,至少不能只使用 PHP,因为 PHP 本身不提供录制声音和编辑视频所需的库。
要实际录制视频和声音,您需要在服务器上安装像 ffmpeg(有 a handy extension for PHP)用于视频编辑和 SoX 用于声音的库。例如,您可以使用 PHP 中的@987654324@ 函数访问这些程序。不过,实现不会那么简单。
【讨论】:
您可以使用 MLT 库和我的课程。你可以从这个链接下载它https://github.com/1fer/mlt
要在服务器上安装这个融化库,请使用以下命令:
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/
【讨论】:
我会说不,因为我不知道 PHP 有任何硬件层(客户端)...可能可以使用 AJAX,但我不认为所以。
但是 PHP 可能能够用提供的声音文件覆盖视频,如果你找到了一个库,这应该可以工作。
【讨论】:
奇怪的想法。
PHP 用于服务器端脚本,但只能在客户端录制语音(需要声卡/编解码器)
PHP 无能为力。
如果您在客户端询问 JavaScript,它可能会更加相关。
但是,如果 Adobe Flash 技术,最适合此类任务的使用和功能齐全的东西。
如果您没有注意到 - 如果您右键单击某个 Flash 横幅,您会看到一个属性页面,在该页面的其他功能上方您可以看到录音。
【讨论】:
从技术上讲,您可以编写一个与 C 库绑定以进行音频/视频编辑的 PHP 插件。但是,这可能不是最好的路径。更好的选择是从 PHP 调用 ffmpeg/mencoder/... 进程。
【讨论】:
PHP 用于服务器端脚本,但只能在客户端录制声音(需要声卡/编解码器)
PHP 无能为力。
【讨论】:
您可以使用 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();
}
图书馆是开源的,但它本身的平台是一项付费服务,提供免费帐户选项。
【讨论】: