【ffmpeg】Twitterにキレイな動画をアップロードする方法【gif、mp4の2つ紹介】

どーも、ぐるたか@guru_takaです。

私はよく作ったモノをPCを上で収録。そして、mp4 or gifファイルでTwitterにアップロードして公開しています。

ただですね、動画の画質の劣化にめちゃくちゃ悩まされていました。。色々試していく中で、どうあがいても絶望的画質で限界突破。恐る恐る、キレイな動画をupしてるかねたさん@kanetaaaaaにお聞きしたところ、無事に解決できました🎉

ここでは、Twitterに動画をアップロードする方法(mp4, gif)をご紹介します!

MEMO
ここでは、macOS Mojaveでの説明になりますが、その他のOSでも収録方法以外は変わらないはずです!

※2019/8/4 追記
コマンドラインにて一発でmov→mp4が生成される関数の作り方と使い方を載せました!

Before, Afterの比較動画

まずはBefore, Afterをご覧ください。

まずはmov→mp4に変換した動画の比較です。Beforeはいつものようにエンコードした動画、Afterはうまくいった動画になります。

Before


After


画質の差は歴然!!!最高 オブ 最高。さっそくやり方を紹介します!

簡単な流れ

STEP.1
ffmpegのインストール
STEP.2
ffmpegコマンドで連番画像を生成
STEP.3
ffmpegコマンドで連番画像から動画生成

結論のソースはこちら!

$ ffmpeg -i input.mov -vcodec png image_%03d.png
$ ffmpeg -r 30 -i image_%03d.png -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4
2019/8/4 追記
以下のコマンドを.bashrcや.zshrcなどに記載すると、関数として使えるので便利です!ffmpegがインストールされていること前提になります。

# function
gene_mp4(){
  ffmpeg -i $1 -vcodec png image_%03d.png
  ffmpeg -r 30 -i image_%03d.png -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -vcodec libx264 -pix_fmt yuv420p -r 60 $2
  rm -f image_*.png
}

記入した後に、source ~/.bashrcなどで再読み込みしましょう。

使い方は簡単!動画があるディレクトリ配下にて、コマンドラインでgene_mp4 動画のファイル名 出力後のファイル名と打ち込むだけでOKです。
例:gene_mp4 input.mov out.mp4

STEP1:ffmpegのインストール

まずはffmpegをインストールしましょう。ffmpegとは動画の拡張子を変換したり、動画の長さをリサイズしたりできる便利ツールです。

homebrewを使えば、一瞬でインストールできます!

brew install ffmpeg

windowsの方は、こちらの記事を確認してみてください!
参考 【windows】FFmpegをインストールする手順新卒エンジニアの開発日記

STEP2:ffmpegコマンドで連番画像を生成

私の観測範囲になりますが、色々ぐぐってみると、殆どが以下のコマンドでmovなどのファイル→mp4に変換します。

ffmpeg -i input.mov -pix_fmt yuv420p output.mp4
参考 TwitterにMP4動画をアップロードするにはyuv420pを使う必要がある(らしい)kivantium活動日記

ただ、このやり方だとbeforeのように、Twitterでアップロードすると劣化します

afterのようなキレイな動画にするには、一度連番画像を取得して、その後に動画生成する方法を採用します。理由は定かではありません。笑

呪文だと思い、以下のコマンドを叩きましょう(強引)

ffmpeg -i input.mov -vcodec png image_%03d.png

すると、以下のように連番画像が生成されます!

STEP3:ffmpegコマンドで連番画像から動画生成

次に、連番画像を使って動画生成します。コマンドはこちら!

ffmpeg -r 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4

コマンドの詳細はこちらをご確認ください!
参考 ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~Qiita

追記 2019/7/5
width not divisible by 2とエラーがでた時は、以下のオプションを追加してください!

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
参考 width not divisible by 2 エラーが出る場合は?

おまけ:動画→GIfにキレイに変換する方法

動画をGIFに変換する方法を色々試しましたが、以下のコマンドを叩くと、最もキレイにアップロードできました!

ffmpeg -i input.mov -vf "palettegen" -y palette.png
ffmpeg -i input.mov -i palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y output.gif

fps=12, width=900, length=5s, size=1.3MB
引用:ffmpegで動画を綺麗なgifに変換するコツ

最初のコマンドがポイント!パレット画像を一度取得しましょう。これをしないと、薄汚いGIFが生成されます。

ただ、直にGIFで収録した動画と、mov→gif動画、他にも連番画像→gif動画を比較したところ、どれも変わらなかったです笑

直のGIF

mov→gif

なのでgifを上げるなら、手間暇をかけないで最初からGIFで収録するのが1番です!もし動画ファイル→gifにしたい時は、上記の方法を参考にしてください!

最後に

長年の悩みから解放された感じがして、スッキリしました笑 ちなみに、60fpsの動画をあげるときは、TweetDeckでやると、キレイとのことです!

より楽しいTwitterライフが、おくれるのではないでしょうか!

最後に、改めて連番画像→動画作成の手法を親切に教えてくださったかねたさん@kanetaaaaaに感謝です!

コメントを残す