LoginSignup
7
4

MSYS2によるFFmpegのWindows向けビルドとトラブルシューティング(覚え書き)

Last updated at Posted at 2023-02-27

今後はいいねかストックする毎に一回更新。

 Windowsにおいてffmpegをビルドする為の今のところ最新の方法がMsys2を導入するものである。他の記事は古くて使いものにならないというかCodecをいろいろ入れようとすると進まなくなる。

今回はWindows11 Insider Preview Betaチャンネルという環境で検証した。
辞めるのがいいかも知れない。

最新の方法としてこの方の記事を見つけたので挙げて置く。
MSYS2でWindows用のffmpegをビルドする

前提としてLinkの手順を全て踏んでいるものとする。
恐らくUbuntuやWSLを使ってもほとんど同様だと思われる。つまりコマンドやパス・フォルダ構成その他を間違えてると何をどれだけ試そうとOSを替えようとbuildは進まない

裏を返せば手順さえキッチリやればUbuntuだろうとWSL(Windows for subsystem)だろうと関係ないと思う。これまで環境4つぐらい試してるので。

目次

自前でlameビルドしてみる
AV1(aom)を入れる
OpenH264のビルド
これまでのCodecを指定してビルド

基本とする./Configure

 ./configure --prefix=/mingw32 /
 --prefix=/ucrt64 --disable-shared /
 --enable-static --pkg-config-flags=--static /
 --extra-libs=-static --extra-cflags=--static /
 --enable-Codecs

Ryzen7 3700x を使ってるんだけどそれでも重い。

本記事の注意点

 たぶん他のどこにも書いてない方法で(要するに全部我流)、間違ってるとかあるのでその都度修正していきます。

自前でlameビルドしてみる

かなりうまく行ったので褒めて欲しい

cd 等のコマンドは省略。
USER@DESKTOP-IBL3PFN UCRT64 ~/lame-3.100などと付けて置いたので注意してみて欲しい。

DownLoad先:https://sourceforge.net/projects/lame/
Wgetが受け付けないので手動で配置する。

USER@DESKTOP-IBL3PFN UCRT64 ~/lame-3.100
tar -zxvf lame-3.100.tar.gz

USER@DESKTOP-IBL3PFN UCRT64 ~/lame-3.100
./configure --prefix=/ucrt64 --disable-shared

ここまでエラーは出なかった
USER@DESKTOP-IBL3PFN UCRT64 ~/lame-3.100
make -j で
parse.c:74:10: fatal error: langinfo.h: No such file or directory
   74 | #include <langinfo.h>

事前まとめ

必要な物: Nasm

fatal error: langinfo.h: No such file or directory

解決策
Nasmを使う
http://freed411.doorblog.jp/archives/46786143.html
Prefixを書き換える。

USER@DESKTOP-IBL3PFN UCRT64 ~/lame-3.100
./configure --prefix=/ucrt64 \
                --enable-static \
                --disable-shared \
                --disable-frontend \
                --enable-nasm

--disable-frontend
 https://github.com/zlargon/lame/blob/master/configure.in
Do not build the lame executableとある。実行可能な.exeを生成しないという意味だと思う。

こちらもやっておく。

EveryThing等で見つけて欲しい。パスはG:\Msys2\home\USER\lame-3.100\libmp3lame\i386\Makefile.in
ここでは624行目。
image.png

これで正常にmake -j でビルド出来る。
image.png

最後にMake Installする。
エラーが出ない事が確認できれば終了である。
image.png

正常な場合のフォルダ配置(以降、全てこうなるように注意する。出ないとかなり面倒になる)
image.png

ffmpegにConfigure可能かどうか

USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
 ./configure --prefix=/ucrt64 --enable-static --enable-libmp3lame

一応可能だった。
image.png

make -j可能か

かなりエラーを吐いた

USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
make -j

make: *** [ffbuild/common.mak:81: libavformat/jvdec.o] Error 1
gcc.exe:gcc.exe:  fatal error: fatal error: cannot execute '                G:/Msys2/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/as.exe': CreateProcess: No such file or directory
G:/Msys2/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/as.exe': CreateProcess: No such file or directory
ccomopmpililation terminataetidon .termin

.configureの入れ替えと修正

--prefix=/mingw32の追加 これは入れないとコンパイル通らないらしい
シンプルなConfigureだと.dllが出力されず実行出来ないので下記リンクのものを追加してカスタマイズした。

参考

USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
./configure --prefix=/mingw32 --prefix=/ucrt64 --disable-shared  --enable-static --pkg-config-flags=--static --extra-libs=-static --extra-cflags=--static --enable-libmp3lame

/ 区切りだと上手く行かなかったのでこうした

--disable-shared : 共有ライブラリ(.dll)を出力しない(バイナリサイズは肥大化する)
-pkg-config-flags=--static : 静的リンクにして実行可能なライブラリをバイナリに埋め込む(ChatGPT)。
用語解説を参照
--extra-cflags=--static : Cコンパイラに追加のコンパイルフラグを渡す(ChatGPT)
 link : a configure's options such as "--extra-cflags" --- I am confused

。 -static: 静的Linkにより実行環境に依存しないFFmpegバイナリを作成出来る(ChatGPT)。

特に問題なし
image.png
image.png

make -j 結果

今回は上手く行った。(上手く行く方が珍しい)
image.png

無事にffmpeg.exeが生成された(奇跡的に)
image.png

 シンプルなConfigureだとdllが出力されずに実行出来なかったのでConfigureをかなり入れ替えた(上記参照)

実行も可能になった。
image.png

AV1(aom)を入れる

※まだビルドに成功してません。

(いいねされたので再更新)
 Googleからgit Cloneする。
git clone https://aomedia.googlesource.com/aom

参考にこれも入れておく

pacman -S mingw-w64-ucrt-x86_64-aom
でもいいと思うのだがよく分からんので中止割愛。
MinGWではない事に注意する。

今回はgit Clone

コンパイルする

公式の方法は以下

事前まとめ

必要な物:
相対パス指定。
DoxyGen:ucrt64.exeでpacman -S mingw-w64-x86_64-doxygen
Home直下でmkdir -p ../aom_build (フォルダ作成)

Cmake path/to/aom とあるが、これは単にaomへのpathを渡せという指示である(分かりづらい)
後述するが、実は相対パスじゃないとエラー吐きまくって失敗する先に言え

USER@DESKTOP-IBL3PFN UCRT64 ~aom

cmake "G:\Msys2\home\USER\aom"

error

CMake Error at test/test_data_util.cmake:600 (file):
file STRINGS file
"G:/Msys2/home/USER/aom/G:/Msys2/home/USER/aom/test/test-data.sha1" cannot
be read.
Call Stack (most recent call first):
test/test.cmake:517 (make_test_data_lists)
CMakeLists.txt:767 (setup_aom_test_targets)

管理者権限で実行するのを忘れてたから?

管理者権限で。
image.png

以下のコマンドを実行するよう指示される。
Hint: Run these commands

$ rm -rf CMakeCache.txt CMakeFiles
$ mkdir -p ../aom_build
$ cd ../aom_build
And re-run CMake from the aom_build directory.

CMakeCache.txtはEvrythingで削除してもいい。
build毎に生成されるので毎回削除する必要がある

再度 cmakeする

-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
--- Cannot find doxygen(version 1.8.10 or newer), ENABLE_DOCS turned off.
-- Configuring incomplete, errors occurred!
See also "/home/USER/aom_build/CMakeFiles/CMakeOutput.log".
See also "/home/USER/aom_build/CMakeFiles/CMakeError.log".

doxygenとやらが見つからないのが原因らしい。
doxygenを探してみる。

ucrt64.exeで
pacman -S mingw-w64-x86_64-doxygen

CMakeCache.txtを削除して再度Cmake

CMake Error at test/test_data_util.cmake:600 (file):
file STRINGS file
"G:/Msys2/home/USER/aom/G:/Msys2/home/USER/aom/test/test-data.sha1" cannot
be read.
Call Stack (most recent call first):
test/test.cmake:517 (make_test_data_lists)
CMakeLists.txt:767 (setup_aom_test_targets)

"G:/Msys2/home/USER/aom/G:/Msys2/home/USER/aom/test/test-data.sha1" とパス指定がおかしいので相対パスでやり直してみた。

USER@DESKTOP-IBL3PFN UCRT64 ~/aom_build
cmake "../aom"

今度は正常に通った。絶対パスは想定外らしい。
image.png

クロスコンパイルする

Windows向けにビルドする。

USER@DESKTOP-IBL3PFN UCRT64 ~/aom_build
cmake "../aom" -DCMAKE_TOOLCHAIN_FILE=../build/cmake/toolchains/x86_64-mingw-gcc.cmake

問題無く終了。

make -j 可能か

biuldの場所は先ほどと同じ
USER@DESKTOP-IBL3PFN UCRT64 ~/aom_build

image.png

多分ダイジョブ。 ダメっぽい。

ffmpegで./configure 可能か

--enable-libaomを末尾に追加する(他のCodecは念のため入れない)

USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
./configure --prefix=/mingw32 --prefix=/ucrt64 --disable-shared  --enable-static --pkg-config-flags=--static --extra-libs=-static --extra-cflags=--static 
/ --enable-libaom

特に問題無いらしい。
image.png

<<以下.pcファイル編集。無関係の為削除。編集履歴へ>>

make -j可能か

問題無く終了し、ffmpegでAV1 Codecが使用可能になった。
image.png

OpenH264のビルド

https://github.com/cisco/openh264
のFor Windows Buildsの項を参照のこと。

GithubではCygwinを使うように勧められているのだが、ここではMsys2をこのまま使う事とする。

参考

AutoBuildForWindows.bat も使ってみたのだが、errorを吐くばかりでよく分からなかった。
Msys2から直接使えないからPowerShellで
G:\Msys2\home\USER\openh264\buildにある。 AutoBuildForWindows.bat Configuration [-winsdk_version=winsdk_version] [-vc_version=vc_version]
念の為Gsudoで管理者権限化する

image.png

./AutoBuildForWindows.bat -helpで使い方を調べる

 AutoBuildForWindows.bat Configuration  [-winsdk_version=winsdk_version] [-vc_version=vc_version]

使い方例:ChartGPT協力

# Win64-Release-C設定でビルドを実行
.\AutoBuildForWindows.bat Win64-Release-C
#[winsdk_version]を指定
.\AutoBuildForWindows.bat Win64-Release-C -winsdk_version=10.0.17763.0
#[vc_version]を指定
.\AutoBuildForWindows.bat Win64-Release-C -vc_version=VC16

何かが足りないようで、実行させることは出来なかった。
例:
PS G:\Msys2\home\USER\openh264> .\build\AutoBuildForWindows.bat Win64-Release-C -vc_version=VC16
image.png

error内容
make:  No rule to make target `clean'.  Stop.
make:  No targets specified and no makefile found.  Stop.
make:  No rule to make target `plugin'.  Stop.

記事つづき

USER@DESKTOP-IBL3PFN UCRT64 ~
git clone -b v2.3.1 https://github.com/cisco/openh264
cd Openh264

USER@DESKTOP-IBL3PFN UCRT64 ~/openh264
make ARCH=x86_64
make install-shared

とりあえず問題無く通る。

ffmpegの.Configure 検証

./configure --prefix=/mingw32 --prefix=/ucrt64 --disable-shared  --enable-static --pkg-config-flags=--static --extra-libs=-static --extra-cflags=--static 
/ --enable-libopenh264

問題無く終了
image.png

ffmpegのビルド検証(make -j)

 ビルド可能でした。
image.png

Openh265(H.265/HEVC)のビルド

Githubにもやり方が記載されている(Git Cloneで指定するURLが間違ってる)

UCRT64で出来るかどうか検証。

前提

Cmake使用可能。インストールも簡単なので問題ないはず。
image.png

clangが入ってる。
MSVC2013(pacman -S mingw-w64-x86_64-gdb)が入ってる。

