技術約8分で読めます

FFmpeg 9.0「Lei」公開、TLS証明書検証が既定で有効になりアニメーションWebPもネイティブ対応した

いけさん目次

FFmpegプロジェクトは2026年8月4日、メジャーバージョン9.0「Lei」を公開した。
リリースブランチは2026年6月26日にmasterから分岐したもので、2026年3月16日公開の8.1から約4か月後のメジャーリリースになり、GitHubのn8.1...n9.0比較では2205コミット、1794ファイルの変更が入っている。

FFmpegはffmpeg-develのメーリングリストで開発され、動画・音声の変換や配信基盤として組み込まれるオープンソースのマルチメディアフレームワークだ。
ブラウザやスマートフォンアプリ、配信サーバーの裏側で使われていることが多く、直接コマンドを叩かない開発者でも依存ライブラリとして影響を受ける。

7つのライブラリが全部メジャーバージョンを更新した

FFmpegはlibavcodec(コーデック処理)やlibavformat(コンテナ・プロトコル処理)など複数の内部ライブラリで構成されており、メジャーリリースのタイミングでそれぞれのバージョン番号が上がる。
9.0では7ライブラリ全てが対象になった。

ライブラリ8.0時点9.0役割
libavutil60.8.10061.1.100共通ユーティリティ
libavcodec62.11.10063.1.100エンコード・デコード
libavformat62.3.10063.1.100コンテナ・プロトコル
libavdevice-63.1.100入出力デバイス
libavfilter-12.1.100フィルターグラフ
libswscale-10.1.100色空間変換・リサイズ
libswresample-7.1.100音声リサンプル

メジャーバージョンが上がるとABI(バイナリ互換性)が切れるため、FFmpegを動的リンクで組み込んでいるアプリケーションは再ビルドが必要になる。

TLS証明書検証が既定で有効になった

9.0では、TLSプロトコルのtls_verifyオプションの既定値が変わった。
httpsrtmpsなど、TLSの上に載る通信プロトコルで使うこのオプションは、これまで既定値が0(検証しない)だった。
9.0ではlibavformatのメジャーバージョンが63に達したことをトリガーに、既定値が1(通信相手が提示する証明書を検証する)に切り替わった。

この変更は2025年8月にTimo Rothenpieler氏がFFmpeg 8.0向けに実装したもので、FF_API_NO_DEFAULT_TLS_VERIFYというマクロにより、メジャーバージョン63未満ではこれまでの動作を維持し、63以降で新しい既定値に切り替わるようになっていた。
8.0のリリース時点で「次のメジャーバージョンから有効化する」と予告されており、9.0でその予告どおりに適用された。

信頼ストア(OSやアプリが持つ信頼済みCA証明書の一覧)に登録されていない自己署名証明書、期限切れ証明書、必要なCA証明書がない環境では、検証に対応したTLSバックエンドで接続に失敗するようになる。
-tls_verify 0を指定すると検証は無効になる。-ca_fileで証明書を信頼させれば、検証を有効にしたまま接続できる。

変更履歴(Changelog)で明示された削除項目として、ほかに次の2件がある。

変更内容
CELTデコーダーの削除スタンドアロンのceltコーデックのデコードサポートを削除。Opus内部のCELT層とは別物で、Opusの復号には影響しない
NVENCの旧オプション削除非推奨だったNVENCオプションと、NVIDIA SDK 11.1未満のサポートを削除

swscaleを再設計した

色空間変換とリサイズを担うlibswscaleは、内部実装を刷新した。
従来のx86 SIMD(CPUの並列演算命令)とAArch64 NEONによるCPU実行に加えて、VulkanのSPIR-Vシェーダーを使ったGPU実行が追加された構成になっている。

アニメーションWebPを2015年のチケットからネイティブ対応した

FFmpegには静止画WebP用のデコーダーがあったが、アニメーションWebPのデマルチプレクスとデコードには対応していなかった。
ANIMANMFといったアニメーション用チャンクには対応していなくて、チケットではimage data not foundで失敗すると報告されていた。
2015年10月に開いたチケット#4907以降、複数回のパッチ提案を経て、9.0で専用のデコーダーとデマルチプレクサーが追加された。

検証環境

TLSとアニメーションWebPの2点はローカルで確かめた。
9.0はHomebrewにまだ来ていない(この時点の安定版は8.1.2)ため、比較用の8.1.2と合わせて公式のソースアーカイブからビルドした。

項目内容
マシンM4 Mac mini(10コア)
OSmacOS 26.5.2
コンパイラApple clang 17.0.0
TLSバックエンドOpenSSL 3(Homebrewのopenssl@3)
configure--enable-openssl --disable-doc --disable-debug --disable-ffplay
その他libwebp 1.6.0(img2webp)、Python 3.14.4

