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



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


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

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


最新の方法としてこの方の記事を見つけたので挙げて置く。
[MSYS2でWindows用のffmpegをビルドする](https://sub-log.jp/2022/12/17/msys2%E3%81%A7windows%E7%94%A8%E3%81%AEffmpeg%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/#toc1)


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

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

# 目次
[自前でlameビルドしてみる](https://qiita.com/EndOfData/items/0af4065a968d926e6b08#%E8%87%AA%E5%89%8D%E3%81%A7lame%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)
[AV1（aom）を入れる](https://qiita.com/EndOfData/items/0af4065a968d926e6b08#av1aom%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B)
[OpenH264のビルド](https://qiita.com/EndOfData/items/0af4065a968d926e6b08#openh264%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89)
[これまでのCodecを指定してビルド](https://qiita.com/EndOfData/items/0af4065a968d926e6b08#%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%AEcodec%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6ffmpeg%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B)

# 基本とする./Configure

```powershell:
 ./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が受け付けないので手動で配置する。

```powershell
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を書き換える。

```powershell
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を生成しないという意味だと思う。


こちらもやっておく。

http://up-cat.net/MinGW%25A1%25DCffmpeg%25284%2529LAME.html

EveryThing等で見つけて欲しい。パスはG:\Msys2\home\USER\lame-3.100\libmp3lame\i386\Makefile.in
ここでは624行目。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/eb87b221-28d2-ee54-c2ed-fc42ca15a0eb.png)

これで正常にmake -j でビルド出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/2fede80c-9aa8-9030-cbd9-f531bf0625da.png)


最後にMake Installする。
エラーが出ない事が確認できれば終了である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/f080d863-52f7-7ef1-4067-acc5f2a5ff3f.png)

正常な場合のフォルダ配置（以降、全てこうなるように注意する。出ないとかなり面倒になる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/406937c7-6acf-9009-51b3-bc6a559b7fce.png)


## ffmpegにConfigure可能かどうか
```powershell
USER@DESKTOP-IBL3PFN UCRT64 ~/ffmpeg
 ./configure --prefix=/ucrt64 --enable-static --enable-libmp3lame
```
一応可能だった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/5d54ff85-05d7-89cd-7d01-c97a7c4a32c3.png)

## make -j可能か
かなりエラーを吐いた
```powershell
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が出力されず実行出来ないので下記リンクのものを追加してカスタマイズした。

参考

https://qiita.com/takc923/items/1ec06c9af7f1676edc2e

```powershell
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）。
[用語解説](https://qiita.com/EndOfData/items/0af4065a968d926e6b08#%E7%94%A8%E8%AA%9E%E8%A7%A3%E8%AA%AC)を参照
``--extra-cflags=--static`` : Cコンパイラに追加のコンパイルフラグを渡す（ChatGPT）
　link : [a configure's options such as "--extra-cflags" --- I am confused](https://stackoverflow.com/questions/10475903/a-configures-options-such-as-extra-cflags-i-am-confused "タイトル")

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

特に問題なし
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/4915e4bd-c8a8-d841-eaa6-749c0e3bf8d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/5d6e371f-4554-d8cf-1516-069d4d65ba6c.png)

### make -j 結果
 今回は上手く行った。（上手く行く方が珍しい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/dddce425-88aa-82f1-309f-4cb1ed51478c.png)

無事にffmpeg.exeが生成された（奇跡的に）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/60f5c50c-8a11-2e24-4a29-a639924a4cb5.png)

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

実行も可能になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/bf75fe8f-ec61-1946-335b-70088c177be6.png)


# AV1（aom）を入れる

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

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

参考にこれも入れておく

https://qiita.com/khagi/items/dfece6e4d77ffb0ba8b3

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

今回はgit Clone

# コンパイルする

公式の方法は以下

https://aomedia.googlesource.com/aom/

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

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

```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/c7c10015-1f6d-551f-3452-6910b130cdd5.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する

```powershell
-- 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を探してみる。

https://www.yokoweb.net/2020/02/21/msys2-doxygen-install/

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"　とパス指定がおかしいので相対パスでやり直してみた。

```powershell
USER@DESKTOP-IBL3PFN UCRT64 ~/aom_build
cmake "../aom"
```
今度は正常に通った。絶対パスは想定外らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/13319e39-f7a5-ecdc-b991-22d4289595c0.png)

### クロスコンパイルする
Windows向けにビルドする。

```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/1dc4de2a-3c06-a973-d490-fbba149b9642.png)

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


## ffmpegで./configure　可能か
``--enable-libaom``を末尾に追加する（他のCodecは念のため入れない）
```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/a62060c6-41a2-764b-3982-8abbb07e14b9.png)



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

## make -j可能か
問題無く終了し、ffmpegでAV1 Codecが使用可能になった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/e99abad8-f753-2cbf-96e1-dc98f2be37e2.png)


# OpenH264のビルド

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

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

参考

https://taktak.jp/2022/12/29/4475/

:::note info
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/7c0e1dd1-ffbe-5635-149f-886b11220c75.png)

## ./AutoBuildForWindows.bat -helpで使い方を調べる
```powershell
 AutoBuildForWindows.bat Configuration  [-winsdk_version=winsdk_version] [-vc_version=vc_version]
```
使い方例:ChartGPT協力
```powershell
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/e1307438-ddd1-7e94-160f-0f69d2d534f5.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.
```
:::

記事つづき


```powershell
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 検証


```powershell
./configure --prefix=/mingw32 --prefix=/ucrt64 --disable-shared  --enable-static --pkg-config-flags=--static --extra-libs=-static --extra-cflags=--static 
/ --enable-libopenh264
```
問題無く終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/0dd3c588-b7b1-44ae-41c3-42062fbc58e4.png)



## ffmpegのビルド検証(make -j)
　ビルド可能でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/b686ac4d-f804-8f8d-fcb8-c21d1f7c7818.png)


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

https://qiita.com/pb_tmz08/items/29165f4c3ef9bc4285ab


Githubにもやり方が記載されている（Git Cloneで指定するＵＲＬが間違ってる）

https://github.com/OpenHEVC/openHEVC



UCRT64で出来るかどうか検証。
### 前提
Cmake使用可能。インストールも簡単なので問題ないはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/18797452-87f8-482e-c905-cc7d0e1c40f7.png)

clangが入ってる。
MSVC2013（``pacman -S mingw-w64-x86_64-gdb``）が入ってる。




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


lameビルドの際はnasmを使用したが、こちらではYasmを使用する。
Ucrt64.exeでそのまま実行すればよい（管理者権限）。
```powershell
pacman -S yasm
```


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


```powershell
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE ..
```
特に問題なく終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/ab200bbf-e067-f8b0-68a8-283848364e53.png)


