23893


下記の環境、ソースコードでAVAudioPlayerのイニシャライザでエラーが発生します。  
よろしくお願いします。

### 環境

  * Xcode 7.3
  * Swift 2.2
  * iPhone 5(実機)

### エラー内容

[code]

    Error Domain=NSOSStatusErrorDomain Code=2003334207 "(null)"
    
[/code]

### ソースコード

[code]

    class ViewController: UIViewController,NSURLSessionDownloadDelegate,AVAudioPlayerDelegate {
        var audioPlayer:AVAudioPlayer!
        func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
                do{
                    audioPlayer = try AVAudioPlayer(contentsOfURL: location)
                    audioPlayer.delegate = self
                    audioPlayer.prepareToPlay()
                    audioPlayer.play()
                } catch let error as NSError{
                    print(error)
                }
        }
    }
    
[/code]

* * *

追記

### 状況

  * サーバーから音声ファイルをダウンロードすることには成功している
  * ダウンロードされたものは”hoge.tmp”というように拡張子が”tmp”である
  * ダウンロードするときに指定するURLは”<https://server/hoge.3gp>”のように拡張子が”3gp”である
  * シミュレータではエラーにならず意図通り動作する（音声が再生される）  
_ただし、このソースコードの前画面で`audioPlayer.prepareToPlay()`（ここでいう`audioPlayer`は前画面のグローバル変数）を実行した場合に限る。（これを実行しないと音声は再生されない_

* * *

追記その2

シミュレータでの動作の詳細。  
_シミュレータでもエラーになる場合とならない場合がある_

[code]

    class ViewController: UIViewController ,AVAudioPlayerDelegate{
        var audioPlayer:AVAudioPlayer!
        var audioPlayer2:AVAudioPlayer!
        override func viewDidLoad() {
            let URL_TEST = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("hakucyou", ofType: "mp3")!)
            let URL_TEST2 = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1458897593 (5)", ofType: "3gp")!)//サーバーからDLした音声ファイル
            do{
                audioPlayer = try AVAudioPlayer(contentsOfURL: URL_TEST, fileTypeHint:"mp3")
                audioPlayer.delegate = self
                //audioPlayer.prepareToPlay()
                audioPlayer2 = try AVAudioPlayer(contentsOfURL: URL_TEST2)
                audioPlayer2.prepareToPlay()
            } catch let error as NSError {
                print(error)
            }
        }
    }
    
[/code]

このソースコードを実行すると`audioPlayer2 = try AVAudioPlayer(contentsOfURL:
URL_TEST2)`で同エラーが発生します。  
ここで`//audioPlayer.prepareToPlay()`のコメントを外すとエラーとなりません。


CC BY-SA 3.0
2016-04-09T04:33:49.900
23866
2016-04-10T09:36:30.710
2016-04-10T09:20:07.723
8000
15095
question
swift
SwiftのAVAudioPlayer でサーバーから音声ファイル（3gp）をダウンロードした後に再生したいがエラーとなる


結論から言うと、コメント中のリンクにある音声ファイルは、 **現在のiOSではサポートされていない音声フォーマット** になっているようです。

DLした音声ファイルをいじって、追記その2に記述していただいた理解不能な挙動はこちらでも確認できたのですが…。

MacのQuickTime Playerでその音声ファイルを開いたところ、次のような表示がありました。  
**Format: AMR Narrowband, 8000 Hz, Mono**  
このAMR(Adaptive Multi-
Rate)と言う音声フォーマット(3gpの音声フォーマットはAMRの他にAAC(MPEG-4)もあるようです)、現在のiOSではサポートされていないと言うことです。  
[Supported Audio file formats in
iPhone](https://stackoverflow.com/questions/1761460/supported-audio-file-
formats-in-iphone)  
上記記事内のリンクからも辿れるのですが、Appleの[Multimedia Programming
Guide](https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/MultimediaPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009767)では、サポートする音声フォーマットとして

  * AAC (MPEG-4 Advanced Audio Coding)
  * ALAC (Apple Lossless)
  * HE-AAC (MPEG-4 High Efficiency AAC)
  * iLBC (internet Low Bitrate Codec, another format for speech)
  * IMA4 (IMA/ADPCM)
  * Linear PCM (uncompressed, linear pulse-code modulation)
  * MP3 (MPEG-1 audio layer 3)
  * µ-law and a-law

の8種類が挙げられています。3gpの音声フォーマットがAAC(MPEG-4)であれば再生できたのだろうと思いますが、残念ながら現在のiOS(上記記事によるとiOS
4.3以降)ではAMR音声の3gpファイルは再生不可、と言うことになります。  
(サポートを打ち切った後、ファイルフォーマットのチェックさえしていないので、Unsupported
Formatのエラーさえ返せない、と言う状態なのだと思われます。バグと言っても良いでしょう。細部は不明ですが、iOSシミュレータの場合、一部のaudio処理はMac
OS X側に丸投げするので、条件が合えば再生できてしまうのでしょう。)

と言うわけで、残念ながら、

  * ファイルを再生可能な形式にコンバートして、サーバにアップロードし直す

か、または、(他社さんのリソースである等でそれができないなら)

  * ダウンロードした3gp/AMRリソースをアプリが自前で再生可能な形式にコンバートする

のどちらかが必要だろうと思われます。  
(残念ながらコンバータには詳しくなく、どちらの情報も持ち合わせていません。)

否定的な結果で申し訳ないのですが、こちらでわかったことをまとめると、以上のような感じです。


CC BY-SA 3.0
2016-04-10T09:36:30.710
23893
2016-04-10T09:36:30.710
2017-05-23T12:38:55.307
-1
13972
23866
answer