[小ネタ] 簡単に再生できないQuickTime動画素材をProRes(とGIF)に変換して再生できるようにする(macOS Catalina)
小ネタです。
動画編集で使えるちょっとしたエフェクトやアニメーション素材は、ググるとフリーで使えるものが意外と見つかったりします(感謝しかありません)。
例えば今回、こんな素材を配っている素晴らしいサイトを見つけました。ライセンス的にも、そのものの再配布でなければ商用利用も可とのことでしたので、ダウンロードさせてもらうことにしました。
ところがダウンロードしてみると、中身は 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'
まとめ
動画編集をやりだすと、ちょっとしたところで不可解なつまづき方をすることがありますが、大抵は既知のものです。
そういったものは先人の知見知啓を頼りにしつつ、ほとんどは力業で切り抜けることが可能ですので頑張ってください。
みなさまよい動画編集ライフを!