[小ネタ] 簡単に再生できないQuickTime動画素材をProRes(とGIF)に変換して再生できるようにする(macOS Catalina)

動画編集用のアニメーション素材を探していると、Animationコーデック(RLE)でエンコードされた動画に出会いました。拡張子MOVのQuickTimeムービーなのにmacOS Catalinaで再生できません。変換もされません。ついカッとなってffmpegでProRes 4444に変換しました。そのときのメモです。
2020.10.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

動画編集で使えるちょっとしたエフェクトやアニメーション素材は、ググるとフリーで使えるものが意外と見つかったりします(感謝しかありません)。
例えば今回、こんな素材を配っている素晴らしいサイトを見つけました。ライセンス的にも、そのものの再配布でなければ商用利用も可とのことでしたので、ダウンロードさせてもらうことにしました。

ところがダウンロードしてみると、中身は QuickTime ムービーなのに再生が出来ません。

ファイルが壊れてる? と判断するのは早計です。
ファイルの詳細情報を見る(cmd + I)とすると、この動画のコーデックは「Animation」であることが分かります。

ffprobeコマンドで表示させてみるとこんな感じです。

% ffprobe "6 line pop 4.mov"
ffprobe version 4.3.1 Copyright (c) 2007-2020 the FFmpeg developers
 :
(略)
 :
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '6 line pop 4.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    creation_time   : 2019-09-04T00:03:54.000000Z
  Duration: 00:00:01.00, start: 0.000000, bitrate: 10293 kb/s
    Stream #0:0(eng): Video: qtrle (rle  / 0x20656C72), argb(progressive), 274x303, 1904 kb/s, SAR 1:1 DAR 274:303, 24 fps, 24 tbr, 24 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2019-09-04T00:03:54.000000Z
      handler_name    : Apple Video Media Handler
      encoder         : Animation
      timecode        : 00:00:00:00
    Stream #0:1(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
    Metadata:
      creation_time   : 2019-09-04T00:03:54.000000Z
      handler_name    : Time Code Media Handler
      timecode        : 00:00:00:00
Unsupported codec with id 0 for input stream 1
%

実はこの QuickTime Animation(QuickTime RLE)コーデックは、既に Apple がサポートを終了した古いものです。Apple では「レガシーのメディアファイル」と呼んでいます。

このリンク先にあるように、1 世代前の macOS(Mojave)では再生前に自動的に変換されて再生されていましたが、現世代(Catalina)ではもうそれすらやってくれないようです。

おそらく動画編集ソフトのなかには、独自にサポートを続けているものもあると思うのですが、OS のファインダーから見られないのは個人的に不便なので、現行コーデックの Apple ProRes に変換することにしました。

ちなみにひとくちに ProRes と言っても何種類もあります。

今回はその用途上、透過背景(アルファチャネル)をサポートし、かつ画質劣化を押さえられた、かつ軽めのコーデックが望まれますので、ProRes 4444 にしました。
というか、ffmpeg のオプション指定で ProRes を選択したら、勝手に 4444 が選ばれたのでそのままにしています。

ffmpeg の導入

もしまだ導入していないという方がいましたら、Homebrew でさくっと導入してしまいましょう。

% brew install ffmpeg

変換

難しいことはないです。入力ファイルに元の動画を指定し、出力コーデックに ProRes を指定するだけです。
ffmpeg が ProRes に対応しているか、ヘルプで確認してみましょう。

% ffmpeg -codecs
 :
(略)
 :
 DEVI.S ppm                  PPM (Portable PixelMap) image
 DEVIL. prores               Apple ProRes (iCodec Pro) (encoders: prores prores_aw prores_ks )
 D.VIL. prosumer             Brooktree ProSumer Video
 :
 D.V.L. qpeg                 Q-team QPEG
 DEV..S qtrle                QuickTime Animation (RLE) video
 DEVI.S r10k                 AJA Kona 10-bit RGB Codec
 :

D (decode)」「E(encode)」両方にちゃんと対応していることが分かりました。proresと指定すれば良いようですね。ちなみにffprobeが効いたので当たり前ですが、QuickTime Animation もしっかり対応していることが分かります。

というわけで、コマンドラインはこうなります。

% ffmpeg -i (元ファイル名) -vcodec prores (出力ファイル名)

試しにやってみると、こんな感じになりました。

