投稿形式はブラウザはMP4(H264、AAC)、モバイルアプリはMP4とMOVの動画形式をサポートしているが、今回はブラウザ(Chrome)からの動画と画像を対象とする。

公式の説明を基にまとめる。ただし画像については仕様が変わりやすい。

動画の仕様

動画の推奨設定

  • 映像のコーデックはH.264のHighプロファイル
  • フレームレートは30fps、または60fps
  • 解像度は1280×720、720×1280、720×720のどれか
  • 映像の最小ビットレート(最大ではない)は5000kbps
  • 音声の最小ビットレート(最大ではない)は128kbps
  • 音声のコーデックはAAC-LC
  • アスペクト比は16:9、または1:1

動画の発展的な設定

  • フレームレートは60fps以下
  • 解像度は32×32から1280x1024の間
  • ファイルサイズは512MBを超えない
  • 時間は0.5秒から140秒の間
  • アスペクト比は1:3から3:1の間
  • ピクセルアスペクト比は必ず1:1
  • YUV420だけサポート
  • AAC-LCだけ、HE-AAC、HEv2-AACはサポートしない
  • 音声チャンネルはモノラルかステレオだけ、5.1チャンネルやそれ以上は不可
  • オープンGOPであること
  • プログレッシブ方式だけでインターレース方式は不可

投稿する前に確認することは時間。時間が超えていたら-ss, -t , -toで140秒以内に納める。解像度が規定を超えたら、例えば1920×1080の60fpsは投稿エラーではなくリサイズされて表示されるのでこだわりがなければそのまま投稿する。

開始5秒目から、140秒間コーデックコピー出力する。
ffmpeg -ss 5 -i input -t 140 -c copy output.mp4

アスペクト比を維持しながら長辺1280ピクセルより大きいとき長辺1280ピクセルにリサイズし小さければそのまま。ピクセルフォーマットがYUV420でなかったらそれに変換する。
ffmpeg -i input.mp4 -vf 'scale=if(gte(iw\,ih)\,min(1280\,iw)\,-2):if(lt(iw\,ih)\,min(1280\,ih)\,-2)' -c:v libx264 -x264-params crf=16 -pix_fmt yuv420p -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -c:a copy output.mp4

-color_primariesなどの設定について。
色の情報の扱いについて

画像の仕様

画像全般

  • サポートフォーマットはJPG、PNG、GIF、WebP
  • ファイルサイズは5MB以下
  • 回転情報のメタデータがないこと。メタデータは削除される
  • 長辺4096ピクセル以下

2019年12月12日より。

フォーマットは投稿フォーマットによってJPG(YUVJ420、YUVJ422、YUVJ444)、PNG(RGB8、RGB24、RGB32)、WebP(YUV420、YUVA420)が作られる。投稿画像はPNGで5MB以下ならそのままPNGで、超えるならJPG(YUVJ444)で投稿する。PNGで5MBを超えるならロスレスWebPで投稿することもできる。

PNG(RGB32)で投稿するとPNGのピクセルフォーマットは長辺900ピクセル以下ならRGB32、長辺900ピクセルより大きければRGB24、つまり透過情報が消える。透過つきPNG(RGB8)で投稿すると長辺4096ピクセル以下なら透過つきRGB8に、長辺4096ピクセルを超えると透過情報の消えたRGB24になる。透過つきPNG(RGB8、RGB32)で投稿すると長辺4096ピクセル以下ならWebPはYUVA420になり透過情報を保持する。JPGはYUVJ420になる。

注意する点はオリジナルのピクセルフォーマットから変換しないことと、回転情報のメタデータがあると意図した向きに表示されない可能性(サンプル画像がないので未確認)があるのでフィルタでメタデータ通りにあらかじめ回転させる。PNG、またはロスレスWebPで投稿するとJPG(YUVJ444)が作られないので無理にPNGやWebPで投稿する必要はない。PNG、WebPのアニメーション、APNG、AWebPの仕様に変化なし。APNG対応してたの記事更新してすぐに気づいたので訂正。

PNG の圧縮率の変更は-compression_levelを指定する。0に近いほど低圧縮大容量になる。
ffmpeg -i video -vframes 25 -plays 0 -compression_level 10 -f apng output.png

JPG の圧縮率の変更は-q:v、-qmax、-qminで同じ値を指定する。1に近いほど低圧縮大容量になる。
ffmpeg -i video -q:v 5 -qmax 5 -qmin 5 -vframes 1 output.jpg

