win 10でffmpegとx 264をコンパイル

8616 ワード

Windowsの下でffmpegとx 264をコンパイルするたびに半日振り回され、c++のコンパイルは本当に煩わしく、遅いコンパイル速度を言わずにコンパイル環境構成に多くの時間を浪費することが多い.前回ffmpegとx 264をコンパイルしてからずいぶん経ちましたが、メモを取らなかったので今またやり直します.
今回はx 64バージョンのみをコンパイルし、32ビットバージョンはコンパイルしません.OS:win 10 64 bit vs:vs 2017
一、コンパイル環境
MSYS 2、まず公式サイトからx 86_をダウンロードします64バージョンのインストーラ.インストールが完了したら、インストールディレクトリの下のmsys 2_をshell.cmdに注釈されたrem set MSYS2_PATH_TYPE=inheritset MSYS2_PATH_TYPE=inheritに変更され、vsの環境をMSYS 2に継承するためである.
MSYS 2は、msysまたはMinGW-w 64環境を選択するコンパイルすることができるが、msysではgccでコンパイルされたexeおよびdllはmsys-2.0に依存する.dll、MinGW-w 64でコンパイルされたファイルはこのdllに依存する必要はありません.プログラムの実行効率から見ると、このdllに依存しないプログラムの効率はもっと高いはずです.だから私の個人的な好みについて言えば、MinGW-w 64を選んでコンパイルしたに違いありません.そして、私は両方の環境でx 264をコンパイルしたことがあります.configureの時、msysの下で-disable-thread --disable-avsのような選択肢をdisableしなければなりません.
二、pacmanのソースを修正する
pacmanはMSYS 2にソフトウェアをインストールするためのパッケージマネージャですが、デフォルトの海外のソースからインストールパッケージをダウンロードするのは非常に遅く、十数二十KB程度の速度しかありません.また、ダウンロードの中断エラーも発生しやすいので、国内のソースに変更する必要があります.国内のソースは中科大学のソースを選ぶことができます.このページを開きます.MSYS 2ミラーの使用方法については、ページで説明したように、次のように変更します.
pacmanの構成編集/etc/pacman.d/mirrorlist.mingw32、ファイルの先頭に追加:Server=http://mirrors.ustc.edu.cn/msys2/mingw/i686/etc/pacman.d/mirrorlist.mingw64を編集し、ファイルの先頭に追加:Server=http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/etc/pacman.d/mirrorlist.msysを編集し、ファイルの先頭に追加:Server=http://mirrors.ustc.edu.cn/msys2/msys/$arch
次にmsys 2のshellでpacman -Syを実行してパッケージデータをリフレッシュすればよい.
三、gccコンパイラの取り付けなど
MinGW-w 64コンパイルを選択すると、MSYS2 MinGW 64-bitのショートカットが開き、shellウィンドウに次のように入力されます.
pacman -S mingw-w64-x86_64-toolchain

次に、「すべてインストール」を選択します.
msysコンパイルを選択するとMSYS2 MSYSのショートカットが開き、shellウィンドウに入力します.
pacman -S msys2-devel
   
pacman -S make gcc diffutils pkg-config

次に、「すべてインストール」を選択します.
四、コンパイル環境のその他の準備
1.linkの名前を変更します.exeの名前をmsys64/usr/bin/link.exeからmsys64/usr/bin/link.bakに変更し、MSVCとのlinkを避ける.exe抵触.
2.YASMのダウンロードとインストールは不要のようで、最新版のコードではyasmの代わりにnasmが使用されています.
YASMダウンロードアドレス:http://yasm.tortall.net/Download.html、64ビットバージョンWin 64をダウンロードする.exe(64ビットWindows共通)、すなわちページ内のWin 64.exe (for general use on 64-bit Windows). ダウンロードすると、yasm-1.3.0-win 64がダウンロードされます.exeはyasmと改名した.exeは、MSYS 2インストールディレクトリ:/msys 64/usr/bin/に配置されます.
3.「VS 2017に適したx 64ネイティブツールコマンドプロンプト」に関連付けられたmingw 64またはmsysウィンドウを開く
スタートメニューのVisual Studio 2017ディレクトリには、コマンドプロンプトのショートカットがいくつかあります.
VS 2017の開発者コマンドプロンプトVS 2017のx 64_x 86クロスツールコマンドプロンプトVS 2017のx 64ネイティブツールコマンドプロンプトVS 2017のx 86ネイティブツールコマンドプロンプトVS 2017のx 86_x 64互換ツールコマンドプロンプト
最初は気づかなかったのですが、VS 2017の開発者コマンドプロンプトを選択しました.このデフォルトはx 86 32ビット環境、clコンパイラデフォルトは32ビットコンパイラ、ffmpegコンパイル時configureでx 64ビットを指定してもコンパイルされたのは32ビットdllとexeです.
スタートメニューに直接入力できます:vs 2017にリストが表示されます.VS 2017に適用されるx 64ネイティブツールコマンドプロンプトを開くには、ウィンドウに入力します.
#  msys2    
d:
cd  d:\msys64

