PHP FFMpeg:如何正确连接两个视频?
情况: 我需要它连接成一个单一的视频多个视频PHP FFMpeg:如何正确连接两个视频?,php,laravel,laravel-5,ffmpeg,ffmpeg-php,Php,Laravel,Laravel 5,Ffmpeg,Ffmpeg Php,情况: 我需要它连接成一个单一的视频多个视频 我正在使用图书馆 但我没能成功 视频: 这些视频是用电脑录制的 视频格式为:video/webm;编解码器=h264 音频格式为opus recorder = new MediaRecorder(this.stream, { mimeType: 'video/webm;codecs=h264' }) 使用PHP-FFMPEG(使用saveFromSameCodecs)进行CONCAT: 这就是我如何使用saveFromSameCodecs: (
我正在使用图书馆
但我没能成功 视频: 这些视频是用电脑录制的
视频格式为:
video/webm;编解码器=h264
音频格式为opus
recorder = new MediaRecorder(this.stream, {
mimeType: 'video/webm;codecs=h264'
})
使用PHP-FFMPEG(使用saveFromSameCodecs)进行CONCAT:
这就是我如何使用saveFromSameCodecs
:(我已经检查了路径,并且正确无误) 但它失败,并显示以下错误消息: ffmpeg无法执行命令'/usr/local/bin/ffmpeg'-f''concat'-safe''0'-i'/private/var/folders/dw/919v2nds7s78pz_qhp7z9rcm0000gn/T/ffmpeg-concath1kHiX'-c''copy'/Users/francescomussi/Desktop/Apps/cameraProject/back-end/camera laravel/storage/app/public/videos/output.mp4' CONCAT使用FFMPEG命令行: 关于@RolandStarke和@LordNeckbeard的建议,我尝试使用,以更好地了解正在发生的事情 如果使用以下命令行:
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
我得到以下错误,与音频opus编解码器有关
如果我使用以下命令行,将音频编码转换为acc
:
ffmpeg -f concat -safe 0 -i mylist.txt -c:v copy -c:a aac output.mp4
最终视频被正确创建,作为其他视频的串联
使用PHP-FFMPEG的CONCAT:(使用savefromDifferentDecs)
似乎问题只与编解码器有关。
因此,我尝试使用savefromthefferentdecs
:
$format = new FFMpeg\Format\Video\X264('libfdk_aac', 'libx264');
$result = $video1
->concat([$path1, $path2])
->saveFromDifferentCodecs($format, $output_path);
但我仍然得到一个错误:
ffmpeg无法执行命令'/usr/local/bin/ffmpeg'-i'/Users/francescomussi/Desktop/Apps/cameraProject/back-end/camera laravel/storage/app/public/videos/test1.mp4'-i'/Users/francescomussi/Desktop/Apps/camera laravel/storage/app/public/videos/test2.mp4'-filter_complex'[0:v:0][0:a:0][1:a:0]concat=n=2:v=1:a=1[v][a]“”-map'[v]“”-map'[a]'-b:a''128k'/Users/francescomussi/Desktop/Apps/cameraProject/back-end/camera-laravel/storage/app/public/videos/output.mp4'
CONCAT使用PHPFFMPEG(但使用不同的视频):
如果问题仅与编解码器有关,则使用两种不同的视频进行视频编解码器:h264
和音频编解码器aac
,应该可以工作,但不能:
ffmpeg failed to execute command '/usr/local/bin/ffmpeg' '-f' 'concat' '-safe' '0' '-i' '/private/var/folders/dw/919v2nds7s78pz_qhp7z9rcm0000gn/T/ffmpeg-concatoJGhLt' '-c' 'copy' '/Users/francescomussi/Desktop/Apps/cameraProject/back-end/camera-laravel/storage/app/public/videos/output.mp4'
但是使用命令行它工作得很顺利:ffmpeg-f concat-safe 0-i mylist.txt-c copy output.mp4
使用shell\u exec:CONCAT
我已经尝试使用shell_exec,前两个视频(opus编解码器):
而且工作很顺利。
创建最终输出,并使用acc音频编解码器
测试库:
为了查看php mpeg是否真的工作,我通过对视频进行基本的调整大小来测试它,并且它工作正常
简历:
- 使用ffmpeg命令行,一切正常
- 使用shell_exec,一切正常
- 使用php ffmpeg,我总是得到错误
ffmpeg无法执行命令
谢谢 当遇到php ffmpeg问题时,最好的方法是从错误消息中复制命令并将其粘贴到终端中。这将为您提供更好的错误消息 在您的情况下,错误是 ffmpeg无法执行命令'/usr/local/bin/ffmpeg'-f''concat'-safe''0'-i'/private/var/folders/dw/919v2nds7s78pz_qhp7z9rcm0000gn/T/ffmpeg-concath1kHiX'-c''copy'/Users/francescomussi/Desktop/Apps/cameraProject/back-end/camera laravel/storage/app/public/videos/output.mp4 调试这一点有点困难,因为当您尝试在终端中执行ffmpeg命令时,temp文件/private/var/[…]/ffmpeg-concath1kHiX被删除。要测试它,您可以自己创建临时文件,如下所示:
$vidoes = [__DIR__ . '/small.mp4', __DIR__ . '/small.mp4'];
file_put_contents('videolist.txt', implode("\n", array_map(function ($path) {
return 'file ' . addslashes($path);
}, $vidoes)));
现在,您可以在终端中运行ffmpeg命令
ffmpeg -f concat -safe 0 -i videolist.txt -c copy /Users/[...]/videos/output.mp4
#[...]
#File '/Users/[...]/videos/output.mp4' already exists. Overwrite ? [y/N]
#Not overwriting - exiting
因此,在您的案例中,错误是输出文件已经存在。解决方案是使用其他不存在的输出文件,或在连接视频之前将其删除
下面是一个如何连接文件的示例(取自的small.mp4)
正确答案来自@RolandStarke
在这里,我只想列出一系列建议,这些建议可能有助于在处理ffmpeg时调试其他类似问题:
重新安装ffmpeg。可能是缺少选项或缺少编解码器。以下是如何安装(mac),包括所有可能的选项(2018年9月)。我花了30分钟,所以要耐心
brew安装ffmpeg——使用chromaprint——使用fdk aac——使用fontconfig——使用freetype——使用-frei0r——使用游戏音乐emu——使用libass——使用libbluray——使用-libbs2b——使用libcaca——使用libgsm——使用libmodplug——使用librsvg——使用libsoxr——使用libssh——使用libvidstab——使用libvorbis——使用opencore amr--使用-openh264--使用openjpeg--使用openssl--使用opus--使用rtmpdump--使用rubberband--使用-sdl2--使用snappy--使用speex--使用srt--使用tesseract--使用theora--使用工具--使用两个lame--使用wavpack--使用webp--使用-x265--使用xz--使用zeromqlibzeromq--使用zimg
要获得更新的选项列表,您可以运行:brew options ffmpeg
,也可以通过谷歌搜索
尝试执行与您尝试执行的相同的操作,但仅使用ffmpeg命令行。它将提供更多的洞察力和更好的错误报告。例如,对于concat:
ffmpeg-f concat-safe 0-i mylist.txt-c copy output.mp4
检查PHP FFMpeg是否正常工作。康卡特:这是一个比较困难的操作。你可以试着用一个更简单的,看看它是否有效
$vidoes = [__DIR__ . '/small.mp4', __DIR__ . '/small.mp4'];
file_put_contents('videolist.txt', implode("\n", array_map(function ($path) {
return 'file ' . addslashes($path);
}, $vidoes)));
ffmpeg -f concat -safe 0 -i videolist.txt -c copy /Users/[...]/videos/output.mp4
#[...]
#File '/Users/[...]/videos/output.mp4' already exists. Overwrite ? [y/N]
#Not overwriting - exiting
<?php
require 'vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open(__DIR__ . '/small.mp4');
$video
->concat([__DIR__ . '/small.mp4', __DIR__ . '/small.mp4'])
->saveFromSameCodecs(__DIR__ . '/out-'. time() . '.mp4', true);