```powershell
make
sudo make install
```

## make可能？
```powershell: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をインストールする。

```powershell
 pacman -S mingw-w64-x86_64-clang
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/e9a00f42-2e6c-b7e7-2be4-bfa7fc30fcfa.png)

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


```powershell
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によるとポインターの型が不適切であるために発生しているとの事なので、
```powershell:atomic_win32.h
   return inc + InterlockedExchangeAdd((LONG volatile *)ptr, inc);
```

にキャストして変換してやる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/552f3273-8cc7-c7a4-ee88-758393b29f62.png)




正しいコマンドなのかどうか分からない。
```powershell
cmake "../openHEVC" -DCMAKE_BUILD_TYPE=RELEASE ..
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/77b4c2c4-779d-aa45-67d3-c57f145ca746.png)

#### warning Yasmとあるのは
```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/04a26ddb-3d58-fbc8-f53a-b64c1e84e0df.png)

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

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




# これまでのCodecを追加してffmpegをビルドする
```powershell
./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を混在させると必ず
<font color="red"><b>ERROR: openh264 not found using pkg-config</b></font>
が発生するのだが


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/b08d0f6b-c61a-e7ad-89b7-d649a7220eb8.png)

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

```powershell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/6d53922a-7d3d-a802-a550-9f60d33245e9.png)

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

### ./Configure可能？

尚、**単独Codec指定かつ比較的単純な./Configureが通り、ffmpegのビルドが通る事が前提である。**
以上の対処をしていれば特に問題なく可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/842d5af2-d39e-d692-135d-d7569f27c533.png)


ffmpegのビルドも通る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/81cc8d01-f137-deed-80eb-ffcb97753fe5.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/a7afaa9a-63cd-654a-2bd6-da2f4b51adeb.png)

これで出力したffmpeg.exeと同じディレクトリにdll群がない（別のフォルダに作成されるため）
EveryThingで探して移植。だいたい``G:\Msys2\home\USER\ffmpeg\libavfilter``等に入ってる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/c9560a02-1029-5c05-238b-a8a65ed572a1.png)




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

以下を実行した場合
```powershell
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はほぼ変わらなかった模様
```powershell
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](https://packages.msys2.org/package/mingw-w64-ucrt-x86_64-aom?repo=ucrt64)





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

どういう訳か**入っていない**ので、入ってるところから持ってくるかしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/ffd0c4d3-3c52-97bd-598c-bc807eeabd38.png)

EvryThingの検索結果。タイムスタンプも最新である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/2f5c6d9b-ae66-8711-be57-697706b8b6c2.png)

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

Lame.pcの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/2b069b59-91ab-d422-c1b4-b933eeb3d970.png)

#### libフォルダ
入ってた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/34ffec90-cc89-ac31-7cfa-1e13fd1d1299.png)
#### includeフォルダ
Lame.aは**入ってない** 入れよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/1c6a7efa-fef8-5ff0-e80b-0020082331c7.png)
とにかく更新日時が最新のものを追加されたものと考えて使う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/73daa8f2-65ad-0123-cf69-5ec55f10566a.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以降に標準で入っている。

 https://learn.microsoft.com/ja-jp/cpp/windows/universal-crt-deployment?view=msvc-170



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