Php-ffmpeg “Encoder unknown libfaac” on Windows

科技动态 2018-06-25 阅读原文

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.

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:

  1. Use another audio codec instead of AAC. There's a LAME MP3 encoder for example.
  2. Compile your own version of FFmpeg adding all the libraries you want See FFmpeg Compilation Guide
Hello, buddy!

责编内容by:Hello, buddy!阅读原文】。感谢您的支持!

您可能感兴趣的

The command mysql and php sometimes does not publi... So, I have the following PHP command to post to my db. $sql = "INSERT INTO `db`.`tab;e` (`id`, `type`, `subtype`, `ima...
php 获取中文拼音首字母 昨天看同时代码的时候,发现有一段获取中文拼音首字母的代码,发现里面有好几十个if,然后在百度搜索了下,发现全部都是这种写法: = ord("A") and $fchar safe_encoding($str); $...
Xbox One will soon play nice with keyboards and mi... The Verge reports that Microsoft is working to bring support for mice and keyboards to itsXbox One consoles at last....
Please stop hack "chcp 65001" On GitHub, there are many codes using chcp 65001 . This is hack to display UTF-8 on Windows command prompt. Probably, t...
Echo a two-digit number in php Python regex: Reject a two-digit number and accept other two-digit numbers How can I make a regula...