Introduction

掲題の通り、FFMPEG で libopenh264 を Windows でビルドして使う方法。

H264 や H265 の特許にまみれたエンコーダのせいで、おちおち商用で使えないため、ここいらで本腰入れて作り方を習得した。
ネットで転がっている記事はそれなりにあるが、手順はしょってるし、libopenh264 が ffmpeg に埋め込まれていて、libopenh264 を使うことによるメリット ライセンス料支払いの免責 が意味をなしてなかったりしてる。

これ とか。
libopenh264.dll を外しても普通に OpenH264 でエンコードを始めてしまう。
(マシン上に libopenh264.dll がどこにも存在しないことを確認した上で試したので間違いない)

How to build?

必要なものは下記

以前も MSYS2 は使ったことがあるが、正直あまり好きではない。
Ubuntu でのクロスコンパイルも試してみたが、どうしても libopenh264 のクロスコンパイルができなかったので、泣く泣く MSYS2 で対応。

1. MSYS2 のセットアップ

下記からダウンロード。

MSYS2

手順に従ってインストールするだけ。
インストール先は変更しないほうが無難。

MSYS2

MSYS2

MSYS2

MSYS2

MSYS2

2. パッケージの更新

MSYS2 MINGW64 を起動。

MSYS2

少し時間がかかるが、起動するとコンソールが表示される。

