我的博客地址:
http://www.xixinice.comphp
PHP 使用 PHP-FFMpeg 作視頻水印 遇到的keng,git
關於 "Encoding failed", "Unknown encoder 'libfaac'" 的處理github
使用 PHP-FFMpeg 作視頻水印
demo 以下:app
$ffmpeg = FFMpegFFMpeg::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 FFMpegFormatVideoX264(), 'export-x264.mp4')
error:
1.save() 方法時候 時候會報錯:ide
Encoding failed
錯誤位置
FILE: /xxx/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/AbstractVideo.php LINE: 106oop
2.這邊是catch 了 error,去掉 try catch,報錯以下。this
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 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"code
把它放到命令行去執行,會報錯:
Unknown encoder 'libfaac'orm
至此,也就找打了關鍵所在,是少了'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 FFMpegFormatVideoX264('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
參考資料: