iPhone で利用できる着信音を FFmpeg で作成する方法

5年程前から今まで、ずっと Android を使い続けていました。
つい先日、 iPhone 6s を契約し、 Android では当然のように出来る、任意のオーディオファイルを着信音に設定する事が iOS では出来ないと知り、フィーチャーフォン時代を思い出して懐かしくなりました。

Android では [File Commander](https://play.google.com/store/apps/details?id=com.mobisystems.fileman) 等のファイルマネージャーアプリを仲介する事で、 Android 上で再生できるほぼ全てのオーディオファイルを着信音に設定できます。

しかし、 2015年12月現在に於いて iOS では着信音用にファイル形式を AAC へ変換し、拡張子を `.m4r` にして PC から同期しなければ任意の曲を着信音にすることは出来ません。更に40秒以下という再生時間の制限もあります。

そこで、 [FFmpeg](https://www.ffmpeg.org/) を用いて一瞬で変換しましょう。

FFmpeg のダウンロード
==================
https://www.ffmpeg.org/download.html

使い方
=====
これで、先頭から30秒間を切り出して、ビットレートが 256kbps、サンプリングレートが 44.1kHz の AAC 形式へ変換できます。

```
ffmpeg -i music.mp3 -ss 0 -t 40 -vn -ar 44.1k -ac 2 -b:a 256k -c:a libfaac -f mp4 music.m4r
```

`-c:a libfaac` は省略可能で、 `-ar 44.1k` も元のサンプリングレートのままで良い場合は省略できます。

各オプションの説明
---------------
|オプション|説明|
|:------:|----|
| -f | ファイル形式を指定して入力または出力します。例では入力ファイルの形式を指定しています。基本的に自動でファイル形式を判別しますが、自動で判別できない場合に指定します。<br> 例: `ffmpeg -f mp3 -i music.mp3 music.aac` |
| -i | 入力ファイルを指定します。<br> 例: `ffmpeg -i music.mp3 music.aac` |
| -t | 時間[秒]を指定して切り出します。<br> 例: `ffmpeg -i music.mp3 -t 30 music.aac` |
| -ss | 切り出す開始時間を指定します。<br> 例: `ffmpeg -i music.mp3 -ss 10 music.aac` |
| -vn | 入力ファイルが動画の場合に動画を無効化します。<br> 例: `ffmpeg -i video.mp4 -vn music.aac` |
| -ar | サンプリングレートを指定します。<br> 例: `ffmpeg -i music.mp3 -ar 44.1k music.aac` |
| -codec:a | コーデックを指定します。<br> 例: `ffmpeg -i music.mp3 -codec:a libfaac music.aac` |
| -c:a | `-codec:a` のエイリアスです。<br> 例: `ffmpeg -i music.mp3 -c:a libfaac music.aac` |
| -acodec | `-codec:a` のエイリアスです。<br> 例: `ffmpeg -i music.mp3 -acodec libfaac music.aac` |

iTunes で転送する
================

次の写真のように、 iPhone の着信音の所へドラッグ&ドロップしても上手く転送できません。

<img width="1212" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/a8405592-ef1c-fdb6-86cc-afe8d4aab75a.png">

一見転送できているように見えますが、グレーアウトされていて再生できません。

### 1. 次のように、オプションにある "音楽とビデオを手動で管理" のチェックボックスを外します。
<img width="1212" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/bb50a726-e690-6de6-d08f-c786af4a06ac.png">

### 2. 着信音を同期する設定にします。
<img width="1212" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/27bd709b-3893-06d0-6f31-be3f60c022f3.png">

### 3. 左上から着信音を選択し、変換した拡張子が `.m4r` のファイルをドラッグ&ドロップします。
<img width="1212" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/5a2b7c9e-53ad-fa0e-765b-c8c11c9d8747.png">

### 4. デバイス画面に戻り、右下の同期ボタンを押すと iPhone に転送されます。
<img width="1212" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/35ce5a41-3950-7de2-4909-e5f904d5a590.png">

### 5. 次のように再生できれば転送成功です。
<img width="1212" alt="06.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/6e4c831f-40b8-7c00-0511-eace870c9616.png">

### 転送失敗例
再生時間が長すぎる(40秒を越える)場合、転送されません。

<img width="593" alt="07.png" src="https://qiita-image-store.s3.amazonaws.com/0/1804/ae719a26-1404-28c8-f8f6-223489956231.png">

着信音の設定方法
-------------
### 1. 設定を開いてサウンドを選択
<img width="375" alt="IMG_0088.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/1804/6f39d0bd-7fde-65a6-d12b-9960e9544b03.jpeg">

### 2. 着信音を選択
<img width="375" alt="IMG_0089.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/1804/30e5baf3-ac65-67a9-4d23-8a8285e5961c.jpeg">

### 3. このように表示されます
<img width="375" alt="IMG_0090.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/1804/33168ec2-9c2d-2178-3d1e-85968c7a4067.jpeg">

参考
===
* [ffmpeg Documentation](https://ffmpeg.org/ffmpeg.html)
* [Encode/AAC – FFmpeg](https://trac.ffmpeg.org/wiki/Encode/AAC)