今回はMacで映像変換を行ってみます。Macだと映像フォーマット変換は標準で入っているQuickTimeを利用すればできます(簡単な編集もできます)。ただ、ディレクトリ(フォルダ)に入っている映像データを条件付きでまとめて変換するなどといった処理は標準では提供されていません。やはり、条件付きでまとめて何か処理する場合はコマンド入力の方が便利なことがあります。ということで、今回は一括して処理するのに便利なavconvertコマンドを扱います。

さて、今回もデスクトップのsampleディレクトリにサンプルファイルを入れておきます。また、カレントディレクトリはsampleディレクトリとします。コマンドならcd ~/Desktop/sampleです。


変換はavconvertコマンド

 Macには以前(MacOS X 10.7から。64bit版はmacOS X 10.15から)から映像を変換するためのavconvertコマンドがあります。UNIXで言うところのffmpegのようなものですが、さすがにffmpegほど高機能ではありません。ただ、8Kオーバーの映像処理など新しい映像系も対応していたりと使えればなかなか便利です。多分、Macでのフォーマット変換処理の裏ではavconvertが動作しているのでしょう。
 便利そうなavconvertコマンドですが、検索してもあまりというかほとんど出てきません。仕方ないのでmanコマンドでマニュアルを表示して確認してみましょう。また、avconvertで何もパラメーターを指定しなくても表示されます。

man avconvert

 表示された内容を見るとシンプルなパラメーターのようです。プリセットはOSのバージョンで若干異なっていますが、ほとんど同じようです。フォーマット変換する場合は、このプリセットを指定します。

・macOS Catalina (10.15.7)
Preset640x480
Preset960x540
Preset1280x720
Preset1920x1080
Preset3840x2160
PresetAppleM4A
PresetAppleM4V480pSD
PresetAppleM4V720pHD
PresetAppleM4V1080pHD
PresetAppleM4VAppleTV
PresetAppleM4VCellular
PresetAppleM4ViPod
PresetAppleM4VWiFi
PresetAppleProRes422LPCM
PresetAppleProRes4444LPCM
PresetHEVC1920x1080
PresetHEVC1920x1080WithAlpha
PresetHEVC3840x2160
PresetHEVC3840x2160WithAlpha
PresetHEVCHighestQuality
PresetHEVCHighestQualityWithAlpha
PresetHighestQuality
PresetLowQuality
PresetMediumQuality
PresetPassthrough

・macOS Sonoma 14.0
Preset640x480
Preset960x540
Preset1280x720
Preset1920x1080
Preset3840x2160
PresetAppleM4A
PresetAppleM4V480pSD
PresetAppleM4V720pHD
PresetAppleM4V1080pHD
PresetAppleM4VAppleTV
PresetAppleM4VCellular
PresetAppleM4ViPod
PresetAppleM4VWiFi
PresetAppleProRes422LPCM
PresetAppleProRes4444LPCM
PresetHEVC1920x1080
PresetHEVC1920x1080WithAlpha
PresetHEVC3840x2160
PresetHEVC3840x2160WithAlpha
PresetHEVC7680x4320 ←●追加された8K映像形式
PresetHEVCHighestQuality
PresetHEVCHighestQualityWithAlpha
PresetHighestQuality
PresetLowQuality
PresetMediumQuality
PresetPassthrough

 最近のmacOSではPresetHEVC7680x4320という8K映像形式が追加されています。(上記で⚫︎を付けてある行です)

1つの映像ファイルを変換

 まず手始めに1つの映像ファイルを変換してみましょう。ここではiPhoneで撮影した4K映像をFull HDサイズである1920x1080に変換してみます。
撮影した映像のサイズなどをQuickTime Playerのインスペクタで確認しておきます。

 念のためlsコマンドでファイル名も確認しておきます。変換するのはIMG_6152.MOVという映像ファイルです。

 それでは実際に変換してみましょう。avconvertコマンドの後に-pを指定し、その後にプリセット名を指定します。変換元のファイル名は-sの後に指定します。出力するファイル名は-oの後に指定します。まとめると以下のように指定すれば4K映像のIMG_6152.MOVファイルがHD6152.MOVという名前でFull HDサイズに変換され同じディレクトリに保存されます。

 avconvert -p Preset1920x1080 -s IMG_6152.MOV -o HD6152.MOV

エラーなく変換されると図のようなメッセージが表示されます。

 FinderやQuickTime Playerのインスペクタなどで変換された映像を確認することができます。サイズも指定したプリセットのものになっています。

 なお、すでに保存するファイルと同じ名前のファイルがあると以下のようなエラーが表示され変換は行われません。このような場合は、異なるファイル名を指定するか、既存のファイルを別のディレクトリに移動させておきましょう。

avconvert:  failed with error:Cannot Save.  The requested file name is already in use. Try a different file name or location.
avconvert completed with error:1.

 どうしても上書きする必要性があるなら--replaceオプションを指定します。既存のファイルは上書きされます。

先頭の2秒だけ別映像として変換して保存

 次に先頭の2秒だけ別映像として変換して保存します。映像のサムネールを作成するといったところでしょうか。IMG_6152.MOVは4K映像なので、そのままの形式で先頭2秒だけ別映像ファイルにします。この場合、--durationオプションの後に秒数を指定します。その他のプリセットや入出力ファイルのオプションは先ほど説明したものと同じです。なお、--durationで2を指定すると2秒になりますが、小数値も指定することができます。例えば--duration 2.5とすると2.5秒の長さの映像ファイルになります。

