【ITニュース解説】Fixing iPhone HEVC for Telegram Video Avatars with ffmpeg
2026年10月15日に「Dev.to」が公開したITニュース「Fixing iPhone HEVC for Telegram Video Avatars with ffmpeg」について初心者にもわかりやすく解説しています。
ITニュース概要
iPhoneで撮ったHEVC動画はTelegramビデオアバターに設定できない。TelegramはH.264形式、800x800サイズ、10秒以内、音声なしなど特定要件があるためだ。FFmpegを使い、クロップ、リサイズ、H.264への変換、音声削除などの処理が必要。この変換を自動化するTelegramボットも開発された。
ITニュース解説
システムエンジニアを目指す皆さんにとって、日々の生活で感じる些細な不便が、実はプログラミングや技術で解決できる大きな課題のきっかけとなることがある。今回のニュース記事は、iPhoneで撮影した動画を人気メッセージアプリであるTelegramのビデオアバターに設定しようとした際に発生する問題を解決した事例について解説する。
発端は、iPhoneで撮ったお気に入りの動画をTelegramのプロフィールビデオアバターに設定しようとしたが、何度試しても受け付けられず、何も表示されないという現象だった。エラーメッセージも表示されず、なぜうまくいかないのかが全くわからない状況だ。この問題の根本原因は、動画の圧縮方式、つまり「コーデック」の違いにある。最近のiPhone(iOS 11以降)は、より効率的に高画質な動画を保存できる「HEVC(High Efficiency Video Coding)」、別名H.265という形式で動画を撮影する。しかし、Telegramのビデオアバター処理システムは、より古いながらも広く普及している「H.264」というコーデックしか受け付けない。この互換性のなさにより、iPhoneで撮影されたHEVC動画はTelegramによってサイレントに拒否されていたのだ。
この問題を解決するためには、iPhoneのHEVC動画をTelegramが求めるH.264形式に変換する必要がある。記事では、試行錯誤の結果、Telegramのビデオアバターとして機能する動画の正確な仕様を特定している。それは、ビデオコーデックがH.264であること、ピクセルフォーマットがyuv420pであること、解像度が厳密に800x800ピクセルであること、最大再生時間が10秒以内であること、最大ファイルサイズが2MB以内であること、音声が含まれていないこと、そしてMP4コンテナ形式で「faststart」フラグが設定されていることだ。特に解像度の要件は重要で、動画を単に800x800に拡大縮小するだけでは縦横比が崩れてしまうため、まず動画の中央から正方形の部分を切り抜き(クロップ)、その後で800x800に拡大縮小するという手順が必要となる。
この動画変換を実現するために使用されるのが、「ffmpeg」という強力なコマンドラインツールだ。ffmpegは、動画や音声ファイルの変換、編集、ストリーミングなど、多岐にわたる処理を行えるオープンソースのソフトウェアである。記事で示された具体的なffmpegコマンドは、以下のような構成になっている。
ffmpeg -i input.mov -vf "crop=ih:ih:(iw-ih)/2:0,scale=800:800,format=yuv420p" -c:v libx264 -preset slow -crf 23 -t 10 -an -movflags +faststart output.mp4
このコマンドを分解して見ていこう。まず-i input.movは、変換したい入力ファイルがinput.movであることを指定する。次に-vfオプションは「ビデオフィルタグラフ」を設定するためのもので、複数の動画処理を順に適用できる。ここで指定されている"crop=ih:ih:(iw-ih)/2:0,scale=800:800,format=yuv420p"は、まず動画の入力高さを基準に中央から正方形を切り抜き、次にその正方形を800x800ピクセルに拡大縮小し、最後にピクセルデータを表現する形式をyuv420pに強制するという一連の処理を行っている。yuv420pは、多くの動画プレイヤーやサービスで互換性が高く、この指定がないとffmpegが別の形式を選んでしまい、Telegramに拒否される可能性があるため重要だ。
-c:v libx264は、出力するビデオのコーデックとしてH.264(libx264という実装)を指定する。-preset slowはエンコード速度と品質のバランスを調整するもので、slowを選ぶことで品質を維持しつつ適度な時間で処理を行う。-crf 23は品質設定で、値が小さいほど高品質になるがファイルサイズも大きくなる。-t 10は、出力動画の長さを最大10秒に制限する。-anは「no audio」を意味し、音声トラックを完全に削除する。Telegramの仕様では音声が許可されていないため必須だ。そして-movflags +faststartは、MP4ファイルの重要なメタデータ(moov atomと呼ばれる)をファイルの先頭に配置するよう指示する。これにより、ファイル全体をダウンロードしなくても動画の再生を開始できるようになり、Telegramがファイルを迅速に処理するために必要となる。最後にoutput.mp4は、変換された動画が出力されるファイル名である。
iPhoneで撮影された動画には、もう一つ注意すべき点がある。それは、動画の回転情報がメタデータとして含まれていることだ。ffmpegは通常、このメタデータに従って動画を自動的に回転させるが、HEVCとH.264の間で処理方法が異なり、意図しない回転が適用されてしまうことがある。この問題を解決するためには、まずffprobeというツールを使って動画の回転メタデータを事前に取得し、その情報に基づいてffmpegのフィルタグラフを明示的に構築する必要がある。例えば、90度回転が必要な場合はtranspose=1というフィルタをクロップ処理の前に追加するといった具合だ。そして、ffmpegには-noautorotateオプションを渡して、自動回転を無効にすることで、一貫した出力を得られる。これはPythonのsubprocessモジュールを使ってffprobeを実行し、JSON形式で結果を受け取り、回転情報を解析して適切なフィルタ文字列を生成する形で実現できる。
これらの複雑な手順をユーザーが意識することなく利用できるように、記事の著者はTelegramボットである「@LiveAvaBot」を構築した。このボットは、aiogram 3というPythonのフレームワークを使って開発されている。ユーザーは、どんな動画やGIFファイルでもボットに送信するだけで、Telegramのビデオアバターに適した形式に自動変換されたファイルを受け取ることができる。ボットは受信したファイルを一時ディレクトリにダウンロードし、上記のffmpegコマンドを実行して変換、そして変換後のファイルサイズが2MBを超えていないかを確認し、問題なければユーザーに変換済みの動画を返信する。もし変換に失敗したり、ファイルサイズが大きすぎたりした場合は、その旨をユーザーに伝える仕組みだ。
ボットの開発中には、いくつかの「エッジケース」にも遭遇している。例えば、透明な背景を持つGIFファイルは、動画形式に変換される際に透明部分が黒く塗りつぶされることがある。また、非常に短い動画クリップはアバターとしては動きが乏しいため、2秒未満のクリップには警告を出すようにした。さらに、動きの激しい高解像度動画を変換すると、品質を落とさない設定ではファイルサイズが2MBを超過することがあるため、その場合は品質設定(CRF値)を調整して再エンコードするなどの工夫も施されている。ユーザーエクスペリエンス向上のためには、ffmpegでの処理中は「Uploading video...」のようなメッセージを表示するよう、send_chat_actionを利用してボットが応答していることを示す配慮も重要だ。
この事例は、プログラミングと既存のツール(ffmpeg)を組み合わせることで、ユーザーが直面する具体的な問題を効果的に解決できることを示している。将来的には、Telegramアプリを開かずにブラウザで手軽に変換できるウェブ版の提供も検討されているようだ。このようなプロジェクトを通じて、システムエンジニアを目指す皆さんは、問題解決のための思考力、ツールの活用能力、そしてユーザー視点に立った開発の重要性を学ぶことができるだろう。