まず、パッケージマネージャの更新を実施。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
:: Synchronizing package databases...
mingw32 1757.2 KiB 815 KiB/s 00:02 [###############################] 100%
mingw64 1772.4 KiB 680 KiB/s 00:03 [###############################] 100%
ucrt64 1817.9 KiB 685 KiB/s 00:03 [###############################] 100%
clang32 1738.5 KiB 818 KiB/s 00:02 [###############################] 100%
clang64 1761.5 KiB 755 KiB/s 00:02 [###############################] 100%
msys 414.6 KiB 355 KiB/s 00:01 [###############################] 100%
warning: bash-5.2.009-1 is up to date -- skipping
warning: pacman-mirrors-20221016-1 is up to date -- skipping
resolving dependencies...
looking for conflicting packages...

Packages (2) msys2-runtime-3.4.3-4 pacman-6.0.1-26

Total Download Size: 7.95 MiB
Total Installed Size: 39.60 MiB
Net Upgrade Size: -4.68 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
msys2-runtime-3.4.3-4-x86_64 2.4 MiB 1701 KiB/s 00:01 [###############################] 100%
pacman-6.0.1-26-x86_64 5.5 MiB 2.35 MiB/s 00:02 [###############################] 100%
Total (2/2) 7.9 MiB 3.10 MiB/s 00:03 [###############################] 100%
(2/2) checking keys in keyring [###############################] 100%
(2/2) checking package integrity [###############################] 100%
(2/2) loading package files [###############################] 100%
(2/2) checking for file conflicts [###############################] 100%
(2/2) checking available disk space [###############################] 100%
:: Processing package changes...
(1/2) upgrading pacman [###############################] 100%
(2/2) upgrading msys2-runtime [###############################] 100%

完了後、MINGW64 を再起動。

次に、既にインストールされているパッケージを更新する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
$ pacman -Syuu
:: Synchronizing package databases...
mingw32 is up to date
mingw64 is up to date
ucrt64 is up to date
clang32 is up to date
clang64 is up to date
msys is up to date
:: Starting core system upgrade...
there is nothing to do
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...

Packages (13) brotli-1.0.9-5 bsdtar-3.6.2-3 curl-7.87.0-2 gawk-5.2.1-2 heimdal-libs-7.8.0-3
libcurl-7.87.0-2 liblzma-5.4.0-1 libopenssl-3.0.7-2 libpcre2_8-10.42-1
libssh2-1.10.0-3 nano-7.1-1 openssl-3.0.7-2 xz-5.4.0-1

Total Download Size: 7.34 MiB
Total Installed Size: 21.44 MiB
Net Upgrade Size: 1.69 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
openssl-3.0.7-2-x86_64 661.0 KiB 1091 KiB/s 00:01 [###############################] 100%
gawk-5.2.1-2-x86_64 1224.1 KiB 1731 KiB/s 00:01 [###############################] 100%
heimdal-libs-7.8.0-3-x86_64 832.6 KiB 975 KiB/s 00:01 [###############################] 100%
curl-7.87.0-2-x86_64 916.2 KiB 1063 KiB/s 00:01 [###############################] 100%
libopenssl-3.0.7-2-x86_64 1603.9 KiB 1728 KiB/s 00:01 [###############################] 100%
brotli-1.0.9-5-x86_64 339.4 KiB 870 KiB/s 00:00 [###############################] 100%
nano-7.1-1-x86_64 640.8 KiB 1140 KiB/s 00:01 [###############################] 100%
xz-5.4.0-1-x86_64 319.0 KiB 795 KiB/s 00:00 [###############################] 100%
libcurl-7.87.0-2-x86_64 253.2 KiB 621 KiB/s 00:00 [###############################] 100%
bsdtar-3.6.2-3-x86_64 323.6 KiB 550 KiB/s 00:01 [###############################] 100%
libssh2-1.10.0-3-x86_64 192.5 KiB 486 KiB/s 00:00 [###############################] 100%
libpcre2_8-10.42-1-x86_64 125.0 KiB 342 KiB/s 00:00 [###############################] 100%
liblzma-5.4.0-1-x86_64 85.3 KiB 257 KiB/s 00:00 [###############################] 100%
Total (13/13) 7.3 MiB 4.11 MiB/s 00:02 [###############################] 100%
(13/13) checking keys in keyring [###############################] 100%
(13/13) checking package integrity [###############################] 100%
(13/13) loading package files [###############################] 100%
(13/13) checking for file conflicts [###############################] 100%
(13/13) checking available disk space [###############################] 100%
:: Processing package changes...
( 1/13) upgrading brotli [###############################] 100%
( 2/13) upgrading liblzma [###############################] 100%
( 3/13) upgrading libopenssl [###############################] 100%
( 4/13) upgrading bsdtar [###############################] 100%
( 5/13) upgrading heimdal-libs [###############################] 100%
( 6/13) upgrading openssl [###############################] 100%
( 7/13) upgrading libpcre2_8 [###############################] 100%
( 8/13) upgrading libssh2 [###############################] 100%
( 9/13) upgrading libcurl [###############################] 100%
(10/13) upgrading curl [###############################] 100%
(11/13) upgrading gawk [###############################] 100%
(12/13) upgrading nano [###############################] 100%
(13/13) upgrading xz [###############################] 100%
:: Running post-transaction hooks...
(1/1) Updating the info directory file...

3. パッケージの準備

ここからビルドに必要なものをインストール。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
$ pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-yasm mingw-w64-x86_64-pkg-config git make diffutils
resolving dependencies...
looking for conflicting packages...
warning: dependency cycle detected:
warning: mingw-w64-x86_64-gcc-libs will be installed before its mingw-w64-x86_64-mpc dependency
warning: dependency cycle detected:
warning: mingw-w64-x86_64-gcc-libs will be installed before its mingw-w64-x86_64-mpfr dependency

Packages (54) heimdal-7.8.0-3 libcbor-0.9.0-1 libfido2-1.12.0-2 mingw-w64-x86_64-binutils-2.39-2
mingw-w64-x86_64-crt-git-10.0.0.r186.gfc55e181b-1 mingw-w64-x86_64-expat-2.5.0-1
mingw-w64-x86_64-gcc-libs-12.2.0-6 mingw-w64-x86_64-gettext-0.21-3
mingw-w64-x86_64-gmp-6.2.1-4 mingw-w64-x86_64-headers-git-10.0.0.r186.gfc55e181b-1
mingw-w64-x86_64-isl-0.25-1 mingw-w64-x86_64-libiconv-1.17-1
mingw-w64-x86_64-libwinpthread-git-10.0.0.r186.gfc55e181b-1
mingw-w64-x86_64-mpc-1.3.1-1 mingw-w64-x86_64-mpfr-4.1.1.p1-2
mingw-w64-x86_64-windows-default-manifest-6.4-4
mingw-w64-x86_64-winpthreads-git-10.0.0.r186.gfc55e181b-1
mingw-w64-x86_64-zlib-1.2.13-2 mingw-w64-x86_64-zstd-1.5.2-2 openssh-9.1p1-2
perl-Authen-SASL-2.16-2 perl-Clone-0.45-3 perl-Convert-BinHex-1.125-1
perl-Encode-Locale-1.05-1 perl-Error-0.17029-1 perl-File-Listing-6.15-1
perl-HTML-Parser-3.80-1 perl-HTML-Tagset-3.20-2 perl-HTTP-Cookies-6.10-1
perl-HTTP-Daemon-6.14-1 perl-HTTP-Date-6.05-1 perl-HTTP-Message-6.44-1
perl-HTTP-Negotiate-6.01-2 perl-IO-HTML-1.004-1 perl-IO-Socket-SSL-2.077-1
perl-IO-Stringy-2.113-1 perl-LWP-MediaTypes-6.04-1 perl-MIME-tools-5.510-1
perl-MailTools-2.21-1 perl-Net-HTTP-6.22-1 perl-Net-SMTP-SSL-1.04-1
perl-Net-SSLeay-1.92-3 perl-TermReadKey-2.38-4 perl-TimeDate-2.33-1
perl-Try-Tiny-0.31-1 perl-URI-5.16-1 perl-WWW-RobotRules-6.02-2 perl-libwww-6.67-1
diffutils-3.8-4 git-2.39.0-2 make-4.4-1 mingw-w64-x86_64-gcc-12.2.0-6
mingw-w64-x86_64-pkg-config-0.29.2-3 mingw-w64-x86_64-yasm-1.3.0-4

Total Download Size: 61.80 MiB
Total Installed Size: 472.23 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
mingw-w64-x86_64-binutils-2.39-2-any 5.9 MiB 2.73 MiB/s 00:02 [#################################################] 100%
mingw-w64-x86_64-gettext-0.21-3-any 3.1 MiB 2.09 MiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-isl-0.25-1-any 1396.6 KiB 1042 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-crt-git-10.0.0.r186.gfc55e181b-1-any 3.3 MiB 618 KiB/s 00:05 [#################################################] 100%
openssh-9.1p1-2-x86_64 945.1 KiB 942 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-gcc-libs-12.2.0-6-any 876.7 KiB 602 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-libiconv-1.17-1-any 720.2 KiB 808 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-gmp-6.2.1-4-any 571.9 KiB 697 KiB/s 00:01 [#################################################] 100%
heimdal-7.8.0-3-x86_64 544.5 KiB 641 KiB/s 00:01 [#################################################] 100%
git-2.39.0-2-x86_64 6.2 MiB 740 KiB/s 00:09 [#################################################] 100%
make-4.4-1-x86_64 501.7 KiB 660 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-yasm-1.3.0-4-any 511.1 KiB 510 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-zstd-1.5.2-2-any 494.9 KiB 600 KiB/s 00:01 [#################################################] 100%
diffutils-3.8-4-x86_64 363.9 KiB 596 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-mpfr-4.1.1.p1-2-any 415.6 KiB 530 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-headers-git-10.0.0.r186.gfc55e181b... 5.6 MiB 592 KiB/s 00:10 [#################################################] 100%
mingw-w64-x86_64-pkg-config-0.29.2-3-any 262.8 KiB 515 KiB/s 00:01 [#################################################] 100%
perl-Net-SSLeay-1.92-3-x86_64 209.9 KiB 397 KiB/s 00:01 [#################################################] 100%
perl-IO-Socket-SSL-2.077-1-any 156.7 KiB 363 KiB/s 00:00 [#################################################] 100%
perl-MIME-tools-5.510-1-any 183.6 KiB 333 KiB/s 00:01 [#################################################] 100%
mingw-w64-x86_64-expat-2.5.0-1-any 155.8 KiB 361 KiB/s 00:00 [#################################################] 100%
perl-libwww-6.67-1-any 129.8 KiB 301 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-mpc-1.3.1-1-any 104.4 KiB 267 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-zlib-1.2.13-2-any 103.7 KiB 241 KiB/s 00:00 [#################################################] 100%
perl-MailTools-2.21-1-any 81.0 KiB 214 KiB/s 00:00 [#################################################] 100%
perl-HTML-Parser-3.80-1-x86_64 80.5 KiB 215 KiB/s 00:00 [#################################################] 100%
perl-URI-5.16-1-any 80.3 KiB 214 KiB/s 00:00 [#################################################] 100%
perl-HTTP-Message-6.44-1-any 77.1 KiB 178 KiB/s 00:00 [#################################################] 100%
libfido2-1.12.0-2-x86_64 76.8 KiB 199 KiB/s 00:00 [#################################################] 100%
perl-IO-Stringy-2.113-1-any 66.4 KiB 173 KiB/s 00:00 [#################################################] 100%
perl-TimeDate-2.33-1-any 55.2 KiB 145 KiB/s 00:00 [#################################################] 100%
perl-Convert-BinHex-1.125-1-any 42.8 KiB 115 KiB/s 00:00 [#################################################] 100%
perl-Authen-SASL-2.16-2-any 42.4 KiB 126 KiB/s 00:00 [#################################################] 100%
perl-LWP-MediaTypes-6.04-1-any 40.7 KiB 125 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-winpthreads-git-10.0.0.r186.gfc55e... 40.1 KiB 113 KiB/s 00:00 [#################################################] 100%
perl-Error-0.17029-1-any 39.4 KiB 107 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-libwinpthread-git-10.0.0.r186.gfc5... 29.0 KiB 77.0 KiB/s 00:00 [#################################################] 100%
perl-HTTP-Date-6.05-1-any 28.9 KiB 84.3 KiB/s 00:00 [#################################################] 100%
perl-Encode-Locale-1.05-1-any 24.3 KiB 73.1 KiB/s 00:00 [#################################################] 100%
perl-HTTP-Cookies-6.10-1-any 23.4 KiB 70.3 KiB/s 00:00 [#################################################] 100%
perl-Net-HTTP-6.22-1-any 23.1 KiB 68.0 KiB/s 00:00 [#################################################] 100%
perl-TermReadKey-2.38-4-x86_64 21.1 KiB 62.9 KiB/s 00:00 [#################################################] 100%
perl-Try-Tiny-0.31-1-any 19.8 KiB 59.8 KiB/s 00:00 [#################################################] 100%
perl-HTTP-Daemon-6.14-1-any 18.6 KiB 57.3 KiB/s 00:00 [#################################################] 100%
perl-Net-SMTP-SSL-1.04-1-any 18.4 KiB 57.1 KiB/s 00:00 [#################################################] 100%
libcbor-0.9.0-1-x86_64 18.0 KiB 53.9 KiB/s 00:00 [#################################################] 100%
perl-IO-HTML-1.004-1-any 16.1 KiB 47.5 KiB/s 00:00 [#################################################] 100%
perl-WWW-RobotRules-6.02-2-any 12.2 KiB 37.5 KiB/s 00:00 [#################################################] 100%
perl-HTTP-Negotiate-6.01-2-any 11.4 KiB 35.1 KiB/s 00:00 [#################################################] 100%
perl-File-Listing-6.15-1-any 10.9 KiB 32.4 KiB/s 00:00 [#################################################] 100%
perl-Clone-0.45-3-x86_64 10.8 KiB 32.7 KiB/s 00:00 [#################################################] 100%
perl-HTML-Tagset-3.20-2-any 10.3 KiB 29.5 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-windows-default-manifest-6.4-4-any 3.1 KiB 8.97 KiB/s 00:00 [#################################################] 100%
mingw-w64-x86_64-gcc-12.2.0-6-any 28.3 MiB 1420 KiB/s 00:20 [#################################################] 100%
Total (54/54) 61.8 MiB 3.03 MiB/s 00:20 [#################################################] 100%
(54/54) checking keys in keyring [#################################################] 100%
(54/54) checking package integrity [#################################################] 100%
(54/54) loading package files [#################################################] 100%
(54/54) checking for file conflicts [#################################################] 100%
(54/54) checking available disk space [#################################################] 100%
:: Processing package changes...
( 1/54) installing mingw-w64-x86_64-libiconv [#################################################] 100%
( 2/54) installing mingw-w64-x86_64-zlib [#################################################] 100%
( 3/54) installing mingw-w64-x86_64-binutils [#################################################] 100%
( 4/54) installing mingw-w64-x86_64-headers-git [#################################################] 100%
( 5/54) installing mingw-w64-x86_64-crt-git [#################################################] 100%
( 6/54) installing mingw-w64-x86_64-gmp [#################################################] 100%
( 7/54) installing mingw-w64-x86_64-isl [#################################################] 100%
( 8/54) installing mingw-w64-x86_64-libwinpthread-git [#################################################] 100%
( 9/54) installing mingw-w64-x86_64-gcc-libs [#################################################] 100%
(10/54) installing mingw-w64-x86_64-mpfr [#################################################] 100%
(11/54) installing mingw-w64-x86_64-mpc [#################################################] 100%
(12/54) installing mingw-w64-x86_64-windows-default-manifest [#################################################] 100%
(13/54) installing mingw-w64-x86_64-winpthreads-git [#################################################] 100%
(14/54) installing mingw-w64-x86_64-zstd [#################################################] 100%
(15/54) installing mingw-w64-x86_64-gcc [#################################################] 100%
(16/54) installing mingw-w64-x86_64-expat [#################################################] 100%
(17/54) installing mingw-w64-x86_64-gettext [#################################################] 100%
(18/54) installing mingw-w64-x86_64-yasm [#################################################] 100%
(19/54) installing mingw-w64-x86_64-pkg-config [#################################################] 100%
(20/54) installing heimdal [#################################################] 100%
(21/54) installing libcbor [#################################################] 100%
(22/54) installing libfido2 [#################################################] 100%
(23/54) installing openssh [#################################################] 100%
(24/54) installing perl-Error [#################################################] 100%
(25/54) installing perl-Authen-SASL [#################################################] 100%
(26/54) installing perl-Encode-Locale [#################################################] 100%
(27/54) installing perl-HTTP-Date [#################################################] 100%
(28/54) installing perl-File-Listing [#################################################] 100%
(29/54) installing perl-HTML-Tagset [#################################################] 100%
(30/54) installing perl-Clone [#################################################] 100%
(31/54) installing perl-IO-HTML [#################################################] 100%
(32/54) installing perl-LWP-MediaTypes [#################################################] 100%
(33/54) installing perl-URI [#################################################] 100%
(34/54) installing perl-HTTP-Message [#################################################] 100%
(35/54) installing perl-HTML-Parser [#################################################] 100%
(36/54) installing perl-HTTP-Cookies [#################################################] 100%
(37/54) installing perl-HTTP-Daemon [#################################################] 100%
(38/54) installing perl-HTTP-Negotiate [#################################################] 100%
(39/54) installing perl-Net-HTTP [#################################################] 100%
(40/54) installing perl-WWW-RobotRules [#################################################] 100%
(41/54) installing perl-Try-Tiny [#################################################] 100%
(42/54) installing perl-libwww [#################################################] 100%
Optional dependencies for perl-libwww
perl-LWP-Protocol-https: for https:// url schemes
(43/54) installing perl-TimeDate [#################################################] 100%
(44/54) installing perl-MailTools [#################################################] 100%
(45/54) installing perl-IO-Stringy [#################################################] 100%
(46/54) installing perl-Convert-BinHex [#################################################] 100%
module test... pass.
(47/54) installing perl-MIME-tools [#################################################] 100%
(48/54) installing perl-Net-SSLeay [#################################################] 100%
(49/54) installing perl-IO-Socket-SSL [#################################################] 100%
(50/54) installing perl-Net-SMTP-SSL [#################################################] 100%
(51/54) installing perl-TermReadKey [#################################################] 100%
(52/54) installing git [#################################################] 100%
Optional dependencies for git
python: various helper scripts
subversion: git svn
(53/54) installing make [#################################################] 100%
(54/54) installing diffutils [#################################################] 100%
:: Running post-transaction hooks...
(1/1) Updating the info directory file...

4. libopenh264 のインストール

パッケージマネージャからインストール。
最新版は現時点で 2.3.1。
このバージョンが重要で、後述の libopenh264.dll を使う際は、同じバージョンを使う必要がある。

ソースからのビルドでも可能だが、これが確実。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ pacman -S mingw-w64-x86_64-openh264
resolving dependencies...
looking for conflicting packages...

Packages (1) mingw-w64-x86_64-openh264-2.3.1-1

Total Download Size: 0.61 MiB
Total Installed Size: 5.11 MiB

:: Proceed with installation? [Y/n] Y
:: Retrieving packages...
mingw-w64-x86_64-openh264-2.3.1-1-any 623.7 KiB 358 KiB/s 00:02 [#################################################] 100%
(1/1) checking keys in keyring [#################################################] 100%
(1/1) checking package integrity [#################################################] 100%
(1/1) loading package files [#################################################] 100%
(1/1) checking for file conflicts [#################################################] 100%
(1/1) checking available disk space [#################################################] 100%
:: Processing package changes...
(1/1) installing mingw-w64-x86_64-openh264 [#################################################] 100%

インストール後、/mingw64/lib/pkgconfig/openh264.pc に pkg-config ができる。

5. FFMPEG のビルド

ソースからビルドする。
最新版の 5 系は抵抗があるので、ここでは 4.3.5 を使用。

1
2
3
$ git config --global core.autoCRLF false
$ git clone -b n4.3.5 https://github.com/FFmpeg/FFmpeg ffmpeg
$ cd ffmpeg

次に、ビルドしたバイナリのインストール先フォルダを作る。
インストールと言っても単純にファイルが展開されるだけなので、システムディレクトリである必要はない。

1
$ mkdir /home/ffmpeg-build

FFMPEG をビルドする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ ./configure \
--prefix=/home/ffmpeg-build \
--disable-bzlib \
--disable-cuda \
--disable-cuvid \
--disable-debug \
--disable-doc \
--disable-gpl \
--disable-htmlpages \
--disable-iconv \
--disable-logging \
--disable-manpages \
--disable-podpages \
--disable-postproc \
--disable-txtpages \
--enable-avdevice \
--enable-d3d11va \
--enable-dxva2 \
--enable-hwaccel=h264_dxva2 \
--enable-libopenh264 \
--enable-optimizations \
--enable-shared \
--enable-static \
--enable-version3 \
--enable-optimizations \
--extra-ldflags='-static-libgcc -static-libstdc++'
$ make
$ make install

重要なのは下記

  • --disable-gpl
    • GPL のコンポーネントを無効化
  • --enable-libopenh264
    • libopenh264 を有効化。事前にライブラリやヘッダを用意する必要があり、openh264.pc がシステムにインストールされているか PKG_CONFIG_PATH でパスが通っている必要がある

以上を実行すると、時間がかかるがバイナリが /home/ffmpeg-build に展開される。

MSYS2

6. 実行準備

これだけでは動かない。
正確には、FFMPEG をビルドした、MINGW64 が入っていないマシン上では、である。
MINGW64 の世界で参照した dll が欠落しているためである。

必要なのは下記。

  • libopenh264.dll
    • openh264 から適切なバージョン、プラットフォームのものをダウンロードして展開 (bz2 形式なので)し、名前を変更
    • github からダウンロードされたのものは Cisco のデジタル署名がなされているので要確認
  • C:\msys64\mingw64\bin\libwinpthread-1.dll
  • C:\msys64\mingw64\bin\zlib1.dll
  • C:\msys64\mingw64\bin\liblzma-5.dll
    • これが必要になる環境があったが原因は不明

ffmpeg.exe をたたいて動くまで必要な dll を回収する。
エラーを出さずに落ちるので、 Dependencies などで不足している dll を見つけ出す必要がある。

無事に動くと

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ffmpeg.exe
ffmpeg version n4.3.5 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.2.0 (Rev6, Built by MSYS2 project)
configuration: --prefix=/home/ffmpeg-build --disable-logging --disable-gpl --enable-version3 --enable-static --enable-shared --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-avdevice --disable-postproc --disable-bzlib --disable-iconv --enable-libopenh264 --disable-cuda --disable-cuvid --enable-d3d11va --enable-dxva2 --enable-hwaccel=h264_dxva2 --disable-debug --enable-optimizations --extra-ldflags='-static-libgcc -static-libstdc++'
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

のように、ビルドした際のオプションなどが表示される。

7. libopenh264.dll が正しくリンクされているか確認

既に前の説明で気付くかもしれないが、libopenh264.dll が欠落していると

MSYS2

が出る。
または、libopenh264.dll 「だけ」が欠落していると、 ffmpeg が何も言わずに終了するので、それで判断することもできる。

8. H264 の動画を作る

手っ取り早く作るなら、連続した画像から作る方法がある。

ここではフリー素材を拝借してテスト。
フリー素材 (連番PNG) から 小さい雪と大きな雪 [各 5秒] を利用。

Snow(L)_00000.png のような末尾に 5 桁の数字が付与された連番の png であるため、下記のように指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ ffmpeg.exe -y ^
-framerate 29.4 ^
-i "Snow(L)\Snow(L)_%05d.png" ^
-vcodec libopenh264 ^
-pix_fmt yuv420p ^
test.mp4

ffmpeg version n4.3.5 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.2.0 (Rev6, Built by MSYS2 project)
configuration: --prefix=/home/ffmpeg-build --disable-logging --disable-gpl --enable-version3 --enable-static --enable-shared --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-avdevice --disable-postproc --disable-bzlib --disable-iconv --enable-libopenh264 --disable-cuda --disable-cuvid --enable-d3d11va --enable-dxva2 --enable-hwaccel=h264_dxva2 --disable-debug --enable-optimizations --extra-ldflags='-static-libgcc -static-libstdc++'
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
Input #0, image2, from 'Snow(L)\Snow(L)_%05d.png':
Duration: 00:00:05.10, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgba(pc), 1920x1080 [SAR 1:1 DAR 16:9], 29.42 fps, 29.40 tbr, 29.40 tbn, 29.40 tbc
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libopenh264))
Press [q] to stop, [?] for help
[libopenh264 @ 0000025ddbc69e40] Slice count will be set automatically
[libopenh264 @ 0000025ddbc69e40] [OpenH264] this = 0x0000025DD9CE5530, Warning:bEnableFrameSkip = 0,bitrate can't be controlled for RC_QUALITY_MODE,RC_BITRATE_MODE and RC_TIMESTAMP_MODE without enabling skip frame.
Output #0, mp4, to 'test.mp4':
Metadata:
encoder : Lavf58.45.100
Stream #0:0: Video: h264 (libopenh264) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 29.40 fps, 18816 tbn, 29.40 tbc
Metadata:
encoder : Lavc58.91.100 libopenh264
Side data:
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
frame= 150 fps= 70 q=-0.0 Lsize= 2000kB time=00:00:05.06 bitrate=3232.2kbits/s speed=2.37x
video:1998kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.069837%

バッチファイルから実行する場合は、下記のように % をエスケープする必要があるので注意。

1
2
3
4
5
6
$ ffmpeg.exe -y ^
-framerate 29.4 ^
-i "Snow(L)\Snow(L)_%%05d.png" ^
-vcodec libopenh264 ^
-pix_fmt yuv420p ^
test.mp4

ちなみに、-vcodec libopenh264 をつけなくても動画を作ることはできるが、コーデックに下記のような違いが出る。

NotH264

H264

以上。