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录制视频

问题是否由错误编码引起


谢谢

当遇到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);