ffmpegでエンコードした動画がWindows Media Playerで再生できない問題の解決録
はじめに
この記事は、ffmpeg でエンコードした動画ファイルが、特定の環境(Windows Media Player)で再生できない問題に直面し、その解決に至るまでの試行錯誤をまとめたものです。
はじめに、結論
結論から言うと、Windows Media Playerとの互換性を最優先するなら、WindowsネイティブなWMV形式でエンコードするのが最も確実でした。
発生した問題と要件
要件
クライアントから、約23GBの動画ファイル(.m2ts形式)について、以下の要件で加工してほしいと依頼がありました。
- Windows Media Playerで再生できること
- DVDに焼けるように4.7GB以下にすること
発生した問題
当初、手慣れていた ffmpeg (Ubuntu Server上で実行) を使ってH.264形式にエンコードしましたが、納品先で「最初のフレームは表示されるものの、そこから先に進まず再生できない」という問題が発生しました。
試行錯誤の記録 (ffmpegでの挑戦)
再生できない原因を探るため、ffmpeg の設定を変えながら様々なエンコードを試しました。
試行1: H.264エンコード (ハードウェア/ソフトウェア)
普段、録画サーバーではGPU(NVIDIA)を使ったハードウェアエンコード(NVENC)を利用しているため、まずはこちらを試しました。
# H.265 (HEVC) / NVENC ※再生できず
ffmpeg -i input.m2ts -c:v hevc_nvenc -preset slow -cq 28 output.mp4
# H.264 / NVENC ※再生できず
ffmpeg -i input.m2ts -c:v h264_nvenc -preset slow -cq 24 output.mp4
しかし、ハードウェアエンコードしたファイルは両方とも再生不可でした。
次に、互換性が高いとされるCPUでのソフトウェアエンコードを試しました。
# H.264 / CPU (libx264) ※5分のテストファイルは再生できたが、フル尺は再生不可
ffmpeg -i input.m2ts -c:v libx264 -preset medium -crf 23 output.mp4
驚いたことに、この方法でエンコードした5分のテスト動画は再生できましたが、3時間のフル尺動画は再生できませんでした。
試行2: 解像度とピクセルフォーマットの変更
次に、ファイルサイズや解像度が影響している可能性を考え、解像度を下げたり、Windowsとの互換性でよく指摘されるピクセルフォーマット yuv420p を明示的に指定したりしました。
# 解像度を 1024x576 に変更 ※再生できず
ffmpeg -i input.m2ts -c:v libx264 -vf "scale=1024:-1" -crf 23 output.mp4
# ピクセルフォーマットを yuv420p に指定 ※再生できず
ffmpeg -i input.m2ts -c:v libx264 -pix_fmt yuv420p -crf 23 output.mp4
しかし、これらの方法でも問題は解決しませんでした。
試行3: MPEG2エンコード
より古い形式で汎用性の高いMPEG2ならどうかと考え、試してみました。
# MPEG2エンコード ※再生できず
ffmpeg -i input.m2ts -c:v mpeg2video -q:v 2 -b:v 5000k output.mpg
結果は変わらず、再生できませんでした。
解決策: Windows上のソフトでWMV形式にエンコード
ffmpeg での解決を諦め、「Windowsで再生するファイルは、Windows環境で作るのが確実ではないか」という仮説のもと、アプローチを大きく変更しました。
私はWindowsパソコンを所有していませんので、AWSでEC2を構築するようにしました。
- 環境: AWSでWindows Serverインスタンスを構築。
- 使用ソフト: TMPGEnc Video Mastering Works 7 の体験版を使用。
- エンコード形式: WMV (Windows Media Video) を選択。
この方法でエンコードしたところ、ついにWindows Media Playerで問題なく再生できるファイルが完成しました。ファイルサイズも2.5GBとなり、要件を満たすことができました。
なぜffmpegのH.264は再生できなかったのか? (考察)
Windows Media Player (特に古いバージョン) は、対応しているH.264の仕様(プロファイルやレベル)が限定的です。ffmpeg のデフォルト設定でエンコードされたH.264動画が、その仕様から外れていたため再生できなかった可能性が高いです。(あくまで推測です)
特定のプロファイル(例: baseline や main)を指定すれば ffmpeg でも再生できるファイルを作成できたかもしれませんが、確実性を求められる場面では、ターゲット環境に最もネイティブなWMV形式を選択するのが有効な手段でした。
振り返って
今回の件は、動画エンコードの奥深さと、再生環境の互換性を考慮することの重要性を再認識させられる経験となりました。
Discussion