% cd ~/Downloads/PB-free-accent-graphics/Accent Graphics/
% ffmpeg -i \
    '6 line pop 4.mov' \
    -vcodec prores \
    '6 line pop 4_prores4444.mov'
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '6 line pop 4.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    creation_time   : 2019-09-04T00:03:54.000000Z
  Duration: 00:00:01.00, start: 0.000000, bitrate: 10293 kb/s
    Stream #0:0(eng): Video: qtrle (rle  / 0x20656C72), argb(progressive), 274x303, 1904 kb/s, SAR 1:1 DAR 274:303, 24 fps, 24 tbr, 24 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2019-09-04T00:03:54.000000Z
      handler_name    : Apple Video Media Handler
      encoder         : Animation
      timecode        : 00:00:00:00
    Stream #0:1(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
    Metadata:
      creation_time   : 2019-09-04T00:03:54.000000Z
      handler_name    : Time Code Media Handler
      timecode        : 00:00:00:00
Stream mapping:
  Stream #0:0 -> #0:0 (qtrle (native) -> prores (native))
Press [q] to stop, [?] for help
[prores @ 0x7fc20201c800] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc202023000] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc202029800] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc202030000] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc202036800] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc20203d000] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc202043800] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc20204a000] encoding with ProRes 4444+ (ap4h) profile
[prores @ 0x7fc22281f800] encoding with ProRes 4444+ (ap4h) profile
Output #0, mov, to '6 line pop 4_prores4444.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    encoder         : Lavf58.45.100
    Stream #0:0(eng): Video: prores (4444) (ap4h / 0x68347061), yuva444p10le, 274x303 [SAR 1:1 DAR 274:303], q=2-31, 200 kb/s, 0.04 fps, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 2019-09-04T00:03:54.000000Z
      handler_name    : Apple Video Media Handler
      timecode        : 00:00:00:00
      encoder         : Lavc58.91.100 prores
frame=   24 fps=0.0 q=-0.0 Lsize=     283kB time=00:00:00.95 bitrate=2418.5kbits/s speed=59.2x
video:282kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.513086%

この程度のサイズならほぼ一瞬ですね。

無事 QuickTime プレイヤーで再生可能なファイルに変換されました。
大量にファイルがある場合は、for で回して一括変換するといいですね。zsh の場合はこんな感じで ok です(setopt sh_word_splitをしていない前提です)。ファイル名に半角スペースが含まれているので、BASH のひとは工夫をおねがいします。

% for i in *.mov
do echo "======== $i ========"
  o=`echo "$i" | sed -e 's/.mov/_prores4444.mov/'`
  ffmpeg -i "$i" -vcodec prores "$o"
done

ちなみに

アニメーション GIF にしたかったら、こうすれば OK です。

% ffmpeg -i \
    '6 line pop 4.mov' \
    -vcodec gif \
    '6 line pop 4.gif'

よくよく考えてみると、こっちのほうが使い勝手良さそうですね。

変換でエラーになった場合

こうやって調子に乗りつつ変換していると、まれに変換できないものにぶつかります。
例えば今回、いくつかのファイルでこんなエラーが出ました。

 :
[prores @ 0x7f88f2813000] frame width needs to be multiple of 2
[prores @ 0x7f88f2810200] ff_frame_thread_encoder_init failed
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!

これはハイライトした行にあるように、「動画フレームの横幅は 2 の倍数でなければならない」というエラーです。おそらく Apple ProRes の制限なんでしょう。
みてみると確かに、この動画(Pop with delay 29.mov)の画像サイズは 271x271 と、横幅は奇数になっています。

今回の場合はエンコード側(ff_frame_thread_encoder_init)、つまり出力時に発生しているエラーなので解決策は簡単です。ffmpeg の-sオプションでサイズを指定し、その際に横幅を偶数になるようにすればよいです。
深いことを考えずにさくっと指定しましょう。

% ffmpeg -i \
    'Pop with delay 29.mov' \
    -s 272x272 \
    -vcodec prores \
    'Pop with delay 29_prores4444.mov'

まとめ

動画編集をやりだすと、ちょっとしたところで不可解なつまづき方をすることがありますが、大抵は既知のものです。
そういったものは先人の知見知啓を頼りにしつつ、ほとんどは力業で切り抜けることが可能ですので頑張ってください。

みなさまよい動画編集ライフを!