【ITニュース解説】Why iPhone Videos Silently Fail as Telegram Avatars
2026年10月05日に「Dev.to」が公開したITニュース「Why iPhone Videos Silently Fail as Telegram Avatars」について初心者にもわかりやすく解説しています。
ITニュース概要
iPhoneで撮影したHEVC動画は、Telegramのビデオアバターとして設定しようとすると、エラーなしに失敗する。TelegramはH.264など特定の動画コーデックや、800x800・1〜10秒・2MB未満・音声なしといった厳格な仕様を求めているためだ。FFmpegを使えば、HEVC動画をTelegramが受け付ける形式に変換できる。
ITニュース解説
iPhoneで撮影した動画をTelegramのプロフィール画像(ビデオアバター)に設定しようとした際、特にエラーも表示されないのに古い写真のまま変わらないという現象が報告されている。この一見不可解な現象には、技術的な理由が存在する。
この問題の主な原因は、iPhoneが採用している動画の圧縮方式、すなわち「コーデック」にある。iOS 11以降、iPhoneのカメラで撮影される動画は「HEVC(H.265)」という新しいコーデックがデフォルトで使用されるようになった。HEVCはH.264(AVC)よりも高い圧縮率で同等の画質を保てるため、ファイルサイズを小さくできるメリットがある。しかし、Telegramのビデオアバター処理システムは、このHEVCコーデックに対応しておらず、受け付けない。動画ファイルはサーバーにアップロードされるものの、サーバー側でその内容がHEVCであると判断されると、エラーメッセージを出すことなく黙って破棄されてしまうのである。そのため、ユーザーには何も変化がないように見える。
Telegramがビデオアバターとして受け付ける動画ファイルには、厳格な条件が設定されている。具体的な条件は以下の通りである。まず、動画コーデックは「H.264(AVC)」である必要があり、その中でも「baseline」または「main」というプロファイルが推奨される。次に、ピクセルフォーマットは「yuv420p」でなければならない。「yuv420p10le」のような高ビット深度のフォーマットは受け付けられない。動画ファイルを格納する形式である「コンテナ」は「MP4」が必須で、さらに「faststart」というフラグが設定されている必要がある。これにより、サーバーは動画ファイルの先頭部分を読み込むだけで全体の構造を把握し、素早く妥当性を確認できる。解像度は「800x800ピクセル」の正方形が求められ、再生時間は「1秒から10秒」の間であること。そして、ファイルサイズは「2MB未満」という厳しい制限がある。特にこの2MBという制限は非常に厳しく、少しでも長かったり画質が高すぎたりすると、すぐに制限を超えてしまうことがある。最後に、動画には「音声」が完全に含まれていてはならない。単にミュートするだけでなく、音声ストリームそのものが存在しない状態にする必要がある。これらの条件のいずれか一つでも満たしていない場合、ビデオアバターの設定は黙って失敗に終わってしまうのだ。
これらの厳格な条件を満たすために、「FFmpeg」という強力なオープンソースツールが活用される。FFmpegは動画や音声の変換、加工、ストリーミングなど、多岐にわたる処理を行うことができる。この問題を解決するための一連の処理は、大きく二つのステップに分けられる。最初のステップは「切り抜き範囲の検出」である。特にスマートフォンで撮影された縦長の動画は、そのまま正方形に切り抜くと上下に黒い帯(レターボックス)が入ってしまうことがある。これを避けるため、動画の主要なコンテンツがどこに位置しているかを自動で判断し、最適な正方形の切り抜き範囲(クロップボックス)を特定する。FFmpegの「cropdetect」フィルターを使用することで、動画のどの部分を切り取ればコンテンツが中央に配置され、かつ正方形になるかを検出できる。
検出された切り抜き範囲を使って、次のステップで実際の動画変換を行う。これは、検出した範囲で動画をクロップし、さらに「800x800」の解像度に縮小(スケール)する処理である。このとき、スケーリングには「lanczos」というアルゴリズムが推奨される。これは、特に顔のような複雑なディテールを含む映像を縮小する際に、画質の劣化を最小限に抑え、ぼやけを少なくする効果があるためだ。同時に、動画のコーデックをTelegramが求める「H.264」に変換し、ピクセルフォーマットも「yuv420p」に設定する。さらに重要なのが、ファイルサイズを2MB未満に抑えるための圧縮設定である。「-crf 28」という設定値は、画質とファイルサイズのバランスを取るための「定数品質」モードで、多くの動画で良好な結果を生み出す。この値を大きくすると画質は下がるがファイルサイズは小さくなり、小さくすると画質は上がるがファイルサイズは大きくなる。8秒から10秒程度の800x800ピクセルの動画であれば、CRF値28でほとんどの場合2MB以内に収まる。もし変換後のファイルがまだ2MBを超えている場合は、CRF値を30や32に上げて再エンコードするか、動画の長さを短くするなどの調整が必要となる。
さらに、Telegramの要求する「音声ストリームの完全削除」は「-an」というオプションで行う。これにより、動画から音声トラックが完全に除去される。そして、「-movflags +faststart」オプションを付与することで、動画ファイルのメタデータ(moov atom)をファイルの先頭に配置する。これは、Telegramのサーバーがファイル全体をダウンロードしなくても、動画の情報を素早く読み取り、妥当性チェックを行えるようにするための工夫である。これらのFFmpegコマンドを組み合わせることで、iPhoneで撮影された動画をTelegramのビデオアバターの厳しい要件に合致させることができる。
このような複雑な変換プロセスをユーザーが手動で行うのは手間がかかるため、これを自動化する「Telegramボット」が開発された。Python言語と「Aiogram」というライブラリを使用し、ユーザーがボットに動画ファイルを送信すると、ボットがその動画を自動的にダウンロードし、前述のFFmpegコマンドを使ってTelegramの要件に合うように変換する。変換が成功すれば、ボットは変換された動画ファイルをユーザーに返信し、ユーザーはそのファイルをTelegramのビデオアバターとして設定できるようになる。このボットは、iPhoneのHEVC動画だけでなく、Androidの縦長動画、GIFアニメーション、さらには古いアナログ映像など、さまざまな形式の動画に対応できるよう設計されている。
開発の過程では、いくつかの予期せぬ課題にも直面した。例えば、iPhoneで撮影された縦長動画は、単に画素が縦に並んでいるのではなく、「回転フラグ」というメタデータによって縦長として表示される場合がある。FFmpegのバージョンによってはこのフラグを自動で解釈できないことがあり、その場合は明示的に回転処理を追加する必要がある。また、ユーザーがプロ用カメラで撮影した4K ProResのような巨大な動画ファイルを送ってくることもあり、これらのファイルは数百MBにも達するため、ボットがダウンロードを開始する前にファイルサイズをチェックし、一定のサイズ(例えば50MB)を超えるものはダウンロードせずに拒否する処理も重要になる。GIFアニメーションはTelegram内でループ再生される特性があるため、変換後のMP4ファイルでもこのループ挙動を維持できるよう、音声トラックを付けないようにする。さらに、Telegramのスタンプとして使われるアニメーションWebP形式のファイルは、フレームレートを明示的に変換しないと、静止画として扱われてしまうという注意点もある。
これらの課題解決の取り組みは、単に問題を解決するだけでなく、動画ファイル形式の複雑さ、サーバーとクライアント間の連携、そして多様なユーザー入力に対するシステムの堅牢性を確保するための具体的なアプローチを示している。将来的には、動画内の顔を認識し、その顔が常に中央に位置するように切り抜きを行う、より高度な機能も検討されている。このような取り組みは、システムエンジニアとして、目に見えない問題を特定し、具体的な技術的解決策を適用し、ユーザー体験を向上させることの重要性を教えてくれる。