- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我拥有在 Objective-C 中创建、配置和启动视频捕获 session 的代码,运行没有任何问题。我正在将示例移植到 C# 和 MonoTouch 4.0.3 并遇到一些问题,这是代码:
void Initialize ()
{
// Create notifier delegate class
captureVideoDelegate = new CaptureVideoDelegate(this);
// Create capture session
captureSession = new AVCaptureSession();
captureSession.SessionPreset = AVCaptureSession.Preset640x480;
// Create capture device
captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
// Create capture device input
NSError error;
captureDeviceInput = new AVCaptureDeviceInput(captureDevice, out error);
captureSession.AddInput(captureDeviceInput);
// Create capture device output
captureVideoOutput = new AVCaptureVideoDataOutput();
captureSession.AddOutput(captureVideoOutput);
captureVideoOutput.VideoSettings.PixelFormat = CVPixelFormatType.CV32BGRA;
captureVideoOutput.MinFrameDuration = new CMTime(1, 30);
//
// ISSUE 1
// In the original Objective-C code I was creating a dispatch_queue_t object, passing it to
// setSampleBufferDelegate:queue message and worked, here I could not find an equivalent to
// the queue mechanism. Also not sure if the delegate should be used like this).
//
captureVideoOutput.SetSampleBufferDelegatequeue(captureVideoDelegate, ???????);
// Create preview layer
previewLayer = AVCaptureVideoPreviewLayer.FromSession(captureSession);
previewLayer.Orientation = AVCaptureVideoOrientation.LandscapeRight;
//
// ISSUE 2:
// Didn't find any VideoGravity related enumeration in MonoTouch (not sure if string will work)
//
previewLayer.VideoGravity = "AVLayerVideoGravityResizeAspectFill";
previewLayer.Frame = new RectangleF(0, 0, 1024, 768);
this.View.Layer.AddSublayer(previewLayer);
// Start capture session
captureSession.StartRunning();
}
#endregion
public class CaptureVideoDelegate : AVCaptureVideoDataOutputSampleBufferDelegate
{
private VirtualDeckViewController mainViewController;
public CaptureVideoDelegate(VirtualDeckViewController viewController)
{
mainViewController = viewController;
}
public override void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
{
// TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
}
}
问题 1:不确定如何在 SetSampleBufferDelegatequeue 方法中正确使用委托(delegate)。也没有找到在 Objective-C 中工作正常的 dispatch_queue_t 对象的等效机制来传递第二个参数。
问题 2:我没有在 MonoTouch 库中找到任何 VideoGravity 枚举,不确定传递具有常量值的字符串是否有效。
我一直在寻找解决这个问题的线索,但周围没有明确的样本。非常感谢任何有关如何在 MonoTouch 中执行相同操作的示例或信息。
非常感谢。
最佳答案
这是我的代码。好好利用它。我只是删掉了重要的东西,所有的初始化都在那里,以及示例输出缓冲区的读取。
然后我有处理 CVImageBuffer 的代码形成链接的自定义 ObjC 库,如果您需要在 Monotouch 中处理它,那么您需要加倍努力并将其转换为 CGImage 或 UIImage。 Monotouch(AFAIK)中没有这个功能,所以你需要自己从普通的 ObjC 绑定(bind)它。 ObjC 中的示例在这里:how to convert a CVImageBufferRef to UIImage
public void InitCapture ()
{
try
{
// Setup the input
NSError error = new NSError ();
captureInput = new AVCaptureDeviceInput (AVCaptureDevice.DefaultDeviceWithMediaType (AVMediaType.Video), out error);
// Setup the output
captureOutput = new AVCaptureVideoDataOutput ();
captureOutput.AlwaysDiscardsLateVideoFrames = true;
captureOutput.SetSampleBufferDelegateAndQueue (avBufferDelegate, dispatchQueue);
captureOutput.MinFrameDuration = new CMTime (1, 10);
// Set the video output to store frame in BGRA (compatible across devices)
captureOutput.VideoSettings = new AVVideoSettings (CVPixelFormatType.CV32BGRA);
// Create a capture session
captureSession = new AVCaptureSession ();
captureSession.SessionPreset = AVCaptureSession.PresetMedium;
captureSession.AddInput (captureInput);
captureSession.AddOutput (captureOutput);
// Setup the preview layer
prevLayer = new AVCaptureVideoPreviewLayer (captureSession);
prevLayer.Frame = liveView.Bounds;
prevLayer.VideoGravity = "AVLayerVideoGravityResize"; // image may be slightly distorted, but red bar position will be accurate
liveView.Layer.AddSublayer (prevLayer);
StartLiveDecoding ();
}
catch (Exception ex)
{
Console.WriteLine (ex.ToString ());
}
}
public void DidOutputSampleBuffer (AVCaptureOutput captureOutput, MonoTouch.CoreMedia.CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
{
Console.WriteLine ("DidOutputSampleBuffer: enter");
if (isScanning)
{
CVImageBuffer imageBuffer = sampleBuffer.GetImageBuffer ();
Console.WriteLine ("DidOutputSampleBuffer: calling decode");
// NSLog(@"got image w=%d h=%d bpr=%d",CVPixelBufferGetWidth(imageBuffer), CVPixelBufferGetHeight(imageBuffer), CVPixelBufferGetBytesPerRow(imageBuffer));
// call the decoder
DecodeImage (imageBuffer);
}
else
{
Console.WriteLine ("DidOutputSampleBuffer: not scanning");
}
Console.WriteLine ("DidOutputSampleBuffer: quit");
}
关于ios - 使用 MonoTouch 在 iOS 中捕获视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953432/
在下图中,您可以看到在列表的 StyleStringElement 中,当快速滚动时标题呈现黑色。如果我旋转 ipad,列表会重新呈现并且没问题。 有变通办法吗? 最佳答案 不确定是什么问题,但之前已
如何将 UISegmentedControl 放入 MonoTouch.Dialog header 部分? 最佳答案 是的,您可以像操作任何常规 UIView 一样操作 Section 类的 Head
我正在使用 MonoTouch 构建一个 iPhone 应用程序,它从网络服务获取数据。 我遇到的麻烦是第一个屏幕显示了国家列表。当用户选择一个国家时,它应该只从网络服务中检索该选定国家的城市列表..
我正在使用 MonoTouch 开发一款仅限 iPad 的调查应用程序。使用 monotouch.dialog (mt.d),我发现构建这些界面可以很快,这太棒了。 但是...我还发现 mt.d 只能
我有一个标准 View ,顶部有一个导航栏。我还在它自己的源文件中设置了一个 Monotouch.Dialog。我四处寻找解决方案,但似乎找不到关于如何将 MTD 添加到普通 View 的明确答案。
我需要来自 monotouch-bindings 的 facebook api 包装器,所以我从 github 下载了 monotouch-bindings 的整个包. 我无法编译 facebook
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
到目前为止,我发现的所有关于在 iPad/iPhone 应用程序中使用 Sqlite 数据库的代码示例都使用脚本在应用程序部署后创建数据库。 但是是否可以在 monotouch 中创建数据库、构建结构
我的应用程序在 MT 3.0 中运行良好。现在,当我升级时。当按钮位于 ContentView 中时,我看到错误。单击按钮时会发生崩溃。代码: public override UITableViewC
我已经决定开始编写一个 iPhone 应用程序并且来自 c# 背景,我想我会开始使用单声道进行开发。 虽然这个问题可能是主观的,但我希望您能提供一些指导。 使用这项技术开发我的应用是否安全,或者我应该
每次我尝试部署我的项目时,都会收到以下错误: Compiling to native code /Developer/MonoTouch/usr/bin/mtouch -sdkroot "/Appli
下面的代码给出了警告: Warning CS0618: MonoTouch.Dialog.Section.Add(System.Collections.Generic.IEnumerable)' is
在我用 MonoDevelop (3.0.3.5) 创建的解决方案中,我有 3 个项目: 带 UI 的 MonoTouch 项目, 带有 iOS 特定代码的 MonoTouch 库项目, 具有域模型的
我已经用模拟器简单地试用了 MT,并决定在加入开发计划的同时购买它。程序似乎可以在模拟器上运行,但当部署到我的(运行 5.1 的最新型号)iPad 上时,程序会在运行时立即崩溃。这是在做任何事情之前!
我希望能够捕捉图像(或从照片库中选择图像)并使用 Monotouch 将其上传到远程服务器。我不确定如何获取和编码图像或如何上传图像,而且我很难找到相关说明。你能帮我开始吗?谢谢你。 最佳答案 您要找
我是一名 .NET 开发人员,试图跨入 Objective-C iPhone 编程。我创建了我的第一个应用程序 - 只是一个包含多个 xib 的简单组合。 我刚刚接触到 MonoTouch,它可以让您
当 iPhone 或 iPad 应用程序抛出错误时,建议使用 Monotouch 获取报告数据的方法是什么? 最佳答案 我只是使用 Console.WriteLine 和一个围绕它的小包装器,这可以帮
在 iPhone/iPod 上的 Monotouch 中,如何检测是否有可用的互联网连接? 最佳答案 现在最好的方法是使用 Miguel de Icaza 的 GitHub 存储库中的此类: http
众所周知,Apple does not provide automatic garbage collection on the iPhone to prolong battery life 。然而据报
MonoTouch 总是与 C# 一起提及。该框架和工具集实际上仅限于 C#,还是其他 CLR 语言(如 IronRuby 和 F#)也可以工作? 最佳答案 它不仅限于 C#,但运行其他语言有一些注意
我是一名优秀的程序员,十分优秀!