外部ライブラリがほぼない最小構成なので、make -j10は各バージョン40秒台で終わった。

自己署名証明書のHTTPSで新旧の挙動を実測した

まず-h protocol=tlsで既定値の差分を確認した。

# 8.1.2
-tls_verify        <boolean>    ED......... Verify the peer certificate (default false)
# 9.0
-tls_verify        <boolean>    ED......... Verify the peer certificate (default true)

接続テストは、SAN(証明書に登録するホスト名欄)にlocalhostを入れた自己署名証明書を作り、Pythonのhttp.serverをTLSで包んだローカルHTTPSサーバーからテスト動画を取得する形にした。

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem \
  -days 30 -nodes -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost"

配信側でこけた。Pythonのhttp.serverはRangeリクエストに対応していないため、moovアトムが末尾にある通常のmp4はストリーム情報の取得で先に失敗する。
テスト動画は-movflags +faststartを付けて作った。

ffmpeg -i https://localhost:8443/test.mp4 -f null -を5パターンで実行した結果はこんな感じ。

バージョンオプション結果
8.1.2なし成功(75フレームデコード)
9.0なし失敗(証明書検証エラー)
9.0-tls_verify 0成功
9.0-ca_file cert.pem成功
8.1.2-tls_verify 1 -ca_file cert.pem成功

9.0の無指定実行では、次のエラーが出て入力を開けなかった。

[tls @ 0xa8ec14080] error:0A000086:SSL routines::certificate verify failed
[in#0 @ 0xa8ec0c000] Error opening input: Input/output error
Error opening input file https://localhost:8443/test.mp4.

検証が既定で有効な9.0では、-tls_verify 1を付けなくても-ca_file cert.pemの指定だけで接続が通った。
SAN付き証明書を使ったので、ホスト名の検証も通過した。
8.1.2でもオプションを明示すれば検証つきで接続できていたので、両者の差は既定値だけだった。

アニメーションWebPを8.1.2と9.0でデコードした

img2webpで10フレーム・100ミリ秒間隔のアニメーションWebP(2,476バイト)を作り、同じファイルを両バージョンに入力した。

8.1.2は静止画用のwebp_pipeとして読もうとしてストリーム情報の取得に失敗し、デコードは0フレームで止まった。

[webp_pipe @ 0xa7d42c000] Could not find codec parameters for stream 0 (Video: webp, none): unspecified size
(中略)
frame=    0 fps=0.0 q=0.0 Lsize=       0KiB time=N/A bitrate=N/A speed=N/A
Conversion failed!

チケット#4907にあったimage data not foundとはメッセージが違ったが、デコードできない点は変わらなかった。

9.0は新しいwebp_animデマルチプレクサーで読み、10フレーム全部をデコードした。

Input #0, webp_anim, from 'anim.webp':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: webp_anim, argb, 320x240, 10 fps, 10 tbr, 1k tbn

mp4への変換も試し、10フレームのmpeg4動画がそのまま出てきた。

GPU処理まわりの追加

追加機能内容
v360_vulkanフィルター360度・パノラマ動画の投影変換をVulkan経由でGPUに処理させる
APVのVulkanハードウェアアクセラレーションSamsung開発のAPVコーデックのエンコード・デコードをGPUで実行する
ONNX Runtime DNNバックエンドdnn_processingフィルターでCPUに加えCUDA・DirectML・VitisAIの実行プロバイダーを選べる
transpose_cudaフィルターNVIDIA GPU上でフレームを回転・転置する
AMD AMF関連フレームレート変換のfrc_amf、HDR対応を広げたvpp_amf、ハードウェアメモリマッピング対応

そのほかの対応コーデック・機能

  • ProRes RAWのVideoToolboxハードウェアアクセラレーション(Apple製品向け)
  • Dolby Vision Profile 7の多層HEVCを分離するdovi_splitビットストリームフィルター
  • SMPTE 2094-50メタデータの読み取りとパススルー(HDR関連メタデータ)
  • LCEVCのMP4マルチプレクサへのトラック多重化対応
  • HE-AAC 960デコード(DAB+デジタルラジオ向け)
  • Playdate向け動画エンコーダーとマルチプレクサー

FFmpeg 8.0のOpenAI Whisperを使った音声認識フィルターやVulkanベースのAV1エンコード、VP9のVulkanハードウェアアクセラレーションに続き、9.0でもVulkanを中心にGPU対応が広がった。

Homebrewやapt、静的ビルド配布(BtbN/FFmpeg-Buildsなど)の9.0系はまだ確認できていないが、同じソースが基になるので、この既定値変更も同じように入ってくるはずだ。

Sources: