逃避ケア MV 制作メモ【データモッシュ編】

前編 逃避ケア MV 制作メモ【制作環境全般編】 の続きで、どうやってデータモッシュを作ったかのメモです。

どんなところで使ったか

シーンの切り替え

ランダムでノイズが乗り、複雑な色が出るところ

環境・ツール

基本的にはコードを書いていきます。

ワークフロー

Mac だと AEで avi が扱えないので、別のファイル形式を経由しています。

  1. 元となるシーンをAEで画像連番書き出し
  2. ffmpegを使って連番画像からaviを作成 ffmpeg -f image2 -i main_%05d.jpg -y -an -q:v 10 -r 30 temp.avi
  3. AviGlitch を使ってデータモッシュ
  4. ffmpegを使ってデータモッシュ後のaviからmp4に変換
  5. mp4をAEで読み込み、素材として使う

スクリプト

上記ワークフローの一連の流れを実行するもの

mosh.sh

#!/bin/bash
mkdir output
cd render

# q:v ... 固定量子化係数 (Constant Quantizer) でエンコード 小さいほど高画質。大きいほど低画質でデータモッシュ感がある
rename -N 00001 -X -e '$_ = "main_$N"' *.jpg
ffmpeg -f image2 -i main_%05d.jpg -y -an -q:v 10 -r 30 temp.avi

datamosh temp.avi -o ../output/output.avi
cd ../output
now=`date "+%Y%m%d-%H%M%S"`

ffmpeg -i output.avi -y -f mp4 -vcodec libx264 -b:v 4000k -an -r 30 output-${now}.mp4

AviGlitch をライブラリとして利用

AviGlitch は datamosh コマンドで実行するだけでなく、ライブラリとして利用することで特定の法則でデータを壊すことができます。AviGlitch 作者の ucnv さんが gist に上げているもの(Search · require ‘aviglitch’)をいくつか試し、映像的に面白いものを取り入れました。

repeat-random-p-frame.rb

require 'aviglitch'
require 'date'
  
a = AviGlitch.open 'render/temp.avi'       # Rewrite this line for your file.
d = []
a.frames.each_with_index do |f, i|
  d.push(i) if f.is_deltaframe?     # Collecting non-keyframes indices.
end
q = a.frames[0, 5]                  # Keep first key frame.
100.times do |i|
  printf "\r>> %4d/100", i
  x = a.frames[d[rand(d.size)], 1]  # Select a certain non-keyframe.
  q.concat(x * rand(50))            # Repeat the frame n times and concatenate with q.
end
o = AviGlitch.open q                # New AviGlitch instance using the frames.
o.output 'output/repeat-random-p-frame-' + DateTime.now.strftime('%Y%m%d-%H%M%S') + '.avi'

これを使って ランダムでノイズが乗り、複雑な色が出るところ を作りました。

動画の尺が伸びるので、AEでタイムリマップして使うと良かったです。

avi2mp4

./avi2mp4.sh (aviファイル名) で実行

#!/bin/bash
ffmpeg -i $1 -f mp4 -vcodec libx264 -b:v 4000k -an -r 30 ${1%.*}.mp4

おわりに

ということで映像の表現にデータモッシュを取り入れた話でした。 元の素材や変換方法によってぜんぜん違うものができるので、試行錯誤しやすい環境づくりが大事だと思いました。