投稿形式はブラウザは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日より。
Steps to check:
1) if it has orientation set to rotate the image, we will transcode
2) if it is over 4096 in any dimension, we will transcode
3) if it is over 5 MBs, we will transcode
4) if the compression is very inefficient (worse than 1 pixel per byte), we will transcode— Nolan O'Brien (@NolanOBrien) December 11, 2019
フォーマットは投稿フォーマットによって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
Twitterの画像表示が変わったらしいので、1〜4枚それぞれに適している画像比率や特徴をまとめてみました。作品の「みせ方」に正解はないですが、ご自身の作品や写真の魅力を引き立ててくれる枚数や比率がきっとあると思います。投稿時に参考になれば嬉しいです。 pic.twitter.com/VUVoZgv61N
— TAKUYA YONEZAWA | 画家 (@takuyanokaiga) January 11, 2023
アニメ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になる。
既にTwitterにアップロードされた既存のAPNGファイルは削除されません。また、皆さまと、皆さまのTwitter体験をよりよくする同様の機能をご提供することを検討いたします。
— Twitter Japan (@TwitterJP) December 24, 2019
Twitterが動画ファイル形式「APNG」のサポートを停止、てんかん患者の発作を引き起こすため – GIGAZINE https://t.co/D7DiF5PZpE
— ロべルト@FFmpeg本出ました (@nico_lab) December 24, 2019
昔の仕様
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のどれかに変える。
配置は2階の角から2番目のようだ。緑で塗ってあるところ #技術書典pic.twitter.com/jmjPQQasyo
— ロべルト@9/22 技術書典7し21D (@nico_lab) 2019年8月21日
- https://pbs.twimg.com/media/ECf6Y-ZVUAAnxmq?format=jpg&name=large
- https://pbs.twimg.com/media/ECf6Y-ZVUAAnxmq?format=png&name=large
- https://pbs.twimg.com/media/ECf6Y-ZVUAAnxmq?format=webp&name=large
フォーマットは投稿フォーマットによってJPG(YUVJ420)、PNG(RGB24)、WebP(YUV420)が作られる。投稿画像はPNGで5MB以下ならそのままPNGで、超えるならJPG(YUVJ444)で投稿するのが一番高画質になる。
画像については以前のPNG8の心配が不要になり、解像度も長辺2048ピクセル超えたら2048ピクセルに納まるようにアスペクト比揃えてリサイズされるのでファイルサイズが超えない限り特に気にしない。アニメGIFについてはGIFで投稿してもそのまま表示しているわけはなく動画に変換している。PNG、WebPのアニメーション、APNG、AWebPも調べたが、APNGは1フレームの画像に、AWebPは投稿できない。
[…] Twitter に投稿できる動画と画像の仕様について | ニコラボ […]