簡體   English   中英

Windows 上的 PHP-ffmpeg “未知編碼器 libfaac”

[英]Php-ffmpeg “Unknown encoder libfaac” on Windows

我正在使用 Laravel 4.2。

我正在處理一個項目,該用戶可以上傳視頻,我需要對其進行轉碼,以便可以在所有類型的設備上播放。

對於轉碼,我在我的項目中從 git hub 添加了 php-ffmpeg 包。 根據說明,我從http://ffmpeg.zeranoe.com/builds下載了 ffmpeg 包,並將 ffmpeg.exe 的路徑設置為環境變量 Path。

現在,我嘗試使用下面的代碼對上傳的視頻進行轉碼:

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

但它給出了如下錯誤:

[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}}

經過大量搜索后,我在這里找到了解決方案的鏈接,請注意

Zeranoe 的 ffmpeg 不包含 libfaac 支持,因為該編碼器需要 --enable-nonfree 這將導致不可再分發的構建。

我不明白解決方案。 有人能幫我克服這個嗎?

編輯:(工作代碼如下)

我創建了一個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;
    }
}

並更新代碼以轉碼視頻,如下所示:

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

它已經解決了Unknown encoder libfaac錯誤。

我剛剛遇到了一些問題,但通過在構造函數中定義一個新的音頻編解碼器來解決它。 而不是問題中的這一行...

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

我用了...

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

由於許可,所需的庫不包括在內。

Zeranoe FFmpeg - 為什么構建不包括 FAAC、FDK-AAC、libaacplus

這些庫與 GPL 許可證不兼容,並且不能在未將構建許可為非自由的情況下包含在內。 非自由構建不能公開發布。

您有以下解決方案:

  1. 使用其他音頻編解碼器而不是 AAC。 例如,有一個 LAME MP3 編碼器。
  2. 編譯你自己的 FFmpeg 版本,添加你想要的所有庫 查看FFmpeg Compilation Guide

官方建議使用原生 FFmpeg AAC 編碼器或 libfdk_aac 代替:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM