【Mac】Automatorでファイルが二重に処理される?原因と解決策「選択されたFinder項目を取得」の意外な罠

コンピュータ関連
スポンサーリンク

先日、古いOSからちょっと上のSonomaに変えたのですが、
その際、自作のワークフローを消してしまいました。

まぁ正確には全部ではなく昔バックアップをとっていた古いバージョンは無事。ただ新しい方がほぼほぼ消えました。
その原因は自分の確認ミスで他の誰も悪くないのですが・・・地味に痛いよね。

とは言え、さほど難しい事をしていたわけではないので新しく作り直すことにしたのです。

そこで問題が発覚。表題の件。

あれ?Automatorでファイルが二重に処理されてる???

スポンサーリンク

ことの発端:H.265/HEVCのmp4ファイルにタグを追加したい・・・のに?

H.265(hevc)でエンコードされた動画はクイックルックでプレビューできませんよね?
サムネイルも表示されないし、なんかちょと嫌。

でも hvc1 というタグを付与すれば、実は問題なくサムネもプレビューも表示されるのです。

H.265は、従来のH.264に比べて約2倍の圧縮効率を誇るビデオコーデックです。高画質を維持したままファイルサイズを抑えられるため、4K動画などで広く利用されています。

Apple製品での互換性と「hvc1」タグ

ffmpegでH.265の動画を作成する際、標準設定のままだとAppleデバイスで再生できないことがあります。これは、内部的なフォーマット識別子(FourCC)に「hev1」が使われることが原因です。

H.265でエンコードされた動画には、内部的な識別子(FourCC)として「hev1」または「hvc1」というタグが付与されます。一見同じように見えますが、再生環境によっては大きな影響を与えます。この2つの主な違いは、ビデオのパラメータ情報(VPS/SPS/PPS)がどこに格納されているかという点にあります。

  • hev1: パラメータがビデオストリーム内に含まれる形式。
  • hvc1: パラメータがサンプル記述(コンテナのヘッダ)に格納される形式。

現在、Apple(iOS, macOS)は「hvc1」しか公式にサポートしていないため、hev1で作成された動画は「非対応フォーマット」として再生できないことがあるのです。

ffmpegでの解決策として、

ffmpeg -i input.mp4 -c copy -tag:v hvc1 output.mp4

とタグをつけることでサムネの表示やプレビューが可能になります。

ということで、そのワークフローをAutomatorで作成し、
プレビューできないh265の動画を右クリックから簡単に処理していたのでした。

単一ファイルではなく、複数ファイルを選択して一編に処理したい

いちいち個別のファイルを選んで、右クリックからクイックアクション〜とか面倒くさいので、複数のファイルを選択したのち、一気に処理するようスクリプトを書いていました。

でもH.265ではないファイルにまでタグ付けする必要はありません。
なので処理を振り分けようと思ったのです。

改めて昔のスクリプトを見て、必要な形に書き換えました。


#echo "---開始---" &>> ~/Desktop/test.log
#echo "$@" &>> ~/Desktop/test.log
for file in "$@"
do
    codec=$(/usr/local/bin/ffprobe \
        -v error \
        -select_streams v:0 \
        -show_entries stream=codec_name \
        -of default=nokey=1:noprint_wrappers=1 \
        "$file")

    if [ "$codec" = "hevc" ]; then
        /usr/local/bin/ffmpeg -i "$file" -c copy -tag:v hvc1 "${file%.*}_.mp4"
    else
        # hevc以外(avcなど)の場合は何もしない
        afplay /Users/*****/Library/Sounds/someprob.wav
    fi
done
afplay /Users/*****/Library/Sounds/done.wav

念の為、冒頭のecho(コメントアウトしてますが)で何を受け取っているのか確認してみたときのこと。

a.mp4 b.mp4 a.mp4 b.mp4

のように何故か2回受け取っていることが判明。

本来は

a.mp4 b.mp4

だけでいいのに。
・・・どして?

スポンサーリンク

「選択されたFinder項目を取得」が要らなかった

結論から言うと、原因は「入力の二重取り」です。
「最初にファイルを選ばなきゃいけないからとりあえず『選択されたFinder項目を取得』を置いた」のが間違いでした。

Automatorで「クイックアクション(またはサービス)」を作成すると、一番上の設定欄に「ワークフローが受け取る現在の項目:[ファイルまたはフォルダ]」という項目がありますよね。
実はこの設定があるおかげでクイックアクションを実行した瞬間に、選択しているファイルの情報が自動的に次のアクションへと引き渡されているのです。

それなのに、先頭に「選択されたFinder項目を取得」を入れてしまうと・・・

  1. 自動で渡されたファイル情報
  2. アクションで改めて取得したファイル情報

の2つが合流してしまい、Automatorの中では「同じファイルが2回リストアップされた状態」で処理がスタートしていました。これが二重処理の正体でした。

解決策:先頭のアクションを消すだけ!

理由がわかったならやることは一つ。
先頭に置いた「選択されたFinder項目を取得」というアクションを削除。

クイックアクションやカレンダーアラームのように「特定のきっかけ(トリガー)」がある場合は、多くの場合で不要なんだそうです。

まとめ

変なところで躓いて時間が取られてしまいました。
が、わかってみれば単純なこと。

そしてそんなんでも一応動いていたのが問題発覚を遅らせていました。

今回は必要のない場合にあらかじめ用意しておいた音声ファイルを再生させようとして、何故か複数回再生されてしまったことで気がつきました。

細かい話なんだけれども。プロならば当然、玄人ならやらないミスをしてしまったお恥ずかしい話なんだけれども、自分のような間違いをしてしまう人がいたら参考になればと記事にしてみました。

以上!

コメント

タイトルとURLをコピーしました