コマンド群
git clone https://github.com/OpenHEVC/openHEVC.git
cd openHEVC
git checkout hevc_rext

lameビルドの際はnasmを使用したが、こちらではYasmを使用する。
Ucrt64.exeでそのまま実行すればよい(管理者権限)。

pacman -S yasm

pacman -SyuでのUpdeteも行っておく。

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE ..

特に問題なく終了。
image.png

make
sudo make install

make可能?

Error



make[2]: *** [CMakeFiles/LibOpenHevcWrapper.dir/build.make:192: CMakeFiles/LibOpenHevcWrapper.dir/libavutil/buffer.c.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: CMakeFiles/LibOpenHevcWrapper.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

と表示。失敗らしい。いつもの事である。
これらのエラーはコンパイルに失敗したことを示している。

なかなかうまく行かないので公式gitサイトで前提条件の見直し。
gccは入っていたがclangは入っていない事に気づいた。
そこでclangをインストールする。

 pacman -S mingw-w64-x86_64-clang

image.png

もっかいpacman -Syuしておく。

G:/Msys2/home/USER/openHEVC/libavutil/atomic_win32.h:44:41: warning: passing argument 1 of '_InterlockedExchangeAdd' from incompatible pointer type [-Wincompatible-pointer-types]
   44 |     return inc + InterlockedExchangeAdd(ptr, inc);
      |                                         ^~~
      |                                         |
      |                                         volatile int *

これはChatGPTによるとポインターの型が不適切であるために発生しているとの事なので、

atomic_win32.h
   return inc + InterlockedExchangeAdd((LONG volatile *)ptr, inc);

にキャストして変換してやる
image.png

正しいコマンドなのかどうか分からない。

cmake "../openHEVC" -DCMAKE_BUILD_TYPE=RELEASE ..

image.png

warning Yasmとあるのは

CMake Warning (dev) at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
  The package name passed to `find_package_handle_standard_args` (YASM) does
  not match the name of the calling package (Yasm).  This can lead to
  problems in calling code that expects `find_package` result variables
  (e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
  MyCMakeScripts/FindYasm.cmake:71 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:54 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

この場合はCmakeList.txr内でfind_Package関数を探し
Yasm → YASM と書き換える方が速い。
image.png

これで警告は出なくなる。

ビルドの成功まではいけていないのでこの辺で諦めようかと思っている。

これまでのCodecを追加してffmpegをビルドする

./configure --prefix=/mingw32 --prefix=/ucrt64 \
--disable-debug --disable-doc --disable-ffplay --disable-network \
--disable-postproc --disable-iconv --disable-videotoolbox --disable-audiotoolbox \
--disable-coreimage --disable-securetransport \
--disable-protocol=rtmp* --disable-protocol=rtmpt* --disable-protocol=rtp \
--disable-protocol=tcp --disable-protocol=udp --disable-protocol=udplite --disable-protocol=sctp \
--disable-devices --disable-indevs --disable-outdevs --disable-openssl \
--enable-shared --enable-small --disable-static \
--enable-libopenh264 --enable-libaom --enable-libmp3lame && \
make && \
make install

色々突っ込んであるのはffmpegのバイナリサイズを小さくするためにMac関連のオプションとかネットワーク関連のオプションをDisableしてるから。カメラとかデバイス接続関連のもDisableしてる。適切なファイルを配置していればこれで通る事が分かっている。

単独だと通るのに、Codecを複数指定(混在)させるとエラーになったりする。ちゃんと解決方法はある(苦労したが)
最初は各オプションとの相性が悪いのかもと考えたんだけど全く関係ないっぽい。

まず Codecを混在させると必ず
ERROR: openh264 not found using pkg-config
が発生するのだが

image.png

この場合はpkg-configのパスを確認する必要がある。ちなみにここに至るまで一切pkg-configのパスは変更してない。すると以下の結果が得られた。

pkg-config --variable pc_path pkg-config
/usr/lib/pkgconfig:/usr/share/pkgconfig

ここで、/usr/lib/pkgconfig と /usr/share/pkgconfig 内にopenh264.pcが配置されていなければならない(他のは必要ないらしい)。 openh264.pcを生成するにはOpenh264ビルドの際、Make Installコマンドを実行する必要がある。やっていない場合は今からでも行っておく。

Make Installコマンドを実行しても/usr/share/pkgconfig には配置されないようなので、これをコピーして配置しておく。

image.png

これで./Configureを通す事が出来る。
早速実行してみよう。

./Configure可能?

尚、単独Codec指定かつ比較的単純な./Configureが通り、ffmpegのビルドが通る事が前提である。
以上の対処をしていれば特に問題なく可能。
image.png

ffmpegのビルドも通る。

image.png

バイナリのサイズ
--disable-staticなどにしているのでファイルサイズは小さめ。
静的Linkにしてdllはバイナリに同梱しても、ネットワーク関連やMac関連をDisableすれば15Mb前後までファイルサイズを小さく出来る。ファイルサイズは小さい方がいいと思うのだ。

各コマンドの説明はChatGPTがしてくれた。

image.png

これで出力したffmpeg.exeと同じディレクトリにdll群がない(別のフォルダに作成されるため)
EveryThingで探して移植。だいたいG:\Msys2\home\USER\ffmpeg\libavfilter等に入ってる。
image.png

Chekout -b でffmpegのversionをかえたらmakeが止まる

以下を実行した場合

USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
# git checkout release/6.0
Already on 'release/6.0'
Your branch is up to date with 'origin/release/6.0'.

make -jが途中でエラーを出して止まる。
make cleanすればよい。他のVersionで作成された中間生成物も全て削除される。

但し、これでビルドしてもffmpegのVersionはほぼ変わらなかった模様

ffmpeg version n5.2-dev-2486-g6f1b24c4fe Copyright (c) 2000-2023 the FFmpeg developers

以前のversionのものがffmpeg version n5.1-ffmpeg-windows-build-helpersなのでちょこっと変わったのかな。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
///以下未整理か未解決
AllWomanAreSheep

ERROR: opus not found using pkg-config

とりあえず全部突っ込んどけ。

pacman -S mingw-w64-x86_64-opus

ERROR: libmp3lame >= 3.98.3 not found

pacman -S mingw-w64-ucrt-x86_64-lame
ucrtと付いてるのでこれを入れる。

参照元
Package: mingw-w64-ucrt-x86_64-aom

lame.pcが\ucrt64\lib\pkgconfig にあるか調べる

どういう訳か入っていないので、入ってるところから持ってくるかしてみる。
image.png

EvryThingの検索結果。タイムスタンプも最新である。
image.png

G:\Msys2\mingw64\lib\pkgconfig に入っており、仕方がないので持ってくる。
lame.a やlame.hも必要かも。

Lame.pcの追加
image.png

libフォルダ

入ってた
image.png

includeフォルダ

Lame.aは入ってない 入れよう。

image.png
とにかく更新日時が最新のものを追加されたものと考えて使う。

image.png

G:\Msys2\ucrt64\include にlame.hが追加された。

lame.pcの内容も見て置く。といっても内容は大体どれも同じ。直下に指定されているんだけどincludeファルダでミスマッチがしばしば起きる。

lame.pc
prefix=/ucrt64/
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

用語解説

pkg-config

ライブラリのインストール場所を探して、コンパイルやリンクに必要な情報を提供するためのツールです。(ChatGPTによる説明)
Wikipedia
 https://ja.wikipedia.org/wiki/Pkg-config 
エラーが出る度に.pcをチェックしていたのもこれが理由(後付け)。

MinGW

GCCをWindowsで利用できるようにする開発環境(Lameビルド→ffmpegビルドの際に-Prefix--minGW32を指定するとコンパイルが通った理由...らしい)

UCRT

ユニバーサル CRT (UCRT) は、Microsoft Windows オペレーティング システム コンポーネント.Windwos10以降に標準で入っている。

あとがき

とにかく時間掛かります。まだ書きかけです。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4