7rikazhexde’s tech log

技術的な興味関心、備忘録、アウトプットなどを書いています。

【Mac + Shortcuts App】シェルスクリプトアクションを使用して指定フォルダ内のビデオファイルを1ファイルずつエンコード処理するショートカットについて

私は普段、QuickTimePlayerによる収録、Youtubeの動画保存、デジカメやiPhoneによる動画撮影等をしているのですが、
解像度がFullHD以上で固定されている場合が多く、録画時間が長くなるとファイルサイズも大きくなり、ストレージの空き容量も少なくなります。
一方でファイル内容や動画をスマホで見る場合など、FullHDまで必要ないケースもあるため、Macエンコード機能を使用してファイルサイズを小さくして管理しています。

ビデオファイルのエンコード方法
ファイルで右クリック > 選択したビデオファイルをエンコード > 設定でエンコード指定

Mac メディアエンコード画面

エンコードする際は複数ファイルを選択して実行することで1ファイルずつ実行されるのですが、ファイル選択とエンコード指示が手間(実際そこまでではないですが)なので、
1アクションで実行する方法として、ショートカットAppを使用して指定フォルダ内のビデオファイルを1ファイルずつエンコード処理するショートカットを作成したので紹介します。

作成したショートカットについて

以下で公開しています。使用する際は自己責任の範囲でリンクより取得して使用してください。
※リンクから追加画面に遷移しない場合はメモにURLを貼り付けてからアクセスしてください。

www.icloud.com

使い方、注意事項についてはショートカットの先頭にコメントで記載しているため参照してください。
以下では使用アクションと処理のポイントについて記載します。

指定フォルダに格納されたファイル一覧の取得処理として、エンコード処理はファイル単位で実行するため、lsコマンドを使用してファイルの一覧を.tmpファイルに書き出しています。

次にフォルダからファイルを取得アクションを使用して改行で分割指定することにより、.tmpファイルからファイル単位の情報に分割しています。

分割した情報はリストから項目を取得アクションを使用してRangeの項目指定で開始位置から終了位置まで取得しています。

フォルダ内のファイル一覧を取得するアクションがあるとよかったのですが、単体では存在しないようです 。

videoFileAvconvert-1

次に.tmpファイルは不要になるためrmコマンドで削除しています。

その後、各項目を繰り返すアクションでリストからの項目を指定しています。

リストからの項目ではビデオファイル名(ファイル名.拡張子)を取得できるため、ビデオファイル名をシェルスクリプト引数として与えてavconvertコマンドを実行しています。

ここでポイントとして、ファイル名を出力ファイル名に使用したかったので、${source%.*}でファイル名部分を変数filenameに代入しています。シェルスクリプトに渡す変数は調べた範囲では複数指定できないようだったのでシェルの中で処理しました。

videoFileAvconvert-2

最後に完了メッセージを表示して、ショートカットを停止しています。

videoFileAvconvert-3

まとめ

ショートカットAppを使用して指定フォルダ内のビデオファイルを1ファイルずつエンコード処理するショートカットを作成したので紹介しました。

ショートカットを作成していて使いたいアクションがないケースがあり、作りづらいと感じる部分もありました。

正直、エンコード処理であればシェルスクリプトで書けばいいのではと思うこともありましたが、今回はショートカットで作成しました。

ショートカットでは共有する都合上、表示アクションを追加していますが、削除すればショートカットの実行のみで各ファイルがエンコードされるため、やりたいことは実現することができました。

また、ファイルの取得処理などは動画ファイル以外でも使用できるため、何かで他でも活用できるかと思います。

参考

以下の記事を参考にさせていただきました。
MacOS コマンドラインで「選択したビデオファイルをエンコード」 - vague memory

文字列と変数の結合 | Linuxシェルスクリプト | shiraberu.tech

シェルスクリプトの特殊変数$@と$*の違い - ハックノート