今後はいいねかストックする毎に一回更新。
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行目。
最後にMake Installする。
エラーが出ない事が確認できれば終了である。
正常な場合のフォルダ配置(以降、全てこうなるように注意する。出ないとかなり面倒になる)
ffmpegにConfigure可能かどうか
USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
./configure --prefix=/ucrt64 --enable-static --enable-libmp3lame
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)。
make -j 結果
シンプルなConfigureだとdllが出力されずに実行出来なかったのでConfigureをかなり入れ替えた(上記参照)
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)
管理者権限で実行するのを忘れてたから?
以下のコマンドを実行するよう指示される。
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"
クロスコンパイルする
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
多分ダイジョブ。 ダメっぽい。
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
<<以下.pcファイル編集。無関係の為削除。編集履歴へ>>
make -j可能か
問題無く終了し、ffmpegでAV1 Codecが使用可能になった。
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
で管理者権限化する
./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
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
ffmpegのビルド検証(make -j)
Openh265(H.265/HEVC)のビルド
Githubにもやり方が記載されている(Git Cloneで指定するURLが間違ってる)
UCRT64で出来るかどうか検証。
前提
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 ..
make
sudo make install
make可能?
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
もっかい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によるとポインターの型が不適切であるために発生しているとの事なので、
return inc + InterlockedExchangeAdd((LONG volatile *)ptr, inc);
正しいコマンドなのかどうか分からない。
cmake "../openHEVC" -DCMAKE_BUILD_TYPE=RELEASE ..
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 と書き換える方が速い。
これで警告は出なくなる。
ビルドの成功まではいけていないのでこの辺で諦めようかと思っている。
これまでの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
が発生するのだが
この場合は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
には配置されないようなので、これをコピーして配置しておく。
これで./Configureを通す事が出来る。
早速実行してみよう。
./Configure可能?
尚、単独Codec指定かつ比較的単純な./Configureが通り、ffmpegのビルドが通る事が前提である。
以上の対処をしていれば特に問題なく可能。
ffmpegのビルドも通る。
バイナリのサイズ
--disable-staticなどにしているのでファイルサイズは小さめ。
静的Linkにしてdllはバイナリに同梱しても、ネットワーク関連やMac関連をDisableすれば15Mb前後までファイルサイズを小さく出来る。ファイルサイズは小さい方がいいと思うのだ。
各コマンドの説明はChatGPTがしてくれた。
これで出力したffmpeg.exeと同じディレクトリにdll群がない(別のフォルダに作成されるため)
EveryThingで探して移植。だいたいG:\Msys2\home\USER\ffmpeg\libavfilter
等に入ってる。
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 にあるか調べる
どういう訳か入っていないので、入ってるところから持ってくるかしてみる。
G:\Msys2\mingw64\lib\pkgconfig に入っており、仕方がないので持ってくる。
lame.a やlame.hも必要かも。
libフォルダ
includeフォルダ
Lame.aは入ってない 入れよう。
G:\Msys2\ucrt64\include にlame.hが追加された。
lame.pcの内容も見て置く。といっても内容は大体どれも同じ。直下に指定されているんだけどincludeファルダでミスマッチがしばしば起きる。
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以降に標準で入っている。
あとがき
とにかく時間掛かります。まだ書きかけです。