I am using laravel 4.2.
I am working on a project in that user can upload a video and I need to transcode it that it can be played over all kind of devices.
For transcoding I have added php-ffmpeg package from git hub in my project. According to the instructions I have downloaded ffmpeg package from http://ffmpeg.zeranoe.com/builds and set the ffmpeg.exe’s path into the environment variable Path.
Now, I tried code below to transcode an uploaded video :
$ffmpeg = FFMpegFFMpeg::create(); $video = $ffmpeg->open($video_path); $format = new FFMpegFormatVideoX264(); $format->setKiloBitrate(1000) ->setAudioChannels(2) ->setAudioKiloBitrate(256); $video->save($format, public_path().$path.$save_filename);
But it gives error as below :
[ERROR] ffmpeg version N-70767-gd24af70 Copyright (c) 2000-2015 the FFmpeg developers [ERROR] built with gcc 4.9.2 (GCC) [ERROR] configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib [ERROR] libavutil 54. 20.100 / 54. 20.100 [ERROR] libavcodec 56. 28.100 / 56. 28.100 [ERROR] libavformat 56. 25.101 / 56. 25.101 [ERROR] libavdevice 56. 4.100 / 56. 4.100 [ERROR] libavfilter 5. 12.100 / 5. 12.100 [ERROR] libswscale 3. 1.101 / 3. 1.101 [ERROR] libswresample 1. 1.100 / 1. 1.100 [ERROR] libpostproc 53. 3.100 / 53. 3.100 [ERROR] [ERROR] Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'http://localhost/ohvideo-ftp/public/temp/5ZPlIuU1AIgz8RR4p0bs.mp4': [ERROR] Metadata: [ERROR] major_brand : mp42 [ERROR] minor_version : 0 [ERROR] compatible_brands: mp42mp41isomavc1 [ERROR] creation_time : 2013-11-09 00:29:52 [ERROR] Duration: 00:00:30.12, start: 0.000000, bitrate: 417 kb/s [ERROR] Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 381 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default) [ERROR] Metadata: [ERROR] creation_time : 2013-11-09 00:29:52 [ERROR] handler_name : L-SMASH Video Handler [ERROR] encoder : AVC Coding [ERROR] Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 32 kb/s (default) [ERROR] Metadata: [ERROR] creation_time : 2013-11-09 00:29:52 [ERROR] handler_name : L-SMASH Audio Handler [ERROR] Unknown encoder 'libfaac' [ERROR] {"error":{"type":"FFMpeg\Exception\RuntimeException","message":"Encoding failed","file":"F:\wamp\www\ohvideo-ftp\vendor\php-ffmpeg\php-ffmpeg\src\FFMpeg\Media\Video.php","line":168}}
After searching alot, I found a link for the solution here, with note that
Zeranoe’s ffmpeg does not contain libfaac support due to that encoder requiring –enable-nonfree which would result in a non-redistributable build.
I don’t get the solution. Can anybody help me to overcome this?
Edit: (working code as below)
I have created a CustomVideo
class the same like class FFMpegFormatVideoX264()
as below:
class CustomVideo extends FFMpegFormatVideoDefaultVideo { /** @var boolean */ private $bframesSupport = true; public function __construct($audioCodec = 'libmp3lame', $videoCodec = 'libx264') { $this ->setAudioCodec($audioCodec) ->setVideoCodec($videoCodec); } /** * {@inheritDoc} */ public function supportBFrames() { return $this->bframesSupport; } /** * @param $support * * @return X264 */ public function setBFramesSupport($support) { $this->bframesSupport = $support; return $this; } /** * {@inheritDoc} */ public function getAvailableAudioCodecs() { return array('libmp3lame'); } /** * {@inheritDoc} */ public function getAvailableVideoCodecs() { return array('libx264'); } /** * {@inheritDoc} */ public function getPasses() { return 2; } /** * @return int */ public function getModulus() { return 2; } }
and updated the code to transcode video as below:
$ffmpeg = FFMpegFFMpeg::create(); $video = $ffmpeg->open($video_path); $format = new CustomVideo(); $format->setKiloBitrate(1000) ->setAudioChannels(2) ->setAudioKiloBitrate(256); $video->save($format, public_path().$path.$save_filename);
It has solved the Unknown encoder libfaac
error.
Advertisement
Answer
The required library is not included due to licensing.
Zeranoe FFmpeg – Why dont the builds include FAAC, FDK-AAC, libaacplus?
These libraries are not compatible with the GPL license and cannot be included without licensing the build as nonfree. A nonfree build cannot be publicly distributed.
You have the following solutions:
- Use another audio codec instead of AAC. There’s a LAME MP3 encoder for example.
- Compile your own version of FFmpeg adding all the libraries you want See FFmpeg Compilation Guide