WebP は ARGBの可逆圧縮(ロスレス)と、YUV420の不可逆圧縮の2つの投稿方法がある。可逆圧縮で投稿すると WebP のピクセルフォーマットはYUV420に、JPGのピクセルフォーマットはYUVJ420に変換される。-qualityは0から100までの100が低圧縮大容量になる。ロスレスの容量が一番小さくなるが投稿後の初期表示のフォーマットがJPGになるので扱いにくい。

ffmpeg -i img -lossless 1 output.webp
ffmpeg -i img -quality 75 output.webp

webpのエンコード設定:ffmpeg で アニメーションWebP(Animated WebP)を作る

メタデータの削除。
ffmpeg -i input.jpg -map_metadata -1 -c copy output.jpg

90度のメタデータが表示されている場合。
ffmpeg -i input.jpg -vf rotate=90*PI/180 -q:v 2 output.jpg

フォーマットの部分はjpg, png, webpが使える。origはJPG、PNGフォーマットに限る。

  • ?format=jpg&name=orig
  • ?format=jpg&name=large
  • ?format=jpg&name=medium
  • ?format=jpg&name=small
  • ?format=jpg&name=tiny
  • ?format=jpg&name=4096×4096
  • ?format=jpg&name=900×900
  • ?format=jpg&name=360×360
  • ?format=jpg&name=240×240

2つ以上の画像をアップロードする場合。

アニメGIF

  • 解像度は1280x1080以下
  • 総フレーム数は350以下
  • 解像度(横x縦)xフレーム数が300万以下
  • ファイルサイズは15MB以下

APNG(アニメーション停止)

  • 上の画像全般に加えて
  • PNG8(PAL8), PNG24(RGB24), PNG32(RGBA)は長辺680ピクセル以下
  • さらに複数貼るときに長辺361ピクセル以上で個別画像のページでしか動かない

IE, Edge はAPNGをサポートしていない。
Can I use… Support tables for HTML5, CSS3, etc

twitterカードがAPNGに対応してない。
sbさんはTwitterを使っています: 「APNGなら4枚貼れるということで再掲 今年反応の多かった落書きアニメ #2019年自分が選ぶ今年の4枚 https://t.co/MSWpDd4lOf」 / Twitter

出力拡張子をapngにして出力が終わってからpngにリネームするとTwitterに投稿できる。-vframesで出力フレーム数を調整する。-plays 0で無限ループにする。-f apngをつけると出力拡張をapngにしなくてもよい。
ffmpeg -i video -vframes 25 -plays 0 output.apng
ffmpeg -i video -vframes 25 -plays 0 -f apng output.png

パレットを使って減色処理をする。
ffmpeg -i video -filter_complex "split[a][b];[a]palettegen[pal];[b][pal]paletteuse" -vframes 25 -plays 0 output.apng

ところが2019年12月24日、PNGのアニメーションの停止が伝えられた。停止までに投稿されたAPNGは削除されずそのまま残る。停止以降に投稿したAPNGはアニメーションのないただの1フレームのPNGになる。

昔の仕様

2019年9月2日時点のGoogle Chrome76.0.3809.132(Official Build)(64 ビット)でアニメGIF以外で投稿し、長辺2048ピクセルまではリサイズされない。画像のリンクはブラウザから右クリックの「新しいタブから画像を開く」より、リンクの末尾に?format=jpg&name=900×900とあれば、jpgのところをpng、webpのどれかに変えるとそのフォーマットで表示される。900×900は長辺2048ピクセルを超えると表示され、ここもsmall、medium、largeのどれかに変える。

フォーマットは投稿フォーマットによってJPG(YUVJ420)、PNG(RGB24)、WebP(YUV420)が作られる。投稿画像はPNGで5MB以下ならそのままPNGで、超えるならJPG(YUVJ444)で投稿するのが一番高画質になる。

画像については以前のPNG8の心配が不要になり、解像度も長辺2048ピクセル超えたら2048ピクセルに納まるようにアスペクト比揃えてリサイズされるのでファイルサイズが超えない限り特に気にしない。アニメGIFについてはGIFで投稿してもそのまま表示しているわけはなく動画に変換している。PNG、WebPのアニメーション、APNG、AWebPも調べたが、APNGは1フレームの画像に、AWebPは投稿できない。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)