19317


現在作っているアプリは画面が横向きで固定されており、その状態で動画を撮影する必要があります。  
一旦動画を横向きで撮影し、保存したはいいものの、その撮影した動画が縦向きで撮影された動画になってしまっています。色々と調べたところ、下記の記事にたどり着いてコーディングしているのですが、コードにエラーが出て動かすことができません。

[Video Saving in the wrong orientation
AVCaptureSession](https://stackoverflow.com/questions/15580462/video-saving-
in-the-wrong-orientation-avcapturesession)

以下は自分のコードですが、for in文の中のconnection.inputPortsの行で「AnyObject is not convertible
to AVCaptureInputPort」というエラーが出てしまいます。（リンク先のコードをそのままコピペすると一つ上のfor
inでもエラーが発生するのですが、それは正しく解決できているか分からないですが、as !
[AVCaptureConnection]とすることで解決できました）

[code]

    for connection: AVCaptureConnection in movieFileOutput.connections as! [AVCaptureConnection] {
                print(connection)
    
                for port: AVCaptureInputPort in connection.inputPorts {
                    print(port)
    
    
                }
            }
    
[/code]

どうすればこのエラーを解決できるでしょうか？  
また、もしより良い解決方法などがあるのであれば教えていただきたいです。  
よろしくお願いします。


CC BY-SA 3.0
2015-11-25T23:28:43.870
19304
2015-11-26T05:41:20.550
2017-05-23T12:38:55.307
-1
5210
question
ios swift avfoundation
動画を横向きで撮影する


このエラーはエラーメッセージの通り、 **AnyObjectはAVCaptureInputPortに置き換えできません** というのが原因です。

AVCaptureConnectionのクラスリファレンスを見てみると、inputPortsの戻り値は`[AnyObject]!`になっていると思います。  
これは、『nilを含む可能性のある、AnyObjectの配列』という意味です。  
AnyObjectはObjective-Cでいうところの **id型** と同様、不特定のクラスのオブジェクトです。

つまり、`connection.inputPorts`はAnyObjectという不特定のオブジェクト(の配列)を戻すのに対して、`port:AVCaptureInputPort`はAVCaptureInputPortのオブジェクトしか受け入れないと宣言しているためにエラーになっています。

ですので解決方法としては、配列内のオブジェクトをAVCaptureInputPortにダウンキャストする必要があります。

ここで提示いただいているコードの少し上を見ると、`movieFileOutput.connections as!
[AVCaptureConnection]`という記述があると思いますが、この`as!
[AVCaptureConnection]`がまさにオブジェクトのダウンキャストを行う記述になります。  
これをエラー発生部分用に単純に書き換えると、

[code]

    for port: AVCaptureInputPort in connection.inputPorts as! [AVCaptureInputPort] {
        //実際の処理
    }
    
[/code]

となります。  
この記述は、connection.inputPortsが必ずAVCaptureInputPortのオブジェクトの配列しか返さないことが保証されている時に使用します。

しかし今回connection.inputPortsの戻り値は[AnyObject]!であるため、AVCaptureInputPort以外のオブジェクトが含まれているとダウンキャスト時にエラーとなってしまいますので、他の方法が必要になります。

具体的には、一旦AnyObjectのままとり出した後、`as?`演算子でダウンキャストしてportに代入し、ダウンキャストが成功したら実際の処理に進むという手順を踏みます。

[code]

    for inputPort in connection.inputPorts {
        if let port = inputPort as? AVCaptureInputPort {
            //実際の処理
        }
    }
    
[/code]

この`as?`演算子は`as!`と少し違い、ダウンキャストするのは同じなのですがダウンキャストできなかった際にnilを返してくれます。

`as! [AVCaptureConnection]`の方も正しく解決できているか分からないのであれば、同様の手順を踏んでおいたほうが安全かもしれません。


CC BY-SA 3.0
2015-11-26T05:41:20.550
19317
2015-11-26T05:41:20.550
3227
19304
answer