laravel Windows 上的 Php-ffmpeg “未知编码器 libfaac”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29253498/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 11:12:56  来源:igfitidea点击:

Php-ffmpeg “Unknown encoder libfaac” on Windows

phplaravelffmpegffmpeg-php

提问by Dev

I am using laravel 4.2.

我正在使用 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/buildsand set the ffmpeg.exe's path into the environment variable Path.

对于转码,我在我的项目中从 git hub 添加了 php-ffmpeg 包。根据说明,我从http://ffmpeg.zeranoe.com/builds下载了 ffmpeg 包,并将 ffmpeg.exe 的路径设置为环境变量 Path。

Now, I tried code below to transcode an uploaded video :

现在,我尝试了下面的代码来对上传的视频进行转码:

$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open($video_path);
$format = new FFMpeg\Format\Video\X264();
$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.

Zeranoe 的 ffmpeg 不包含 libfaac 支持,因为该编码器需要 --enable-nonfree 这将导致不可重新分发的构建。

I don't get the solution. Can anybody help me to overcome this?

我不明白解决方案。有人能帮我克服这个吗?

Edit: (working code as below)

编辑:(工作代码如下)

I have created a CustomVideoclass the same like class FFMpeg\Format\Video\X264()as below:

我创建了一个与CustomVideo类相同的类FFMpeg\Format\Video\X264(),如下所示:

class CustomVideo extends FFMpeg\Format\Video\DefaultVideo
{
    /** @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 = FFMpeg\FFMpeg::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 libfaacerror.

它已经解决了Unknown encoder libfaac错误。

采纳答案by aergistal

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.

Zeranoe FFmpeg - 为什么构建不包括 FAAC、FDK-AAC、libaacplus

这些库与 GPL 许可不兼容,并且不能在未将构建许可为非自由的情况下包含在内。非自由构建不能公开分发。

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
  1. 使用其他音频编解码器而不是 AAC。例如,有一个 LAME MP3 编码器。
  2. 编译您自己的 FFmpeg 版本,添加您想要的所有库 查看FFmpeg 编译指南

回答by karpy47

I just had the some problem, but solved it by defining a new audio-codec in the constructor. Instead of this line in the question...

我刚刚遇到了一些问题,但通过在构造函数中定义一个新的音频编解码器来解决它。而不是问题中的这一行......

$format = new FFMpeg\Format\Video\X264();

I used...

我用了...

$format = new FFMpeg\Format\Video\X264('libmp3lame', 'libx264');

回答by Jannie Theunissen

The official recommendationis to use the native FFmpeg AAC encoder or libfdk_aac instead:

负责人建议是使用原生FFmpeg的AAC编码器或libfdk_aac代替:

$format = new FFMpeg\Format\Video\X264('aac', 'libx264');