AVAssetExportSessionのフロントカメラの向きが間違っています

アルビンジョン

フロントカメラでのみAVAssetExportSessionを使用してエクスポートされたビデオの向きが間違っています。私はこのチュートリアルhttps://stackoverflow.com/a/35368649/3764365に従いましたが、このシナリオを取得しました。画像が半分にカットされているのは間違った向きではないと思います。ビデオレイヤー、レンダリングレイヤーを変更しようとしましたが、うまくいきませんでした。私のコードは次のようになります。

let composition = AVMutableComposition()
        let vidAsset = AVURLAsset(url: path)

        // get video track
        let vtrack =  vidAsset.tracks(withMediaType: AVMediaTypeVideo)
        // get audi trac

        let videoTrack:AVAssetTrack = vtrack[0]
        _ = videoTrack.timeRange.duration
        let vid_timerange = CMTimeRangeMake(kCMTimeZero, vidAsset.duration)

        var _: NSError?
        let compositionvideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())

        do {
            try compositionvideoTrack.insertTimeRange(vid_timerange, of: videoTrack, at: kCMTimeZero)

        } catch let error {
            print(error.localizedDescription)
        }

        let compositionVideoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

        let audioTrack = vidAsset.tracks(withMediaType: AVMediaTypeAudio)[0]

        do {
            try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, vidAsset.duration), of: audioTrack, at: kCMTimeZero)

        } catch {
            print("error")
        }

        let size = videoTrack.naturalSize


        let parentlayer = CALayer()

        parentlayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        let videolayer = CALayer()
        videolayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        parentlayer.addSublayer(videolayer)

let layercomposition = AVMutableVideoComposition()
        layercomposition.frameDuration = CMTimeMake(1, 30)
        layercomposition.renderSize = CGSize(width: size.height, height: size.width)

        layercomposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)

        // instruction for watermark
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration)

        let videotrack = composition.tracks(withMediaType: AVMediaTypeVideo)[0] as AVAssetTrack
        let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack)

        instruction.layerInstructions = [layerinstruction]
        layercomposition.instructions = [instruction]

        layerinstruction.setTransform(videoTrack.preferredTransform, at: kCMTimeZero)

        //  create new file to receive data
        let movieDestinationUrl = UIImage.outPut()

        // use AVAssetExportSession to export video
        let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPreset1280x720)!
        assetExport.videoComposition = layercomposition
        assetExport.outputFileType = AVFileTypeQuickTimeMovie
        assetExport.outputURL = movieDestinationUrl
アルビンジョン

この問題をどのように解決したかについて、コードを共有します。

func addImagesToVideo(path: URL, labelImageViews: [LabelImageView]) {

        SVProgressHUD.show()

        let composition = AVMutableComposition()
        let vidAsset = AVURLAsset(url: path)

        // get video track
        let vtrack =  vidAsset.tracks(withMediaType: AVMediaTypeVideo)
        // get audi trac

        let videoTrack:AVAssetTrack = vtrack[0]
        _ = videoTrack.timeRange.duration
        let vid_timerange = CMTimeRangeMake(kCMTimeZero, vidAsset.duration)

        var _: NSError?
        let compositionvideoTrack:AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())

        do {
            try compositionvideoTrack.insertTimeRange(vid_timerange, of: videoTrack, at: kCMTimeZero)

        } catch let error {
            print(error.localizedDescription)
        }

        let compositionVideoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

        let audioTrack = vidAsset.tracks(withMediaType: AVMediaTypeAudio)[0]

        do {
            try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, vidAsset.duration), of: audioTrack, at: kCMTimeZero)

        } catch {
            print("error")
        }

        let size = videoTrack.naturalSize


        let parentlayer = CALayer()

        parentlayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        let videolayer = CALayer()
        videolayer.frame = CGRect(x: 0, y: 0, width: size.height, height: size.width)
        parentlayer.addSublayer(videolayer)

        if labelImageViews.count != 0 {
            let blankImage = self.clearImage(size: videolayer.frame.size)
            let image = self.saveImage(imageOne: blankImage, labelImageViews: labelImageViews)

            let imglayer = CALayer()
            imglayer.contents = image.cgImage
            imglayer.frame = CGRect(origin: CGPoint.zero, size: videolayer.frame.size)
            imglayer.opacity = 1
            parentlayer.addSublayer(imglayer)
        }


        let layercomposition = AVMutableVideoComposition()
        layercomposition.frameDuration = CMTimeMake(1, 30)
        layercomposition.renderSize = CGSize(width: size.height, height: size.width)

        layercomposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)

        // instruction for watermark
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration)

        let videotrack = composition.tracks(withMediaType: AVMediaTypeVideo)[0] as AVAssetTrack
        let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videotrack)

        instruction.layerInstructions = [layerinstruction]
        layercomposition.instructions = [instruction]

        var isVideoAssetPortrait = false

        let videoTransform = videoTrack.preferredTransform

        if(videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) {

            isVideoAssetPortrait = true

        }

        if(videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) {
            isVideoAssetPortrait = true
        }


        if isVideoAssetPortrait {
            let FirstAssetScaleFactor = CGAffineTransform(scaleX: 1, y: 1)

            layerinstruction.setTransform(videoTrack.preferredTransform.concatenating(FirstAssetScaleFactor), at: kCMTimeZero)
        } else {
            let FirstAssetScaleFactor = CGAffineTransform(scaleX: 1, y: 1)

            layerinstruction.setTransform(videoTrack.preferredTransform.concatenating(FirstAssetScaleFactor).concatenating(CGAffineTransform(translationX: 0, y: 560)), at: kCMTimeZero)
        }


        //  create new file to receive data
        let movieDestinationUrl = UIImage.outPut()

        // use AVAssetExportSession to export video
        let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPreset1280x720)!
        assetExport.videoComposition = layercomposition
        assetExport.outputFileType = AVFileTypeQuickTimeMovie
        assetExport.outputURL = movieDestinationUrl

        assetExport.exportAsynchronously(completionHandler: {
            switch assetExport.status{
            case  AVAssetExportSessionStatus.failed:
                print("failed \(assetExport.error!)")
            case AVAssetExportSessionStatus.cancelled:
                print("cancelled \(assetExport.error!)")
            default:
                print("Movie complete")


                // play video
                OperationQueue.main.addOperation({ () -> Void in

                    let output = UIImage.outPut()
                    UIImage.compress(inputURL: movieDestinationUrl as NSURL, outputURL: output as NSURL) {

                        UISaveVideoAtPathToSavedPhotosAlbum(output.relativePath, nil, nil, nil)

                        print("Done Converting")

                        DispatchQueue.main.async {
                            SVProgressHUD.dismiss()
                        }
                    }

                })
            }
        })
    }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