#     msys2 mingw64  
msys2_shell.cmd -mingw64

#     msys2 msys  
#msys2_shell.cmd

vs 2017のshellからmsys 2 shellを開くのはvs 2017の環境パスを継承するためです.
このように開いているmsys 2 shellウィンドウでは、Ctrl+Cを使用して現在実行中のコマンドを中止できない場合があります.例えば、git cloneで比較的大きなプロジェクトをダウンロードして、遅くて中止したい場合があります.Ctrl+Cを押すとコマンドを中止できません.タスクマネージャを使用してgitプロセスを強制的に閉じるしかありません.stackoverflowで検索した結果も解決できず、理由をたくさん言ってよく見ていないので、ffmpegとx 264をコンパイルするにはこのウィンドウが必要なだけなので、どうでもいいです.
4.コンパイル環境ツールの確認
which cl link yasm cpp

返された結果が正しいかどうかを見て、noの結果がなければ普通は大丈夫です.
5.中国語表示ウィンドウをサポートする右クリック->Options->Textを変更し、locale選択:zh_CN,Character setはUTF-8を選択します.
6.nasmをインストールして現在の最新x 264をコンパイルする場合はnasmを使用する必要があります.
pacman -S nasm

あるいはnasm公式サイトに直接exeをbinディレクトリにダウンロードすることもできます(私は最初からこの方法を使っていました).
五、ダウンロードとコンパイルx 264
  • MinGW-w 64バージョン:
  • git clone http://git.videolan.org/git/x264.git
    git checkout -b stable remotes/origin/stable
    ./configure --prefix=../build --host=x86_64-w64-mingw32 --enable-shared  --extra-ldflags=-Wl,--output-def=libx264.def 
    make
    make install
    
  • msysバージョン:
  • git clone http://git.videolan.org/git/x264.git
    git checkout -b stable remotes/origin/stable
    ./configure --prefix=../build --host=x86_64-w64-mingw32 --enable-shared --disable-thread --disable-avs --extra-ldflags=-Wl,--output-def=libx264.def 
    make
    make install
    

    msysでは--disable-thread --disable-avsが必要です.そうしないと、コンパイル中にエラーが発生します.
    libx 264を生成する.lib
    上でコンパイルした結果にはlibファイルが含まれておらず、自分で手作業で生成する必要があります.configureの時、私たちはlibx264.defを生成しました.この時、役に立ちました.
    cp ./libx264.def ../build/lib/
    cd ../build/lib
    #    64 lib         :
    lib /machine:X64 /def:libx264.def
    
    #    32 lib         :
    #lib /machine:i386 /def:libx264.def
    

    すなわち、libx264.libが得られ、build/bin/libx264-155.dlllibx264.dllとして改名または複製する.
    プログラムで直接x 264を使用したい場合はincludeの.hヘッダファイル、libx264.libおよびlibx264.dllは、プロジェクト内の対応する位置にコピーされ、プログラムにヘッダファイルを追加し、x 264の方法を使用することができる.
    六、ffmpegのダウンロードとコンパイル
    ダウンロードffmpegダウンロードffmpegは直接使用できます:
    git clone git://source.ffmpeg.org/ffmpeg.git
    

    しかしffmpegは非常に膨大なのでgitでダウンロードするのが遅いので、公式サイトでソース圧縮パッケージをダウンロードすることができます.
    コンパイルには2つの方法があります.
    方法1.手動configure方式コンパイル
    もともと私は半日方法2のFFmpegInteropを振り回して、vs 2015しかサポートしていないようで、私が使っているのはvs 2017なので、自分で手動configureします.1.buildを作成します.sh実行:
    ./configure --toolchain=msvc --target-os=win64 \
        --arch=x86_64 \
        --enable-shared \
        --enable-small \
        --enable-version3 \
        --enable-gpl \
        --enable-nonfree \
        --disable-stripping \
        --disable-encoders \
        --disable-decoders \
        --enable-decoder=h264 \
        --enable-encoder=libx264 \
        --enable-encoder=mjpeg \
        --enable-encoder=mpeg4 \
        --prefix=./build \
        --enable-libx264 \
        --extra-cflags="-I/home/.../build/include" \
        --extra-ldflags="-LIBPATH:/home/.../build/lib"
    

    上のlibx 264のパスを自分のマシンのパスに置き換えます.ここではpkg-configではなくlibx 264のパスを直接指定しましたが、比較的多くのサードパーティ製ライブラリを使用する場合はpkg-configで管理したほうがいいです.
    ここで一番お父さんは--extra-ldflagsは「-LIBTPATH:パス」を使用しなければならず、「-Lパス」を使用することはできません.最初は-Lを使うとlibx 264が見つからないエラーが発生し、configを開きました.logは./compat/windows/mslinkを使用してリンクされていたが、mslinkはlibライブラリパスを指定するために必ず「-LIBTPATH:パス」を使用していた.
    ffmpegディレクトリの下で./compat/windows/mslinkを直接実行すると、すべてのパラメータオプションを表示できます.
    2.configを修正する.h新たに生成するconfig.hファイルを開いてUTF-8形式に変換します.そうしないと、makeの時に無数のwarningが出てくるので、とてもうるさいです.
    3.コンパイル
    make 
    make install
    

    方法2、マイクロソフト公式のFFmpegInteropを使用して、もしあなたがvs 2015を使用しているならば.
    1. FFmpegInterop
    マイクロソフトはffmpegをコンパイルするために例を書いた:FFmpegInterop.
    git clone git://github.com/microsoft/FFmpegInterop.git
    

    2.FFmpegConfigを修正する.sh libx 264をサポートするためにエディタでFFmpegConfigを開く.sh,FFmpegConfigが見える.shは4つのオペレーティングシステムである:Win 7/Win 8.1/Win10/Phone8.1のx 86/x 64/ARMプラットフォームは、異なるconfigureを記述している.ただし、libx 264サポートはデフォルトではオンになっていません.だから自分の必要なバージョンのconfigureに参加します(手動configureと同じです):
    --enable-gpl \
    --enable-nonfree \
    --enable-libx264 \
    --extra-cflags="-I/home/.../build/include" \
    --extra-ldflags="-LIBPATH:/home/.../build/lib"
    

    3.ffmpeg ffmpeg解凍またはgit cloneをFFmpegInteropディレクトリの下にコンパイルします.次のコマンドを使用して、対応するプラットフォームバージョンをコンパイルします.
    BuildFFmpeg.bat win10                     - Build for Windows 10 ARM, x64, and x86
    BuildFFmpeg.bat phone8.1 ARM              - Build for Windows Phone 8.1 ARM only
    BuildFFmpeg.bat win8.1 x86 x64            - Build for Windows 8.1 x86 and x64 only
    BuildFFmpeg.bat phone8.1 win10 ARM        - Build for Windows 10 and Windows Phone 8.1 ARM only
    BuildFFmpeg.bat win8.1 phone8.1 win10     - Build all architecture for all target platform
    

    4.次のエラーが発生する可能性があります.
    MSYS2 is needed. Set it up properly and provide the executable path in MSYS2_BIN environment variable. E.g.
    
        set MSYS2_BIN="C:\msys64\usr\bin\bash.exe"
    

    vs 2017コマンドプロンプトウィンドウで入力:
    set MSYS2_BIN="      \usr\bin\bash.exe"
    

    その後、msys2_shell.cmd -mingw64ウィンドウを再開してコマンドをコンパイルします.
    fdk aacサポート
    Fraunhofer FDK AACコーデックライブラリ.これは現在のffmpegの最高品質のAACエンコーダです.fdk aacを使用する場合は、次のようにします.
    --enable-libfdk_aac
    

    どのようにfdk aacをコンパイルするかはここでは言いません.
    七、dumpbinを使ってdllが32ビットなのか64ビットなのかなどを調べる
    dumpbinはvs shellで実行する必要があります.
  • 32ビットまたは64ビット:dumpbin/headers libx 264.dll
  • シンボルリスト(導出関数)dumpbin/exports libx 264を表示する.dll > libx264-exports.txt