当前位置: 首页 > 知识库问答 >
问题:

Xamarin-适用于iOS的视频裁剪

轩辕修能
2023-03-14

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

基本上制作方视频,比如Vine和Instagram的视频。我认为这是通过裁剪视频的其余部分来实现的,而不仅仅是放大。

共有1个答案

艾浩广
2023-03-14

我从一个来源找到了部分代码,我试图添加所有者,但我找不到。解决方案的关键部分是我添加的用于裁剪的,在AVVideoSettingsCompress中是“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;
                       }
                   }
               });
            }
 类似资料:
  • 我正在使用https://github.com/writingminds/ffmpeg-android-java命令裁剪视频: 其中“in”是inputfile,“out”是outputfile。

  • 直到几天前,我的应用程序运行良好,直到我在输出中收到一条消息,建议我添加以下行: 对于Xamarin组件存储,该组件称为Xamarin。谷歌。网间网操作系统。MobileAds已不存在,但您必须安装Firebase AdMob for iOS。 问题是,该示例仅适用于natve iOS项目。我有一个Xamarin表单项目,在主项目中有一个通用视图 并在项目中针对每个平台进行了实施。对于iOS,是:

  • 如何在xamariniOS中使用AVPlayerLayer和AVPlayerViewController播放视频?

  • 我想在我的移动应用程序中使用谷歌oauth授权。我之前已经在测试控制台应用中实现了此功能。但是,在我在 Xamarin Android中重新定位我的代码后,出现了一些问题。法典: 这是脏代码,但在控制台应用中执行得很好。当我尝试在 Xamarin 中启动方法时,我捕获异常: 无法启动带有“”的浏览器https://accounts.google.com/o/oauth2/v2/auth?acces

  • 问题:是否有一个单独的FFMPEG裁剪过滤器可以用于所有视频,包括(但不限于):856x480、640x480和1280x720? 我们有一个视频处理系统(使用DirectShow),所有输入到这个系统的视频必须是16:9使用MJPEG编解码器。我们使用下面的ffmpeg命令将源视频转换为MJPEG,缩放像素使其为正方形,然后裁剪到16:9的纵横比。这对大多数输入视频都很管用,输出正是我们想要的。

  • 问题内容: 我想将视频裁剪为正方形,但是我做不到。 我将此代码转换为swift,但在导出视频后仅出现黑屏 我想念什么? 问题答案: 您最终将缺少exporter块,无法对创建的对象执行导出操作: