By David Goehring

iOS端末でどうしてもシャッター音を静かにしたい・消したいという人はシャッター音のもとであるファイルをリネームしたり、無音の同名ファイルで上書きするなどいろいろな方法を用いていると思いますが、プログラマー向けQ&AサイトのStack Overflowでは「もっとクールな方法がある」ということで、シャッター音に対して位相を反転させた逆相のファイルを掛け合わせて無音状態にするという手法が紹介されています。

iphone - AVFoundation, how to turn off the shutter sound when captureStillImageAsynchronouslyFromConnection? - Stack Overflow
http://stackoverflow.com/questions/4401232/avfoundation-how-to-turn-off-the-shutter-sound-when-capturestillimageasynchrono

これは、iOS向けにカメラアプリを制作しているohhoというユーザーが、どうしてもシャッター音が鳴ってしまうのはどうにかならないだろうかとStack Overflowに質問を投稿したところ、寄せられたもの。

そもそも、iOS向けにカメラアプリを作るにあたっては「UIImagePickerController」を使う方法と「AVFoundation.framework」を使う方法の2つがあります。カンタンなのは「UIImagePickerController」を使うことですが、自由度が高いのは「AVFoundation.framework」を使う方法で、ohhoさんはAVFoundationを使って、カメラのライブビュー画面から画像を取得することでシャッター音をなくすことを思いついたのですが、うまくいかなかったそうです。

質問に対する回答によると、手順はまずiPhoneに内蔵されているシャッター音のファイル「photoShutter.caf」を取得。そのファイルを波形編集ソフトで開き、波形を反転させることで逆相ファイルを作ります。上段が元のファイルを拡大した波形で、下段が位相を反転された状態のデータを示しています。


補助線を引くと、波形の山の部分が上下でちょうど逆さまになっていることが確認できます。


次に、逆相にしたファイルを[photoShutter2.caf]のファイル名で保存し、下記のコードを使って「captureStillImageAsynchronouslyFromConnection」でシャッターを切る(画像を取得する)直前に音を再生するようにします。これにより、カメラアプリでシャッターを切ろうとすると通常のシャッター音(photoShutter.caf)とシャッター音の逆相(photoShutter2.caf)が同時に鳴るので、2つの音が打ち消しあってシャッター音がなくなる、という仕組みになっています。


実際にこの手法で数回にわたってテストしてみたところ、まったくシャッター音は確認できなかったとのこと。原理的には外部のノイズをマイクで拾って打ち消す音を再生して騒音を軽減するノイズキャンセリングヘッドホンと同じ動作ですが、こちらは元のデータレベルで同じ波形を用いているのでより高い効果が得られるようです。逆相成分を合成して波形をキャンセルするためにはサンプル単位でピッタリと位置を一致させないと効果が激減するはずなので、その制御をどのように行っているのかが気になるところです。