はじめに
ROGPhone5で撮影した縦長の4K動画をInstagramのリールとして投稿する前にAviUtlでの編集を試みたところ、ちょっとした紆余曲折があったので、ついでに調べてみたことも含め書いていきます。
前準備
4K動画の動画ファイルはファイルサイズが大きくなりがちなため、編集を行うにしても撮影したスマホにインストールされているアプリ(Instagramアプリに付属している編集機能を含む。)でできる範囲内で編集作業まで完結させたいところですが、AviUtlはWindowsのPC上でしか動作させることができません。
そこで、ROGPhone5からPC(HP Elite Dragonfly G2です。以下単に「PC」と書きます。)へのダウンロードが必要です。
サイズが大きいファイルのダウンロードは以下の手順で行っています。
- ROGPhone5にインストールしたTermux上でOpenSSHのsshdを起動します。
- PCからscpコマンドで手順1で起動したsshdにアクセスして4K動画をPCへダウンロードします。
AviUtlで編集
縦長動画も編集可能とするための設定
PCにインストールされているAviUtlはすでに横長の4K動画が編集可能な設定になっている(はず)なので、縦長の4K動画も編集可能とする設定を行います。
以下の手順で設定します。
- AvlUtlを起動します。
- メニューバーから「ファイル」→「環境設定」→「システムの設定」を選択します。
- 「システムの設定」ウィンドウが表示されますので、「最大画像サイズ」の「幅」及び「高さ」を両方とも「3840」に変更します(下図の赤枠)。
- 「システムの設定」ウィンドウの「OK」ボタンをクリックします。
- AviUtlを再起動します。
縦長動画の読み込み
前節の設定が完了したら、以下の手順でROGPhone5からダウンロードした縦長動画を読み込みます。
- AvlUtlを起動します。
- 「拡張編集」のタイムラインをマウスの右ボタンでクリックするとポップアップメニューが表示されますので、「新規プロジェクトの作成」をクリックします。
- 「新規プロジェクトの作成」ウィンドウが表示されますので、画像サイズを「2160×3840」に変更します。なお、フレームレートはお好みで設定します。
- 「新規プロジェクトの作成」ウィンドウの「OK」ボタンをクリックします。
- AviUtlのメインウィンドウの動画の表示領域が縦長になります。
- 縦長の4K動画を「拡張編集」のタイムラインへドラッグ&ドロップします。すると、ドラッグ&ドロップした動画が下図の通り反時計回りに90度回転してAviUtlに取り込まれます。
- 「拡張編集」の縦長動画のレイヤーのマウスの左ボタンでクリックします。
- 「動画ファイル[標準描画]」ウィンドウの「回転」ボタンの左側の数字をマウスの左ボタンでクリックし、「90」と入力します(下図の赤矢印)。
- メインウィンドウに表示されている動画が時計回りに90度回転して、動画の撮影時と同様の状態で表示されます。
- あとは適当に編集し、動画を出力します。
なお、編集した結果をInstagramに投稿したものが↓になります。
横長動画として扱われてしまう原因の考察
動画ファイルのプロパティの確認
実用的な説明についてはここまでとして、ここからは「なぜ縦長で撮影したはずの動画がAviUtlでは横長の動画として扱われてしまうのか。」について考察することにします。
スポンサーリンク
前節でAviUtlにドラッグ&ドロップした縦長動画のプロパティを見てみます。
すると…
フレーム幅が3840でフレーム高が2160であること、すなわち横長の動画であるという基本設定がされていることがわかります。
一方で、前節の最後に埋め込んだInstagramのリールとして投稿した動画(AviUtlで出力したものです。)のプロパティを見てみると…
フレーム幅が2160でフレーム高が3840となっていて、縦長の動画であるという基本設定がされていることがわかります。
変換のための設定についての調査
今までにInstagramのリールとして投稿した縦長動画はAviUtlでの編集は行わずに投稿(=フレーム幅が3840でフレーム高が2160の設定を維持したまま投稿)していましたが、動画の表示の向きが変わることはありませんでした。
よって、前節の縦長動画のファイルのうち、前者のファイルについては上記の基本設定の他に「縦長動画のふりをするための設定」が動画ファイル中のどこかにありそうです。
そこで、MP4Readerやffmpegに同梱されているffprobeなどのツールを使い、さらに「QuickTime File Format Specification」を参照しつつ、「縦長動画のふりをするための設定」を探ってみました。
探ってみた結果、メタデータが記録されているBox(moov)のmovieのtrakの先頭のtkhdの中に…
というデータがセットされていることがわかりました。
tkhdというBoxはTrack Header Atomsを表すので、「QuickTime File Format Specification」の「Track Header Atoms」の節を見てみると、(詳細な説明は省略しますが、)上図の赤線で示した部分に点の座標変換用の行列が格納されていることがわかります。この部分のフォーマットについては「QuickTime File Format Specification」の「Matrices」の節に記載があります。
基本的には1個の成分は32ビットの固定小数点数で表されている(小数点の位置は最初の6個の成分は先頭から16ビット目の直後で、後の3個は先頭から2ビット目の直後です。)ので、それに従って上図の赤線で示した部分を読み解くと…
A_0 &= \begin{pmatrix}
0 &-1 & 0\cr
1 & 0 & 0\cr
0 & 0 & 1
\end{pmatrix}\label{eq:matrixazero}
\end{align}
という変換行列が設定されていることがわかります。
最初に縦長動画を取り込んだ時に「反時計回りに90度回転」と書きましたが、画像座標系は横方向右向きを$x$軸の正の向きに取った場合に縦方向については下向きが$y$軸の正の向きという「左手系」の座標系となります。
「反時計回りに90度回転」というのは「左手系」の座標系においては「原点の周りに-90度回転すること」を示します(時計周りの回転=正の角度の回転になります)。
また、行列$A$を用いた変換後の座標の計算は、
「同次座標かつ横ベクトルで表された変換元の座標$\boldsymbol{x} = (x,y,1)$に対して、行列$A$を右からかける」
方法で計算します。
上記の方法で計算する場合には、原点の周りに$\theta$回転し、次に$x$軸方向に$t_x$、$y$軸方向に$t_y$だけ移動する変換を表すような$A$は
A &= \begin{pmatrix}
\cos\theta &\sin\theta & 0\cr
-\sin\theta & \cos\theta & 0\cr
t_x & t_y & 1\cr
\end{pmatrix}\label{eq:matrixa}
\end{align}
と表されます。
「回転移動は2×2行列の回転行列に座標を表す縦ベクトルを右からかけることによって計算するものだ。」と思っていると、(\ref{eq:matrixa})式を見た時にかなり不安になりますが、ここで $\boldsymbol{x}A$の転置行列$(\boldsymbol{x}A)^T$を考えてみます。
すると…
(\boldsymbol{x}A)^T &= A^T\boldsymbol{x}^T \cr
&= \begin{pmatrix}
\cos\theta &-\sin\theta & t_x\cr
\sin\theta & \cos\theta & t_y\cr
0 & 0 & 1\cr
\end{pmatrix}\begin{pmatrix}
x \cr
y \cr
1
\end{pmatrix}\label{eq:transpose}
\end{align}
という線形代数の教科書や一定の年齢層以上の人が高校で使っていた数学の教科書に記載されている式に形式的に変換できることがわかります。
少し話が脇道にそれましたが、(\ref{eq:matrixa})式の行列に$\theta = \displaystyle\frac{\pi}{2}, t_x = t_y = 0$を代入すると$A_0$に一致することがわかります。つまり、$A_0$は「縦長の動画を撮影したときの各ピクセルの座標を横長の動画を格納するための入れ物に格納する際の格納先の座標に変換するための変換行列である」と考えることができそうです。
なお、変換後の座標値のうち、$y$座標の値は0または負の値になりそうなので、$t_y$の値が0というのは厳密には正しくない気もしますが、その点は考えないことにします。
まとめ
今回AviUtlに縦長の4K動画用の設定を行ったことで、AviUtlにおける動画の編集作業が少し捗るのではないかと考えています。
しかしながら、「縦長動画はただの動画ファイルである」という主張なのか、Windowsのエクスプローラーにおいて、動画ファイルのアイコンの左右両端にパーフォレーション模様(下図の赤矢印)が表示されない仕様はいかがなものかとは思います。
この記事は以上です。