UIImagePickerControllerでフロントカメラを使用するときにiOSの向きが間違っている

分類Dev

モーメント-タイムゾーンアメリカ/サンパウロのタイムゾーンオフセットが間違っています

分類Dev

xmlファイルのコメントの配置が間違っています

分類Dev

phpdate_diffのカウントが間違っています

分類Dev

Symfony JsonResponse:フロートの精度が間違っています

分類Dev

ChromeOSで16ビット深度のウェブカメラからストリーミングするときの画像の色が間違っている

分類Dev

シェイプへのフォーカスのリクエストが間違ったコントロールになっています

分類Dev

Firebase CloudFunctionのローカリゼーションが間違っています

分類Dev

opencvスカラーの値が間違っています

分類Dev

画像の向きが間違っています。それを修正する方法

分類Dev

フローパターンの引数の数が間違っています

分類Dev

Oracle SQL:エラーコードごとのエラーカウントが間違っています

分類Dev

フルカレンダー:イベントの終了時刻が間違っています

分類Dev

SQL ステートメントの構文が間違っています

分類Dev

Railsのネストされたコントローラーのパスが間違っています

分類Dev

テンソルフローグラフで復元された変数の出力が間違っています

分類Dev

テンプレートメタプログラミング:ParamaterPackのテンプレート引数の数が間違っています

分類Dev

MongoDBシャードクラスター内のドキュメントの数が間違っています

分類Dev

AngularUIルーターのテンプレートとコントローラーが間違っています

分類Dev

Haskellプログラムのクラッシュ-無限再帰?どこのステートメントが間違っていますか?

分類Dev

WordOffice.jsのInsertHtmlのフォントが間違っています

分類Dev

一部のUnicode文字のフォントが間違っています

分類Dev

コメントで始まるファイルのmimeタイプが間違っています

分類Dev

デフォルトのシェルが間違っているときにsshでログインする方法

分類Dev

Laravelカーボンフォーマットの日付が間違っています

分類Dev

Laravelカーボンフォーマットの日付が間違っています

分類Dev

Java Unsafe.storeFence()のドキュメントが間違っていますか?

分類Dev

RSpecコントローラーエラー引数の数が間違っています

分類Dev

csvファイルをインポートするときの列数が間違っています

Related 関連記事

  1. 1

    UIImagePickerControllerでフロントカメラを使用するときにiOSの向きが間違っている

  2. 2

    モーメント-タイムゾーンアメリカ/サンパウロのタイムゾーンオフセットが間違っています

  3. 3

    xmlファイルのコメントの配置が間違っています

  4. 4

    phpdate_diffのカウントが間違っています

  5. 5

    Symfony JsonResponse:フロートの精度が間違っています

  6. 6

    ChromeOSで16ビット深度のウェブカメラからストリーミングするときの画像の色が間違っている

  7. 7

    シェイプへのフォーカスのリクエストが間違ったコントロールになっています

  8. 8

    Firebase CloudFunctionのローカリゼーションが間違っています

  9. 9

    opencvスカラーの値が間違っています

  10. 10

    画像の向きが間違っています。それを修正する方法

  11. 11

    フローパターンの引数の数が間違っています

  12. 12

    Oracle SQL:エラーコードごとのエラーカウントが間違っています

  13. 13

    フルカレンダー:イベントの終了時刻が間違っています

  14. 14

    SQL ステートメントの構文が間違っています

  15. 15

    Railsのネストされたコントローラーのパスが間違っています

  16. 16

    テンソルフローグラフで復元された変数の出力が間違っています

  17. 17

    テンプレートメタプログラミング:ParamaterPackのテンプレート引数の数が間違っています

  18. 18

    MongoDBシャードクラスター内のドキュメントの数が間違っています

  19. 19

    AngularUIルーターのテンプレートとコントローラーが間違っています

  20. 20

    Haskellプログラムのクラッシュ-無限再帰?どこのステートメントが間違っていますか?

  21. 21

    WordOffice.jsのInsertHtmlのフォントが間違っています

  22. 22

    一部のUnicode文字のフォントが間違っています

  23. 23

    コメントで始まるファイルのmimeタイプが間違っています

  24. 24

    デフォルトのシェルが間違っているときにsshでログインする方法

  25. 25

    Laravelカーボンフォーマットの日付が間違っています

  26. 26

    Laravelカーボンフォーマットの日付が間違っています

  27. 27

    Java Unsafe.storeFence()のドキュメントが間違っていますか?

  28. 28

    RSpecコントローラーエラー引数の数が間違っています

  29. 29

    csvファイルをインポートするときの列数が間違っています

ホットタグ

アーカイブ