どーも、ぐるたか@guru_takaです。
私はよく作ったモノをPCを上で収録。そして、mp4 or gifファイルでTwitterにアップロードして公開しています。
ただですね、動画の画質の劣化にめちゃくちゃ悩まされていました。。色々試していく中で、どうあがいても絶望的画質で限界突破。恐る恐る、キレイな動画をupしてるかねたさん@kanetaaaaaにお聞きしたところ、無事に解決できました🎉
こんにちは!
特にこれといってしていませんが、30fpsで連番pngで出力したものをffmpegで繋げています。
コマンドはこんな感じです./ffmpeg.exe -r 30 -i ~/Downloads/img%03d.png -vcodec libx264 -pix_fmt yuv420p -r 30 out.mp4
— かねた (@kanetaaaaa) June 21, 2019
ここでは、Twitterに動画をアップロードする方法(mp4, gif)をご紹介します!
※2019/8/4 追記
コマンドラインにて一発でmov→mp4が生成される関数の作り方と使い方を載せました!
目次
Before, Afterの比較動画
まずはBefore, Afterをご覧ください。
まずはmov→mp4に変換した動画の比較です。Beforeはいつものようにエンコードした動画、Afterはうまくいった動画になります。
画質検証用、upテスト
mov→mp4 pic.twitter.com/eD3nrKmhQV
— ぐるたか (@guru_taka) June 21, 2019
— ぐるたか (@guru_taka) June 21, 2019
画質の差は歴然!!!最高 オブ 最高。さっそくやり方を紹介します!
簡単な流れ
結論のソースはこちら!
$ 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
# 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でキャプチャしたもの pic.twitter.com/6PpjnKYI6D
— ぐるたか (@guru_taka) June 21, 2019
mp4だけでなく、Gifでも美しい動画でうpするワザをみにつけたぞ!!! pic.twitter.com/O8s8lFOIU4
— ぐるたか (@guru_taka) June 21, 2019
なのでgifを上げるなら、手間暇をかけないで最初からGIFで収録するのが1番です!もし動画ファイル→gifにしたい時は、上記の方法を参考にしてください!
最後に
長年の悩みから解放された感じがして、スッキリしました笑 ちなみに、60fpsの動画をあげるときは、TweetDeckでやると、キレイとのことです!
60fps の動画をアップするときは、https://t.co/k1sHPR5JzP を使うと、何故か普通にやるより高画質でアップできるみたいです笑(最近知りました)‼️
— サトー (@sator_imaging) June 21, 2019
より楽しいTwitterライフが、おくれるのではないでしょうか!
最後に、改めて連番画像→動画作成の手法を親切に教えてくださったかねたさん@kanetaaaaaに感謝です!
コメントを残す