菜鸟教程小白 发表于 2022-12-13 11:54:30

ios - Xamarin.iOS - ExportAsynchronously 失败


                                            <p><p>首先我应该提到我是新的(iOS 和 Xamarin)。
我正在尝试使用图像和文本为视频添加水印。</p>

<p>我已从链接中移植了大部分代码:<a href="https://stackoverflow.com/a/22016800/5275669" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/22016800/5275669</a> .</p>

<p>整个代码贴在这里:</p>

<pre><code>try {

            var videoAsset = AVUrlAsset.FromUrl (new NSUrl (filepath, false)) as AVUrlAsset;
            AVMutableComposition mixComposition = AVMutableComposition.Create ();
            var compositionVideoTracks = mixComposition.AddMutableTrack (AVMediaType.Video, 0);
            AVAssetTrack clipVideoTrack = videoAsset.TracksWithMediaType (AVMediaType.Video) ;
            var compositionAudioTrack = mixComposition.AddMutableTrack (AVMediaType.Audio, 0);
            AVAssetTrack clipAudioTrack = videoAsset.TracksWithMediaType (AVMediaType.Audio) ;

            NSError error;
            CMTimeRange timeRangeInAsset = new CMTimeRange ();
            timeRangeInAsset.Start = CMTime.Zero;
            timeRangeInAsset.Duration = videoAsset.Duration;
            compositionVideoTracks.InsertTimeRange (timeRangeInAsset, clipVideoTrack, CMTime.Zero, out error);
            compositionVideoTracks.InsertTimeRange (timeRangeInAsset, clipAudioTrack, CMTime.Zero, out error);
            compositionVideoTracks.PreferredTransform = clipVideoTrack.PreferredTransform;

            CGSize sizeOfVideo = videoAsset.NaturalSize;

            CATextLayer textOfvideo = (CATextLayer)CATextLayer.Create ();
            textOfvideo.String = String.Format (&#34;{0} {1}&#34;, DateTime.Now.ToLongTimeString (), &#34;Test app&#34;);
            textOfvideo.SetFont (CGFont.CreateWithFontName (&#34;Helvetica&#34;));
            textOfvideo.FontSize = 50;
            textOfvideo.AlignmentMode = CATextLayer.AlignmentCenter;
            textOfvideo.Frame = new CGRect (0, 0, sizeOfVideo.Width, sizeOfVideo.Height / 6);
            textOfvideo.ForegroundColor = new CGColor (255, 0, 0);

            UIImage myImage = UIImage.FromFile (&#34;Icon-Small.png&#34;);
            CALayer layerCa = CALayer.Create ();
            layerCa.Contents = myImage.CGImage;
            layerCa.Frame = new CGRect (0, 0, 100, 100);
            layerCa.Opacity = 0.65F;

            CALayer optionalLayer = CALayer.Create ();
            optionalLayer.AddSublayer (textOfvideo);
            optionalLayer.Frame = new CGRect (0, 0, sizeOfVideo.Width, sizeOfVideo.Height);
            optionalLayer.MasksToBounds = true;

            CALayer parentLayer = CALayer.Create ();
            CALayer videoLayer = CALayer.Create ();
            parentLayer.Frame = new CGRect (0, 0, sizeOfVideo.Width, sizeOfVideo.Height);
            videoLayer.Frame = new CGRect (0, 0, sizeOfVideo.Width, sizeOfVideo.Height);
            parentLayer.AddSublayer (videoLayer);
            parentLayer.AddSublayer (layerCa);
            parentLayer.AddSublayer (textOfvideo);

            AVMutableVideoComposition videoComposition = AVMutableVideoComposition.Create ();
            videoComposition.RenderSize = sizeOfVideo;
            videoComposition.FrameDuration = new CMTime (1, 30);
            videoComposition.AnimationTool = AVVideoCompositionCoreAnimationTool.FromLayer (videoLayer, parentLayer);

            AVMutableVideoCompositionInstruction instruction = AVMutableVideoCompositionInstruction.Create () as AVMutableVideoCompositionInstruction;
            CMTimeRange timeRangeInstruction = new CMTimeRange ();
            timeRangeInstruction.Start = CMTime.Zero;
            timeRangeInstruction.Duration = mixComposition.Duration;
            instruction.TimeRange = timeRangeInstruction;
            AVAssetTrack videoTrack = mixComposition.TracksWithMediaType (AVMediaType.Video) ;

            AVMutableVideoCompositionLayerInstruction layerInstruction = AVMutableVideoCompositionLayerInstruction.FromAssetTrack (videoTrack);
            instruction.LayerInstructions = new AVVideoCompositionLayerInstruction[] { layerInstruction };
            List&lt;AVVideoCompositionInstruction&gt; instructions = new List&lt;AVVideoCompositionInstruction&gt; ();
            instructions.Add (instruction);
            videoComposition.Instructions = instructions.ToArray ();

            var exportSession = new AVAssetExportSession (mixComposition, AVAssetExportSession.PresetMediumQuality);
            exportSession.VideoComposition = videoComposition;

            Console.WriteLine (&#34;Original path is {0}&#34;, filepath);
            string newFileName = Path.GetFileName (filepath);
            newFileName = newFileName.Replace (&#34;.mp4&#34;, &#34;_wm.mp4&#34;);
            string directoryName = Path.GetDirectoryName (filepath);
            string videoOutFilePath = Path.Combine (directoryName, newFileName);
            Console.WriteLine (&#34;New path is {0}&#34;, videoOutFilePath);

            exportSession.OutputFileType = AVFileType.Mpeg4;
            exportSession.OutputUrl = NSUrl.FromFilename (videoOutFilePath);
            exportSession.ShouldOptimizeForNetworkUse = true;
            exportSession.ExportAsynchronously (() =&gt; {
                AVAssetExportSessionStatus status = exportSession.Status;
                Console.WriteLine (&#34;Done with handler. Status: &#34; + status.ToString ());
                switch (status) {
                case AVAssetExportSessionStatus.Completed:
                  Console.WriteLine (&#34;Sucessfully Completed&#34;);
                  if (File.Exists (videoOutFilePath)) {
                        Console.WriteLine (&#34;Created!!&#34;);
                  } else
                        Console.WriteLine (&#34;Failed&#34;);
                  break;
                case AVAssetExportSessionStatus.Cancelled:
                  break;
                case AVAssetExportSessionStatus.Exporting:
                  break;
                case AVAssetExportSessionStatus.Failed:
                  Console.WriteLine (&#34;Task failed =&gt; {0}&#34;, exportSession.Error);
                  Console.WriteLine (exportSession.Error.Description);
                  break;
                case AVAssetExportSessionStatus.Unknown:
                  break;
                case AVAssetExportSessionStatus.Waiting:
                  break;
                default:
                  break;
                }
            });

            if (File.Exists (videoOutFilePath))
                return videoOutFilePath;
      } catch (Exception ex) {
            Console.WriteLine (&#34;Error occured : {0}&#34;, ex.Message);
      }
</code></pre>

<p>我不断收到以下错误:
任务失败 => 无法完成导出
Error Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export"UserInfo=0x18896070 {NSLocalizedRecoverySuggestion=再次尝试导出。, NSLocalizedDescription=Cannot Complete Export}</p>

<p>如果我替换这个</p>

<pre><code>var exportSession = new AVAssetExportSession (mixComposition, AVAssetExportSession.PresetMediumQuality);
</code></pre>

<p>与</p>

<pre><code>var exportSession = new AVAssetExportSession (videoAsset, AVAssetExportSession.PresetMediumQuality);
</code></pre>

<p>它工作正常,但没有水印</p>

<p>有人可以帮忙吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所以我设法通过更改这些行来解决这个问题</p>

<pre><code>compositionVideoTracks.InsertTimeRange (timeRangeInAsset, clipVideoTrack, CMTime.Zero, out error);
compositionVideoTracks.InsertTimeRange (timeRangeInAsset, clipAudioTrack, CMTime.Zero, out error);
compositionVideoTracks.PreferredTransform = clipVideoTrack.PreferredTransform;
</code></pre>

<p>到这里:</p>

<pre><code>compositionVideoTracks.InsertTimeRange (timeRangeInAsset, clipVideoTrack, CMTime.Zero, out error);
compositionAudioTrack.InsertTimeRange (timeRangeInAsset, clipAudioTrack, CMTime.Zero, out error);
compositionVideoTracks.PreferredTransform = clipVideoTrack.PreferredTransform;
</code></pre>

<p>虽然我不确定为什么会这样。谁能解释一下?</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Xamarin.iOS - ExportAsynchronously 失败,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/33929938/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/33929938/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Xamarin.iOS - ExportAsynchronously 失败