質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

解決済

Xamarin.Forms + iOSでカメラキャプチャした画像が表示されない。

ikarimame
ikarimame

総合スコア32

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

1回答

0リアクション

0クリップ

1749閲覧

投稿2020/10/19 11:57

困っていること

Xamarin.Forms+iOSでAVFoundationを使い画像をキャプチャしておりますが、画像が表示されずに困っております。

ソースコード

MainPage.xaml

xaml

<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="CameraTest.MainPage"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="64"/> <RowDefinition Height="*"/> <RowDefinition Height="64"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="64"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="64"/> </Grid.ColumnDefinitions> <Image Grid.Row="1" Grid.Column="1" Source="{Binding CapImg}"/> </Grid> </ContentPage>

MainPage.cs

C#

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; namespace CameraTest { public partial class MainPage : ContentPage { public MainPage() { BindingContext = new MainPageVM(); InitializeComponent(); } } }

MainPageVM.cs

c#

using System; using System.ComponentModel; using Xamarin.Forms; namespace CameraTest { public class MainPageVM : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void FirePropertyChangedEvent(string propname) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propname)); } } public MainPageVM() { if (CameraControl == null) CameraControl = DependencyService.Get<ICameraControl>(); CameraControl.Initialize(); CameraControl.CaptureCameraImage += CaptureCameraImage; CameraControl.CaptureStart(); } public static ICameraControl CameraControl { get; set; } private ImageSource _capimg = null; public ImageSource CapImg { get { return _capimg; } set { _capimg = value; FirePropertyChangedEvent("CapImg"); } } private bool CaptureCameraImage(ImageSource image) { CapImg = image; return true; } } }

ICameraControl.cs

c#

using System; using Xamarin.Forms; namespace CameraTest { public delegate bool CaptureCameraImageDelegate(ImageSource image); public interface ICameraControl { CaptureCameraImageDelegate CaptureCameraImage { get; set; } void Initialize(); bool CaptureStart(); bool CaptureStop(); } }

CameraTest.iOSプロジェクト

CameraControl_iOS.cs

c#

using System; using AVFoundation; using CoreFoundation; using CoreGraphics; using CoreMedia; using CoreVideo; using Foundation; using UIKit; using Xamarin.Forms; [assembly: Dependency(typeof(CameraTest.iOS.CameraControl_iOS))] namespace CameraTest.iOS { public class CameraControl_iOS : AVCaptureVideoDataOutputSampleBufferDelegate, ICameraControl { public CameraControl_iOS() { } private AVCaptureSession captureSession = null; public CaptureCameraImageDelegate CaptureCameraImage { get; set; } public bool CaptureStart() { if (captureSession == null) return false; captureSession.StartRunning(); return true; } public bool CaptureStop() { if (captureSession == null) return false; captureSession.StopRunning(); return true; } public void Initialize() { NSError error; captureSession = new AVCaptureSession(); captureSession.SessionPreset = AVCaptureSession.PresetHigh; var videoDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Video); if (videoDevice == null) throw new Exception("Video recording not supported on this device"); if (!videoDevice.LockForConfiguration(out error)) { Console.WriteLine(error.LocalizedDescription); videoDevice.UnlockForConfiguration(); return; } videoDevice.ActiveVideoMinFrameDuration = new CMTime(1, 30); videoDevice.UnlockForConfiguration(); // get input var input = AVCaptureDeviceInput.FromDevice(videoDevice); if (input == null) { // Error, report and abort Console.WriteLine("Unable to gain input from capture device."); return; } captureSession.AddInput(input); //foreach (var i in captureSession.Inputs) Console.WriteLine(i.ToString()); // crate output var output = new AVCaptureVideoDataOutput(); var settings = new AVVideoSettingsUncompressed(); settings.PixelFormatType = CVPixelFormatType.CV32BGRA; output.WeakVideoSettings = settings.Dictionary; var queue = new DispatchQueue("myQueue"); output.SetSampleBufferDelegateQueue(this, queue); captureSession.AddOutput(output); //foreach (var o in captureSession.Outputs) Console.WriteLine(o.ToString()); } public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) { try { if (CaptureCameraImage != null) { using (var image = GetImageFromSampleBuffer(sampleBuffer)) using (var stream = image.AsPNG().AsStream()) { var dst = ImageSource.FromStream(() => { return stream; }); CaptureCameraImage(dst); } } //base.DidOutputSampleBuffer(captureOutput, sampleBuffer, connection); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { sampleBuffer.Dispose(); } } private UIImage GetImageFromSampleBuffer(CMSampleBuffer sampleBuffer) { using (var pixelBuffer = sampleBuffer.GetImageBuffer() as CVPixelBuffer) { pixelBuffer.Lock(CVPixelBufferLock.None); CGBitmapFlags flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little; using (var cs = CGColorSpace.CreateDeviceRGB()) { using (var context = new CGBitmapContext(pixelBuffer.BaseAddress, pixelBuffer.Width, pixelBuffer.Height, 8, pixelBuffer.BytesPerRow, cs, flags)) { using (var cgImage = context.ToImage()) { pixelBuffer.Unlock(CVPixelBufferLock.None); return UIImage.FromImage(cgImage); } } } } } } }

試したこと

CameraControl_iOS.csのDidOutputSampleBuffer()のコードを以下のように変更すると表示されるのですが、その場合StreamをDisposeすることが出来ません。

c#

public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) { try { if (CaptureCameraImage != null) { using (var image = GetImageFromSampleBuffer(sampleBuffer)) { var stream = image.AsPNG().AsStream(); var dst = ImageSource.FromStream(() => { return stream; }); CaptureCameraImage(dst); } } //base.DidOutputSampleBuffer(captureOutput, sampleBuffer, connection); } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { sampleBuffer.Dispose(); } }

どのように実装すべきなのでしょうか?

環境

macOS Catalina v10.15.7
Visual Studio for mac v8.7.8(build 4)
Xcode v12.0.1(12A7300)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。