avconvert -p Preset3840x2160 --duration 2 -s IMG_6152.MOV -o THUMB6152.MOV

 エラーなく変換されたら確認してみましょう。指定した最初の2秒だけの映像になっています。

 なお、上記のプリセットで変換すると映像の形式がH.264になります。元映像の形式がH.264でなくH.265(HEVC)の場合、H.265(HEVC)で保存したいところです。そのような場合はプリセットをH.265(HEVC)に対応したものに変更するだけです。

 avconvert -p PresetHEVC3840x2160 --duration 2 -s IMG_6152.MOV -o THUMB6152a.MOV

開始時間と再生時間を指定して保存

 次に開始時間と再生時間を指定して別映像として保存してみます。開始時間は--startの後に開始時間を秒で指定します。--durationと同じく10.25などの小数値も指定できます。
 以下のように指定すると10秒目から2秒だけ切り取った映像がSHORT6152.MOVという名前で同じディレクトリに保存されます。

avconvert -p Preset3840x2160 --start 10 --duration 2 -s IMG_6152.MOV -o SHORT6152.MOV

なお、開始時間が再生時間よりも大きい場合はエラーとなり変換できません。

avconvert -p Preset3840x2160 --start 510 --duration 2 -s IMG_6152.MOV -o SHORT6152.MOV

一括して映像を変換

 それでは最後に同じディレクトリ内にある複数の映像を処理してみます。先ほどの先頭から2秒だけの映像を抜き出して保存することにします。以下のように入力すれば、ちょいちょいと変換してくれると楽ですが、うまくいくはずもありません。それでも、一応コマンドを入力すると案の定エラーです。

avconvert -p PresetHEVC3840x2160 --duration 2 -s *.MOV -o *.MOV

 上記の例だとうまく動いてもファイルが上書きされてしまいます。ファイル名も同じにしておくなら別のディレクトリに保存する必要があります。結局のところシェルスクリプトを作らないと期待通りの処理はできません。やることは現在のディレクトリ(カレントディレクトリ)内にある拡張子がMOVのファイルをピックアップしてavconvertを実行します。映像ファイルの数だけ処理すればよいことになります。
 まず、出力先のディレクトリを作成しておきましょう。ここではsampleディレクトリ内にshortというディレクトリを作成しました。ファインダーでフォルダとして作成しても構いませんし、mkdirコマンドでディレクトリを作成しても構いません。

 さて、肝心のシェルスクリプトですが、実行ファイル名をconv.shとします。また、conv.shに渡すパラメーターとして変換する元ファイルを指定することにします。こうしておけばワイルドカードを使えるのと、拡張子がMOVでなくmovとかqtとか様々なものを指定できます(シェルの便利な機能を使えます)。

 それではシェルスクリプトを作成しましょう。最初の1行目はシェバン(#!)で実行するbashのパスを指定しておきます。macOS Xの場合、古い3系統のbashなので人によっては新しい4系統のbashを入れているかもしれません。そのような4系統のbashで実行したい場合は、この1行目のパスを実行したいbashのパスにしてください。まあ、今回のようなシンプルな用途では、どのバージョンのbashでも問題なく動作するはずです。
 シェルスクリプトに渡されたパラメーターはfor arg; doのargに1つずつ入ります。今回の場合は指定した映像ファイル名が渡されることになります。これをavconvertの変換元ファイルとすればよいので-sの後に${arg}を指定します。出力するファイル名も同じなのですが、保存先のパスを含めて指定します。つまり-oの後に./short/${arg}と指定します。なお、注意点としては変換元ファイルがあるディレクトリでシェルスクリプトを実行することが前提なので、状況に合わせて./short/${arg}の部分はフルパス(絶対パス)にしておいた方が安全かもしれません。もし、変換したファイルが見当たらない場合は、この部分をフルパス(絶対パス)に変更してみてください。

#!/bin/bash
for arg; do
  avconvert -p PresetHEVC3840x2160 --duration 2 -s ${arg} -o ./short/${arg}
done

 せっかくなので、上記のシェルスクリプトをviを使って入力してみましょう。まず、vi conv.shと入力しリターンキーを押します。

viが起動します。新規ファイルとして作成したので何もありません。ここで、iのキーを1回押します。これでインサートモードになります。

 先ほどのシェルスクリプトをコピーしておき、vi上でペースト(command+V、通常のmacOSでのペーストのキーコンビネーションと同じ)します。

 入力し終わったらescキーを1回押します。続けてwqと入力し最後にリターンキーを押します。これで保存され、自動的にviを終了し元に戻ります。

 次に実行権限を付与します。chmod 755 conv.shと入力しリターンキーを押します。

 ls- laと入力して実行権限があるか確認します。xがついていれば実行権限が付与されたことになります。

 これで準備完了です。それでは、実際に変換作業をしてみましょう。カレントディレクトリ内にあるすべての拡張子がMOVのファイルを変換するので

./conv.sh *.MOV

 と入力します。

 無事に変換が終わると図のように表示されます。

 変換先のディレクトリを確認します。

 映像の長さはファインダーでも確認できます。いずれのファイルも2秒の映像として保存されているのがわかります。

 ちなみに同じディレクトリ内で少しだけファイル名を変えて保存したい場合は以下のようにします。ここではファイル名の先頭に_short_を追加したファイル名で保存するようにしています。

#!/bin/bash
for arg; do
  avconvert -p PresetHEVC3840x2160 --duration 2 -s ${arg} -o _short_${arg}
done

 avconvertコマンドには他にもいくつかのオプションがあるので試してみるとよいでしょう。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。