【问题标题】:Xamarin - Video Cropping for iOSXamarin - 适用于 iOS 的视频裁剪
【发布时间】:2014-09-08 18:24:16
【问题描述】:

我想知道是否有办法在 Xamarin 中裁剪视频。我似乎找不到任何例子。我尝试查看现有的函数和类,但找不到任何东西。

基本上制作像 Vine 和 Instagram 那样的方形视频。我认为这是通过裁剪视频的其余部分而不是放大来完成的。

【问题讨论】:

  • 您可能希望更清楚地说明您要完成的工作。我猜您不想实际编辑视频,只是“放大”视频的一部分以显示给用户?也许是为了消除黑边?
  • @mason 基本上我想获得 Vine 所拥有的方形视频。所以我不确定 Vine 是如何通过放大或实际裁剪视频的其余部分来做到这一点的。所以我的视频会从 1920x1080 变成 800x800 只是一个例子。

标签: c# ios mono xamarin.ios xamarin


【解决方案1】:

我从一个来源找到了部分代码,我尝试添加所有者但我找不到。该解决方案的关键部分由我添加用于裁剪,即 AVVideoSettingsCompressed 中的“VideoCleanAperture”。

                videoUrl = ((AVFoundation.AVUrlAsset)avAsset).Url;
                NSError assetReaderError;
                var assetReader = AVAssetReader.FromAsset(avAsset, out assetReaderError);
                var assetTrack = avAsset.Tracks.First();

                //Height = (System.nint?)avAsset.NaturalSize.Height,
                    //Width = (System.nint?)avAsset.NaturalSize.Width,
               var inputSettings = new AVVideoSettingsUncompressed()
               {
                    Height = (System.nint?)avAsset.NaturalSize.Height,
                    Width = (System.nint?)avAsset.NaturalSize.Width,
               };
               var assetReaderOutput = new AVAssetReaderTrackOutput(assetTrack, settings: inputSettings);
               assetReaderOutput.AlwaysCopiesSampleData = false;

               string tempFile = Path.Combine(Path.GetTempPath(), "CroppedVideo.mp4");
               if (File.Exists(tempFile)) File.Delete(tempFile);
               var url = NSUrl.FromFilename(tempFile);
               NSError assetWriterError;
               var assetWriter = new AVAssetWriter(url, AVFileType.Mpeg4, out assetWriterError);



               var outputSettings = new  AVVideoSettingsCompressed()
               {
                   Height = 300,
                   Width = 300,
                    Codec = AVVideoCodec.H264,
                   CodecSettings = new AVVideoCodecSettings()
                   {
                       AverageBitRate = 1000000, 
                        VideoCleanAperture = new AVVideoCleanApertureSettings(
                            new NSDictionary(
                            AVVideo.CleanApertureWidthKey, new NSNumber(300),
                            AVVideo.CleanApertureHeightKey, new NSNumber(300),
                            AVVideo.CleanApertureVerticalOffsetKey, new NSNumber(10),
                            AVVideo.CleanApertureHorizontalOffsetKey, new NSNumber(10)
                            )
                        )    
                   }, 

                    ScalingMode = AVVideoScalingMode.ResizeAspectFill
               };


                var assetWriterInput = new AVAssetWriterInput(mediaType: AVMediaType.Video, outputSettings: outputSettings);
                assetWriterInput.ExpectsMediaDataInRealTime = false;
               assetWriter.AddInput(assetWriterInput);

               assetWriter.StartWriting();
               assetReader.AddOutput(assetReaderOutput);
               assetReader.StartReading();
               assetWriter.StartSessionAtSourceTime(CoreMedia.CMTime.Zero);

               var mediaInputQueue = new DispatchQueue("mediaInputQueue");
               assetWriterInput.RequestMediaData(mediaInputQueue, () =>
               {
                   while (assetWriterInput.ReadyForMoreMediaData)
                   {
                       var nextBuffer = assetReaderOutput.CopyNextSampleBuffer();
                       if (nextBuffer != null)
                       {
                           assetWriterInput.AppendSampleBuffer(nextBuffer);
                       }
                       else
                       {
                           assetWriterInput.MarkAsFinished();
                           assetWriter.FinishWritingAsync();
                           assetReader.CancelReading();
                           assetReader.Dispose();
                           assetReaderOutput.Dispose();
                           assetWriter.Dispose();
                           assetWriterInput.Dispose();
                           break;
                       }
                   }
               });
            }

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2014-11-05
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2011-06-27
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多