PHP 使用PHP-FFMpeg做视频水印 遇到的坑

sanlanlan 2020-9-14 标签: PHP 浏览:1375 评论:0

PHP 使用 PHP-FFMpeg 做视频水印 遇到的keng,

关于  "Encoding failed",  "Unknown encoder 'libfaac'"  的处理



使用 PHP-FFMpeg 做视频水印
demo 如下:

$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
));

$video = $ffmpeg->open('video.mpg');

$relative = array(
    'position'=>'relative',
    'bottom'=>50,
    'right'=>50
);
 
$image = '/xxx/watermarkMark.png';           

$video->filters()->watermark($image, $relative);

$video->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')


error:
1.save() 方法时候 时候会报错:

Encoding failed
错误位置
FILE: /xxx/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php  LINE: 106

2.这边是catch 了 error,去掉 try catch,报错如下。

ffmpeg failed to execute command '/usr/local/bin/ffmpeg' '-y' '-i' '/xxx/input.mp4' '-vcodec' 'libx264' '-acodec' 'libfaac' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '128k' '-vf' 'movie=/xxx/waterMark.png [watermark];[in][watermark] overlay=50:80 [out]' '-pass' '1' '-passlogfile' '/var/tmp/ffmpeg-passesabcdefg/pass-abcdf' '/xxx/output.mp4'
错误位置
FILE: /xxx/vendor/alchemy/binary-driver/src/Alchemy/BinaryDriver/ProcessRunner.php  LINE: 100


'-acodec' 'libfaac',可以看出 这边encode 使用了 "libfaac"

把它放到命令行去执行,会报错:
Unknown encoder 'libfaac'

至此,也就找打了关键所在,是少了'libfaac'

但是,去查找这个配置的时候,会发现找不到这个。
configuration: --prefix=
Options  --with 
这2个都没有。

3.原因是官方已经移除了,现在用 'libfdk_aac' 来代替了,但是 github 库没有更新


libfaac is a crappy encoder; there are better alternatives.
FFmpeg removed libfaac support.


4.所以代码这边需要自己传参数,不能使用默认
同时安装的时候,option 必须带上参数 --with-fdk-aac

原代码:  
public function __construct($audioCodec = 'libfaac', $videoCodec = 'libx264')
{
    $this
        ->setAudioCodec($audioCodec)
        ->setVideoCodec($videoCodec);
}

所以new 的时候需要传参数:
new FFMpeg\Format\Video\X264('libfdk_aac')

这样即可以。

ps:
直接使用ffmpeg 命令行 生成:

ffmpeg -i input.mp4 -i watermark.jpg -filter_complex 'overlay' output.mp4

//设置水印位置

ffmpeg -i input.mp4 -i watermark.jpg -filter_complex "overlay=x=10:y=10" output.mp4



参考资料:

https://stackoverflow.com/questions/19774975/unknown-encoder-libfaac


本文相关标签: php

发表评论: