iOS
avfoundation
Swift
swift4

iOSで動画の回転方向を調べる

動画の回転方向の調べ方

動画編集について記事を記載しましたが、動画の回転方向を調べて適切に処理する必要があったので、そのやり方を紹介しておきます。

// 動画の回転方向を調べるメソッド
func getPreferredOrientation(_ videoTrack: AVAssetTrack) -> CGFloat {
    var ori:CGFloat    // 返り値 角度を格納する
    let transform = videoTrack.preferredTransform    // videoの回転情報

    // 180度
    if transform.a == -1.0 && transform.b == 0.0 && transform.c == 0.0 && transform.d == -1.0 {
        ori = CGFloat(Double.pi/180*(180))
    }
    // 90度
    else if transform.a == 0.0 && transform.b == -1.0 && transform.c == 1.0 && transform.d == 0.0 {
        ori = CGFloat(Double.pi/180*(90))
    }
    // -90度 (270度)
    else if transform.a == 0.0 && transform.b == 1.0 && transform.c == -1.0 && transform.d == 0.0 {
        ori = CGFloat(Double.pi/180*(-90))
    }
    // 0度
    else { // transform.a == 1.0 && transform.b == 0.0 && transform.c == 0.0 && transform.d == 1.0
        ori = CGFloat(0.0)
    }
    return ori
}

解説

AVAssetTrack.transformにはアフィン変換の行列が入っているので、それを調べることで回転方向が分かります。
アフィン変換ってなんですか、という人は「アフィン変換/平行移動だって変換行列で」などを参考に。

後の処理で正しい方向で再生するために、角度が取得できるようにしています。取得した角度分だけ動画を回転して表示することになります。

注意点

他の記事などで、tx, tyのプロパティを見て回転を調べているものがあったのですが、こちらのプロパティは平行移動に使うもので回転とは関係ないので要注意。iPhoneで撮影した動画だとtx, tyと動画の幅高さを比較して上手く行く時があるのですが、androidで撮影した動画などでは上手く行かない時があります。

回転の仕方

var videoTrack: AVAssetTrack
// videoTrackの取得処理は省略

let videoLayer: CALayer = CALayer()  // videoレイヤを作成
ori = getPreferredOrientation(videoTrack)  // 動画の角度を確認
videoLayer.transform = CATransform3DMakeRotation(ori, 0.0 ,0.0, 1.0)  // 動画を回転

CATransform3DMakeRotationを使って回転ができます。3次元のアフィン変換ですが、2次元で回転するにはこのように1つめの引数に回転角度を入れればOKです。
これをやらないと、再生するときに動画の向きがおかしなことになってしまいます。